AWS CLI を用いて Amazon CloudWatch Logs ロググループのタグ値を一括変更してみた

AWS CLI を用いて Amazon CloudWatch Logs ロググループのタグ値を一括変更してみた

Clock Icon2024.10.25

AWS のタグエディタには対応していないリソースがあり、その 1 つが Amazon CloudWatch Logs ロググループです。ロググループに付与されている特定のタグの値を一括で変更したく、コマンドを検討したためブログにします。

ユースケースとしては、ABAC 用のタグの値を一括変更したい場合などがあります。少し特殊な方法ですが、ロググループの ABAC については次のブログでも紹介しています。

https://dev.classmethod.jp/articles/abac-in-amazon-cloudwatch-logs/

なお、タグエディタの対応リソースは次のドキュメントで確認できます。

CloudWatch Logs ロググループのタグ値の一括変更

次のコマンドで、キー名が TAG_KEY のタグ値を OLD_TAG_VALUE から NEW_TAG_VALUE に変更します。下記の変数の値の場合は、Project: aaaProject: zzz に変更します。

TAG_KEY="Project"
OLD_TAG_VALUE="aaa"
NEW_TAG_VALUE="zzz"
AWS_REGION="ap-northeast-1"
aws logs describe-log-groups --region "${AWS_REGION}" --query "logGroups[].[arn]" --output text \
| while read arn; do
  echo "### ${arn}"
  tag_value=$(aws logs list-tags-for-resource --resource-arn $(echo ${arn} | sed 's/:\*//') --query "tags.${TAG_KEY}" --output text)
  if [ ${tag_value} = ${OLD_TAG_VALUE} ]; then
    aws logs tag-resource --resource-arn $(echo ${arn} | sed 's/:\*//') --tags "${TAG_KEY}"="${NEW_TAG_VALUE}"
    echo "Updated \"${TAG_KEY}\" tag value from \"${OLD_TAG_VALUE}\" to \"${NEW_TAG_VALUE}\""
  else
    echo "No update \"${TAG_KEY}\" tag value"
  fi
done

コマンドの実行結果例

下表のテスト用データに対してコマンドを実行してみます。

CloudWatch ロググループ Project タグ
/test/abac/log-01 Project: aaa
/test/abac/log-02 Project: aaa
/test/abac/log-03 Project: bbb
/test/abac/log-04 Project: bbb
/test/abac/log-05 タグなし

コマンドの実行結果例です。タグ値を変更したロググループは Updated "Project" tag value from "aaa" to "zzz" と出力され、タグ値を変更していないロググループは No update "Project" tag value と出力されています。

$ TAG_KEY="Project"
$ OLD_TAG_VALUE="aaa"
$ NEW_TAG_VALUE="zzz"
$ AWS_REGION="ap-northeast-1"
$ aws logs describe-log-groups --region "${AWS_REGION}" --query "logGroups[].[arn]" --output text \
> | while read arn; do
>   echo "### ${arn}"
>   tag_value=$(aws logs list-tags-for-resource --resource-arn $(echo ${arn} | sed 's/:\*//') --query "tags.${TAG_KEY}" --output text)
>   if [ ${tag_value} = ${OLD_TAG_VALUE} ]; then
>     aws logs tag-resource --resource-arn $(echo ${arn} | sed 's/:\*//') --tags "${TAG_KEY}"="${NEW_TAG_VALUE}"
>     echo "Updated \"${TAG_KEY}\" tag value from \"${OLD_TAG_VALUE}\" to \"${NEW_TAG_VALUE}\""
>   else
>     echo "No update \"${TAG_KEY}\" tag value"
>   fi
> done
### arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-01:*
Updated "Project" tag value from "aaa" to "zzz"
### arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-02:*
Updated "Project" tag value from "aaa" to "zzz"
### arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-03:*
No update "Project" tag value
### arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-04:*
No update "Project" tag value
### arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-05:*
No update "Project" tag value

タグ値が変更されたロググループと変更されていないロググループを確認した結果をいくつか掲載します。

タグ値が変更された /test/abac/log-01 の確認結果です。zzz に変更されています。

$ aws logs list-tags-for-resource --resource-arn arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-01
{
    "tags": {
        "Project": "zzz"
    }
}

タグ値が変更されていない /test/abac/log-03 の確認結果です。bbb のままです。

$ aws logs list-tags-for-resource --resource-arn arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-03
{
    "tags": {
        "Project": "bbb"
    }
}

指定したタグが存在していなかった /test/abac/log-05 の確認結果です。タグなしのままです。

$ aws logs list-tags-for-resource --resource-arn arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-05
{
    "tags": {}
}

コマンドの実行内容

コマンドの実行内容は次の流れとなります。

  • ロググループの一覧を取得
  • 各ロググループに対して TAG_KEY タグの値を確認
  • TAG_KEY タグの値が OLD_TAG_VALUE の場合は NEW_TAG_VALUE に変更

describe-log-groupsコマンドで取得した ARN は最後に :* が付与されており、このまま list-tags-for-resource コマンドで指定するとエラーとなります。

arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-01:*

そのため、タグ関連のコマンドを実行するときは sed コマンドで :* を除外しています。

テスト用ロググループを作成するコマンド

参考情報として今回のテスト用に用意していたロググループを作成するコマンドを掲載します。

aws logs create-log-group \
  --log-group-name /test/abac/log-01 \
  --tags Project=aaa
aws logs create-log-group \
  --log-group-name /test/abac/log-02 \
  --tags Project=aaa
aws logs create-log-group \
  --log-group-name /test/abac/log-03 \
  --tags Project=bbb
aws logs create-log-group \
  --log-group-name /test/abac/log-04 \
  --tags Project=bbb
aws logs create-log-group \
  --log-group-name /test/abac/log-05

さいごに

タグエディタが対応していないリソースの 1 つである Amazon CloudWatch Logs ロググループのタグ値を一括変更したく、AWS CLI を用いて試してみました。なお、タグエディタに対応しているリソースは簡単に一括変更ができます。

https://dev.classmethod.jp/articles/modify-cost-allocation-tags-in-tag-editor/

以上、このブログがどなたかのご参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.