AWS CLI で特定のタグが付与されていないリソースを取得する方法

2024.01.24

困っていた内容

Q. AWS CLI コマンド aws resourcegroupstaggingapi get-resources で「特定のタグが付与されていない」リソースを取得する方法はありますか。「特定のタグが付与されている」条件との併用方法も知りたいです。

どう対応すればいいの?

A. aws resourcegroupstaggingapi get-resources コマンドに --tag-filters オプションを使用することで、特定のタグキーと値に基づいてリソースをフィルタリングできますが、特定のタグが付与されていないリソースを直接フィルタリングすることはできません。そのため、まずは条件に一致するリソースを取得し、その後で指定のタグが付与されていないリソースをスクリプトやプログラムで別途除外する必要があります。

やってみた

例えば、「タグキーに Name が付与されている」かつ「タグキーに Environment が付与されていない」リソースを取得してみます。

1. Name タグが付与されているリソースを取得します

まず、Name タグが付与されているリソースを取得するコマンドは以下のようになります。

aws resourcegroupstaggingapi get-resources --tag-filters Key=Name --region ap-northeast-1

このコマンドは、Name タグが付与されているすべてのリソースのリストを返します。

ちなみに、特定のタグが付与された AWS リソース一覧を取得する方法については、以下のエントリで詳しく紹介されています。

2. 取得したリソースのリストから、Environment タグが付与されているものを除外します

例えば jq コマンドで処理する場合は以下のようになります。

aws resourcegroupstaggingapi get-resources --tag-filters Key=Name --region ap-northeast-1 --output json | jq '.ResourceTagMappingList | map(select(.Tags | all(.Key != "Environment")))'

処理としては、前項 1 で取得した出力の中の ResourceTagMappingList プロパティにアクセスし、リソースタグの中で全てのタグのキーが "Environment" でない条件に一致する要素のみを選択して返すようにしています。

最終的に出力される結果は以下のように "Name" タグが付いているが "Environment" タグが付いていないリソースの一覧になります。

{
    "ResourceTagMappingList": [
        {
            "ResourceARN": "arn:aws:ec2:ap-northeast-1:012345678910:instance/i-xxxxxxxxxxxxxxxxx",
            "Tags": [
                {
                    "Key": "Owner",
                    "Value": "hoge"
                },
                {
                    "Key": "Name",
                    "Value": "test-instance"
                }
            ]
        }
    ]
}

参考情報