文字列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制限
- コスト削減設定
コメント