【AWS CLI】AWS CLIのQueryオプションを使ってリリース対象のECRイメージ一覧を取得してみました (jqでも比較しました)

はじめに

こんにちは、AI・IoTサービス開発部のがんがんこと岩丸です。 2年目の夏が到来し毎日暑さと格闘しております。少し気温の下がった夜のお散歩とサウナに入るのが日々の楽しみです。

前回の記事ではGitLab Runnerのinclude機能を用いてCI/CD改善を行いました。もしお時間ある方は合わせてご覧ください。

tech-blog.optim.co.jp

今回はAWS CLIのQueryオプションを用いてリリース対象のECRイメージ一覧を取得してみました。普段jq芸人をやっているので「jqとQueryオプションはどちらが手軽なのか」についても合わせて実験してみました。

目次

実現したいこと

OPTiM AI Cameraチームでは、リリース時にリリース用イメージが準備されているか確認します。この確認作業を従来はAWSコンソールから対象のECRリポジトリを開いて適宜確認していました。 イメージ数が多くない場合は直接確認で問題ありませんがイメージ数が増えてくるにつれて手順の準備・確認が少し手間になりました。

あまり大きな手間ではありませんが作業の効率化・手順の簡略化の観点からAWS CLIを利用した方がより楽になると考えました。そこでリリース対象のECRイメージ一覧を取得するスクリプトを実装しました。

スクリプトと実行結果

結果だけみたいという方向けにスクリプトと実行結果を先に示します。

Queryオプションを用いたスクリプト

公式ドキュメントを読むとクライアント側のフィルタリングとしてJMESPath 構文を採用しています。 下記のスクリプトではstarts_withというBuilt-in関数を使用しています。

TARGET=0.27.2
repos=$(aws ecr describe-repositories --output text --query "sort(repositories[?starts_with(repositoryName,\`optim-ai-camera-\`)].repositoryName)")

for repo in $repos; do
  target=$(aws ecr list-images --repository-name $repo --output text --query "imageIds[?imageTag==\`$TARGET\`].imageTag")
  # NOTE: 該当タグが存在しないときは表示しない
  if [ `echo $target | grep $TARGET` ]; then
    echo $repo: $target
  fi
done

Built-in関数のcontainsを用いると以下のように実装できます。

TARGET=0.27.2
repos=$(aws ecr describe-repositories --output text --query "sort(repositories[?contains(repositoryName,\`optim-ai-camera-\`)].repositoryName)")

for repo in $repos; do
  target=$(aws ecr list-images --repository-name $repo --output text --query "imageIds[?imageTag==\`$TARGET\`].imageTag")
  if [ `echo $target | grep $TARGET` ]; then
    echo $repo: $target
  fi
done

jqでも試してみた

json加工といえばみんな大好きjqです。jqでの実験結果は以下の通りです。感想ですがQueryオプションの方がなんとなくシンプルですね。

TARGET=0.27.2
repos=`aws ecr describe-repositories --output json | jq -r '.repositories[] | select(.repositoryName | test("^optim-ai-camera-")) | .repositoryName'`

for repo in $repos; do
  aws ecr list-images --repository-name $repo --output json \
    | jq -r --arg repository $repo --arg searchImageTag $TARGET \
    '.imageIds[] | .result = select(.imageTag == $searchImageTag) | [$repository, .result.imageTag] | @tsv'
done

結果

optim-ai-camera-frontend: 0.27.2
optim-ai-camera-backend: 0.27.2
optim-ai-camera-xxxxxxxx: 0.27.2
optim-ai-camera-yyyyyyyy: 0.27.2
optim-ai-camera-zzzzzzzz: 0.27.2
...

対象リポジトリのタグ一覧を取得する: list-images

ecr list-imagesコマンドは指定したリポジトリのイメージ情報を取得することができます。

$aws ecr list-images --repository-name optim-ai-camera-frontend --output json
{
  "imageIds": [
    {
      "imageDigest": "sha256:XXXXXX",
      "imageTag": "0.27.2"
    },
    {
      "imageDigest": "sha256:YYYYYY",
      "imageTag": "0.27.1"
    },
    {
      "imageDigest": "sha256:ZZZZZZ",
      "imageTag": "0.27.0"
    },
    ...
}

今回はリリース対象のタグが付与されたイメージが存在するか確認したいので--query "imageIds[?imageTag==\`$target_image_tag\`].imageTag")で出力を絞ります。

$ aws ecr list-images --repository-name optim-ai-camera-frontend --output json --query "imageIds[?imageTag==\`0.27.2\`].imageTag"
[
    "0.27.2"
]

リポジトリ一覧取得する: describe-repositories

ecr describe-repositoriesコマンドはリポジトリの一覧情報を取得することができます。ecr list-imagesコマンドはリポジトリを指定しないとイメージタグ一覧を取得できないためecr describe-repositoriesでリポジトリ一覧を取得します。

$ aws ecr describe-repositories --output json
{
    "repositories": [
        {
            "repositoryArn": "arn:aws:ecr:ap-northeast-1: xxxxxxxxxxxx:repository/repositoryA",
            "registryId": "xxxxxxxxxxxx",
            "repositoryName": "repositoryA",
            "repositoryUri": "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/repositoryA",
            "imageTagMutability": "MUTABLE",
            "imageScanningConfiguration": {
                "scanOnPush": true
            }
        },
        {
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:yyyyyyyyyyyy:repository/repositoryB",
            "registryId": "yyyyyyyyyyyy",
            "repositoryName": "repositoryB",
            "repositoryUri": "yyyyyyyyyyyy.dkr.ecr.ap-northeast-1.amazonaws.com/repositoryB",
            "imageTagMutability": "MUTABLE",
            "imageScanningConfiguration": {
                "scanOnPush": true
            },
        },
        {
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:zzzzzzzzzzzz:repository/repositoryC",
            "registryId": "zzzzzzzzzzzz",
            "repositoryName": "repositoryC",
            "repositoryUri": "zzzzzzzzzzzz.dkr.ecr.ap-northeast-1.amazonaws.com/repositoryC",
            "imageTagMutability": "MUTABLE",
            "imageScanningConfiguration": {
                "scanOnPush": true
            },
        },
        ...
  ]
}

今回はOPTiM AI Cameraに関連するリポジトリ一覧がほしいので、repositoryNameoptim-ai-camera-のprefixで条件を絞ります。

$ aws ecr describe-repositories --output json --query "sort(repositories[?starts_with(repositoryName,\`optim-ai-camera-\`)].repositoryName)"
[
    "optim-ai-camera-backend",
    "optim-ai-camera-frontend",
    "optim-ai-camera-xxxxxxxx",
    "optim-ai-camera-yyyyyyyy",
    "optim-ai-camera-zzzzzzzz",
    ...
]

おわりに

今回はAWS CLIのQueryオプションを用いてリリース対象のECRイメージ一覧を取得してみました。jqと合わせて比較してみましたが、追加インストール不要という点も踏まえてAWS CLIの加工はQueryオプションを用いた方が便利かもしれませんね。


そんなOPTiMでは運用改善やDevOpsに興味があるエンジニア、新卒からどんどんチャレンジしていきたいエンジニア学生を随時募集しております。少しでもご興味のある方はこちらも合わせてご覧ください。

www.optim.co.jp