AWS CLI を用いて Amazon CloudWatch Logs ロググループのタグ値を一括変更してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS のタグエディタには対応していないリソースがあり、その 1 つが Amazon CloudWatch Logs ロググループです。ロググループに付与されている特定のタグの値を一括で変更したく、コマンドを検討したためブログにします。
ユースケースとしては、ABAC 用のタグの値を一括変更したい場合などがあります。少し特殊な方法ですが、ロググループの ABAC については次のブログでも紹介しています。
なお、タグエディタの対応リソースは次のドキュメントで確認できます。
CloudWatch Logs ロググループのタグ値の一括変更
次のコマンドで、キー名が TAG_KEY のタグ値を OLD_TAG_VALUE から NEW_TAG_VALUE に変更します。下記の変数の値の場合は、Project: aaa を Project: 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 を用いて試してみました。なお、タグエディタに対応しているリソースは簡単に一括変更ができます。
以上、このブログがどなたかのご参考になれば幸いです。






