はじめに

コスト配分タグを利用すると Cost Explorer や Budgets 等のコスト関連機能でリソースに付与されたリソースタグ毎にコストを分類することができます。コスト配分タグを利用するためには、対象リソースに予めリソースタグを設定する必要があります。リソースタグの設定確認方法としては、下記機能の利用が考えられますが、いずれも微妙に痒いところに手が届かないです。

  • AWS Config: required-tags で対象リソースに指定タグが設定されているか確認することができるが、一部リソースタイプしか対応していない。
  • タグエディタ: Default Parameter Group 等も含まれるため、検索ノイズが多い

その他の方法として、Cost Explorer のリソースレベルの詳細度を利用したリソースタグ設定状況の確認方法を紹介します。

事前作業

コスト配分タグの有効化

事前にコスト配分タグを有効化します。
コスト配分タグの有効化とリソースに設定したタグが Cost Explorer へ反映されるまでには最大で1日程度の時間を要します。
また、Organizations 環境下では Payer アカウントからのみ有効化可能となります。

リソースレベルの詳細度の有効化

Cost Explorer リソースレベルの詳細度の利用は事前に機能を有効化する必要があります。
コスト管理の設定より、日単位の詳細度のリソースレベルのデータを有効化します。
Organizations 環境下では Payer アカウントからのみ有効化可能となります。

機能の有効化には最大48時間かかるためご注意ください。
また、3ヶ月間対象データにアクセスが無いと、自動的に機能が無効化されるという制限事項があります。

コスト配分タグ付与状況の確認

単一コスト配分タグの確認

マネジメントコンソール

Cost Explorer にて、コスト配分タグの設定有無を確認します。
Cost Explorer のレポートパラメータにて下記条件を設定することで、対象コスト配分タグが設定されていないリソースを検索することができます。

パラメータ 設定値
時刻 日別
グループ化の条件 – ディメンション リソース
フィルター – タグ <対象タグ>
フィルター – タグ – <対象タグ> Include: タグキーがありません

実行結果

グラフやリソース内訳より、対象タグ未設定のリソースが表示されます。

AWS CLI

AWS CLI でも実行可能です。
フィルター用に下記 JSON を用意します

filter.json

{
  "And": [
    {
      "Dimensions": {
        "Key": "REGION",
        "Values": ["ap-northeast-1"]
      }
    },
    {
      "Tags": {
        "Key": "Environment",
        "MatchOptions": ["ABSENT"]
      }
    }
  ]
}

JMESPath では重複データの集約ができないため、Shell の sort -u にて重複削除します。

実行コマンド

aws ce get-cost-and-usage-with-resources \
  --time-period Start=2024-07-05,End=2024-07-06 \
  --granularity DAILY \
  --group-by Type=DIMENSION,Key=RESOURCE_ID \
  --metrics "BlendedCost" "UnblendedCost" \
  --filter file://filter.json \
  --query 'ResultsByTime[].Groups[].Keys[] | join(`"\n"`, @)' \
  --output text |sort -u

実行結果

NoResourceId
arn:aws:athena:ap-northeast-1:123456789012:workgroup/test-workgroup
arn:aws:ec2:ap-northeast-1:123456789012:network-interface/eni-xxxxxxxxxxxxxxxxx
arn:aws:ec2:ap-northeast-1:123456789012:network-interface/eni-xxxxxxxxxxxxxxxxx
arn:aws:kms:ap-northeast-1:123456789012:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
s3-xxxxxxxx-ap-northeast-1
vol-xxxxxxxxxxxxxxxxx
vol-xxxxxxxxxxxxxxxxx

複数コスト配分タグの確認

マネジメントコンソール

複数のタグキーのいずれかが設定されていないことを確認したい場合は、Exclude にて「タグキーがありません」以外の全てのタグ値を設定することで検索可能です。

パラメータ 設定値
時刻 日別
グループ化の条件 – ディメンション リソース
フィルター – タグ <対象タグ1>, <対象タグ2>
フィルター – タグ – <対象タグ1> Exlude: タグキーがありません以外の全てのキー値
フィルター – タグ – <対象タグ2> Exlude: タグキーがありません以外の全てのキー値

AWS CLI

CLI の場合は、AND と OR を組み合わせることができるため、より簡単に条件指定が可能です。

filter2.json

{
  "And": [
    {
      "Dimensions": {
        "Key": "REGION",
        "Values": ["ap-northeast-1"]
      }
    },
    {
      "Or": [
        {
          "Tags": {
            "Key": "Owner",
            "MatchOptions": ["ABSENT"]
          }
        },
        {
          "Tags": {
            "Key": "Environment",
            "MatchOptions": ["ABSENT"]
          }
        }
      ]
    }
  ]
}

実行コマンド

aws ce get-cost-and-usage-with-resources \
  --time-period Start=2024-07-05,End=2024-07-06 \
  --granularity DAILY \
  --group-by Type=DIMENSION,Key=RESOURCE_ID \
  --metrics "BlendedCost" "UnblendedCost" \
  --filter file://filter2.json \
  --query 'ResultsByTime[].Groups[].Keys[] | join(`"\n"`, @)' \
  --output text |sort -u

実行結果

NoResourceId
arn:aws:athena:ap-northeast-1:123456789012:workgroup/test-workgroup
arn:aws:ec2:ap-northeast-1:123456789012:instance/i-xxxxxxxxxxxxxxxxx
arn:aws:ec2:ap-northeast-1:123456789012:instance/i-xxxxxxxxxxxxxxxxx
arn:aws:ec2:ap-northeast-1:123456789012:network-interface/eni-xxxxxxxxxxxxxxxxx
arn:aws:ec2:ap-northeast-1:123456789012:network-interface/eni-xxxxxxxxxxxxxxxxx
arn:aws:kms:ap-northeast-1:123456789012:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
s3-xxxxxxxx-ap-northeast-1
vol-xxxxxxxxxxxxxxxxx
vol-xxxxxxxxxxxxxxxxx

注意事項

こちらの方法で対応できるのは、あくまでコスト配分タグのみとなります。