AWS Codebuildのコンテナイメージ”ARM64″を利用する際にAWS CLIの注意点

こんにちは、クラウドソリューション事業部の本田です。GWも明けて徐々に仕事モードに切り替わってきたのではないでしょうか?私は7連休でゆっくりしておりました。ということで、GW明け1発目のブログ投稿となります。

AWS Codebuildは、デプロイ作業だけでなく指定した時間にバッチ処理を行ったり、cron的な使い方をすることがあると思います。またその際にAWS CLIを使って、EC2やRDSの情報を取得してきたりすることがあるかと思います。直近で取得したい情報があるのに、AWS CLIで取得できない。。。ということがあったので原因と対応方法についてまとめたいと思います。

取得したい情報が取れなかった

ある案件でデプロイ時にECSのタスクの情報を取得し、それをjsonに出力後に整形し、taskdef.jsonとして作成するということをやりたかったのですが、本来出るはずのruntimeplatformの情報が出てきませんでした。ECSをARM64で動かしたいので、その場合はruntimeplatformでARM64を指定する必要があるのですが、元々ARM64で動かしているのにAWS CLIで取得しようとしても、出力結果にruntimeplatformが出てきませんでした。ちなみにAWS CLIのコマンドリファレンスには記載があるので取得できるはずです。https://docs.aws.amazon.com/cli/latest/reference/ecs/describe-task-definition.html

原因を探る

一旦Cloudshell内でAWS CLIを実行して結果がどうなるか確かめてみました。そうするとruntimeplatformはしっかりと出てきました。また稼働していたEC2から実行しても取得することができました。

答え

あっさりとではあったのですが、このような上記のような結果になったのはAWS CLIのバージョンが影響していました。今回Codebuildで使っていたイメージは、amazonlinux2-aarch64-standard:2.0-21.10.15というイメージで、このイメージでデフォルトで使用されるAWS CLIのバージョンは、1.20.58 であり少し前のバージョンであることがわかります。CloudshellではそもそもV2でしたし、EC2では1.24.1のバージョンを使っていました。原因もわかったので、早速対応して行きます。

対応方法

AWS CLIのバージョンが原因でしたので、対応としてはバージョンを変更するということになります。V2を使えるようにするか、V1を最新化するという2つの方法がありますので、どちらかで対応します。

V2を使えるようにする

buidspecに書く一部の内容を抜粋しています。

version: 0.2
 phases:
   build:
     commands:
        - curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
        - unzip awscliv2.zip
        - ./aws/install
        - /usr/local/bin/aws --version

AWS CLIがV2(2.7.0)になっています。

V1を最新化する

version: 0.2
phases:
    build:
      commands:
         - pip3 install --upgrade --user awscli
         - export PATH=$HOME/.local/bin:$PATH
         - aws --version

AWS CLIがV1(1.24.1)で最新化されています。

ちなみに先ほど取りたかったruntimeplatformは以下のように取得できるようになりました。めでたしめでたし。

注意点

今回AWS CodebuildのコンテナイメージとしてAmazon Linux2のARM64の最新イメージを使用しており、現時点ではこちらのコンテナイメージではAWS CLIのデフォルトバージョンが1.20.58 だったことを確認しています。コンテナイメージによってはデフォルトでV2が入っていたりしますので、利用されるコンテナイメージによってAWS CLIで取得したい情報が取得できないなどあれば、一度AWS CLIのバージョンを確認されるのが良いかと思います。