AWS ECS 調査方法(コマンド)

AWS

文字列text-prdが含むECS を調査

text-prdを含むリポジトリを全部対象にして describe-images を実行したい場合は、まずリポジトリ一覧を取得して grep / query で絞る → ループします。

方法①(よく使う:grep + for)

aws ecr describe-repositories \
--query "repositories[*].repositoryName" \
--output text | tr '\t' '\n' | grep text-prd

これで

app-text-prd
backend-text-prd
text-prd-batch

のように出ます。

次に ループ実行

for repo in $(aws ecr describe-repositories \
--query "repositories[*].repositoryName" \
--output text | tr '\t' '\n' | grep text-prd); do echo "===== $repo ====="
aws ecr describe-images \
--repository-name $repo \
--query 'imageDetails[*].[imageTags,imagePushedAt]' \
--output tabledone

出力例

===== app-text-prd =====
----------------------------------------
| describe-images |
+------------------+-------------------+
| ["latest"] | 2025-02-10T10:00 |
| ["v1.2.0"] | 2025-01-12T08:00 |===== batch-text-prd =====
...

方法②(AWS CLIだけでfilter)

AWS CLIのqueryだけでも可能です。

aws ecr describe-repositories \
--query "repositories[?contains(repositoryName, 'text-prd')].repositoryName" \
--output text

結果

app-text-prd
text-prd-batch

方法③(1行で全部確認)

for repo in $(aws ecr describe-repositories \
--query "repositories[?contains(repositoryName,'text-prd')].repositoryName" \
--output text); do
echo "===== $repo ====="
aws ecr describe-images \
--repository-name $repo \
--query 'imageDetails[*].[imageTags,imagePushedAt]' \
--output table
done

おすすめ(実務)

私はだいたい この形で使います

aws ecr describe-repositories \
--query "repositories[?contains(repositoryName,'prd')].repositoryName" \
--output text

理由

  • dev
  • stg
  • prd

環境ごとに検索できるからです。

① ECR容量ランキング(大きい順)

どのリポジトリが容量を使っているか確認します。

for repo in $(aws ecr describe-repositories \
--query "repositories[*].repositoryName" \
--output text); dosize=$(aws ecr describe-images \
--repository-name $repo \
--query "sum(imageDetails[*].imageSizeInBytes)" \
--output text)echo "$repo $size"done | sort -k2 -nr

出力例

backend-prd        5230000000
batch-prd 4100000000
frontend-prd 950000000

GB表示したい場合

echo "$repo $(($size/1024/1024/1024))GB"

📌 容量課金の犯人がすぐ分かります


② 90日以上使われてないイメージ

Push日時で判断します。

aws ecr describe-repositories \
--query "repositories[*].repositoryName" \
--output text | tr '\t' '\n' | while read repo
do
aws ecr describe-images \
--repository-name $repo \
--query 'imageDetails[?imagePushedAt<=`'"$(date -d '90 days ago' -Iseconds)"'`].[imageTags,imagePushedAt]' \
--output tabledone

出力例

["v1.0.0"]    2024-10-10
["old"] 2024-09-01

📌
削除候補になります。


③ 未使用イメージ(タグなし)

タグがないものは CI/CDのゴミイメージであることが多いです。

aws ecr describe-repositories \
--query "repositories[*].repositoryName" \
--output text | tr '\t' '\n' | while read repo
do
echo "===== $repo =====" aws ecr describe-images \
--repository-name $repo \
--query 'imageDetails[?imageTags==null].imageDigest' \
--output textdone

===== backend-prd =====
sha256:123456abc
sha256:987654def

削除する場合

aws ecr batch-delete-image \
--repository-name backend-prd \
--image-ids imageDigest=sha256:xxxxx

⭐おすすめ運用(かなり重要)

ECRでは Lifecycle Policy を設定するのがベストです。

最新10個だけ残す
90日以上削除
untagged削除

例ポリシー

{
"rules": [
{
"rulePriority": 1,
"description": "keep last 10 images",
"selection": {
"tagStatus": "tagged",
"countType": "imageCountMoreThan",
"countNumber": 10
},
"action": {
"type": "expire"
}
}
]
}

⭐実務で一番使う神コマンド

全ECR容量を一発確認

aws ecr describe-images \
--repository-name <repo> \
--query "sum(imageDetails[*].imageSizeInBytes)"

もしよければですが、
ECR運用でエンジニアが必ず入れる設定があります。

  • Lifecycle Policy(自動削除)
  • Image Scan
  • Pull制限
  • コスト削減設定

コメント