削除したEC2インスタンスに付与されていたタグを知りたい

削除したEC2インスタンスの情報はAWS Configから取得可能です。今回はタグに絞って紹介します。
2022.04.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

EC2 インスタンスに付与されているタグを検索したいケースがあります。
現存するインスタンスであればマネジメントコンソールから検索可能です。
しかし、削除 (terminate) してしまったインスタンスのタグを知りたいケースではどうしたらいいでしょうか。

今回は AWS Config と Athena を使って削除したインスタンスのタグを検索したいと思います。

S3 バケット作成

本エントリでは2つの S3 バケットを作成します。

  • AWS Config 設定履歴保管用
    • aws-config-history-accountid-region など識別しやすい名称がお勧め
  • Athena クエリ結果の保管用
    • aws-athena-query-accountid-region など識別しやすい名称がお勧め

S3 バケット作成手順はすでに一般的だと思いますので割愛します。

AWS Config 設定

AWS Config で記録を有効化します。
指定した AWS リソースの構成履歴を記録、及び、S3 へ保管するようにします。

  1. マネジメントコンソールで AWS Config を開く
  2. 左ペインから 設定 をクリック
  3. 編集 ボタンをクリック
  4. 設定の編集画面で
    1. 記録を有効化 にチェックを入れる
    2. 「このリージョンでサポートされているすべてのリソースを記録します」にチェック、または、「特定のリソースタイプを記録する」で 「AWS EC2 Instance」を選択する
    3. 「アカウントからバケットを選択」にチェック、前の手順で作成した S3 バケットを指定
  5. 保存ボタンをクリック

履歴ファイルの確認

前の手順で AWS Config を設定すると S3 バケットにファイルが作成されるはずです。確認してみました。
※ AWS Config から S3 へは6時間周期に出力なのでファイルが無い場合は最大6時間お待ちください。

S3バケット名/AWSLogs/AWS_ACCOUNT_ID/Config/AWS_REGION/yyyy/mm/dd/ConfigHistory/ をマネジメントコンソールで開きます。

Athena 初期設定

Athena ではクエリ結果を S3 へ保管することが可能です。
初めて Athena を使う場合にはこの設定をします。

  1. マネジメントコンソールで Athena を開く
  2. 左ペインから クエリエディタ をクリック
  3. 設定 タブを開き、管理 ボタンをクリック
  4. S3 バケットを指定する (athena-query-accountid などの分かりやすいバケットを予め作っておく)
  5. 保存ボタンをクリック

Athena テーブル作成

S3 に保管した AWS Config 履歴情報をクエリするためのテーブルを作成します。
Athena 画面のクエリエディタ → エディタ から以下の CREATE 文をコピー&ペーストして実行します。

以下3項目はご自身の環境に合わせて変更ください。

  • BUCKET_NAME
  • AWS_ACCOUNT_ID
  • AWS_REGION
CREATE EXTERNAL TABLE default.awsconfig (
         fileversion string,
         configSnapshotId string,
         configurationitems ARRAY < STRUCT < 
         tags: MAP < STRING, STRING >,
         configurationItemVersion : STRING,
         configurationItemCaptureTime : STRING,
         configurationStateId : BIGINT,
         awsAccountId : STRING,
         configurationItemStatus : STRING,
         resourceType : STRING,
         resourceId : STRING,
         resourceName : STRING,
         ARN : STRING,
         awsRegion : STRING,
         availabilityZone : STRING,
         configurationStateMd5Hash : STRING,
         resourceCreationTime : STRING > > 
) 
PARTITIONED BY (`year` string,`month` string,`day` string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://BUCKET_NAME/AWSLogs/AWS_ACCOUNT_ID/Config/AWS_REGION/'
TBLPROPERTIES (
  'projection.enabled'='true', 
  'projection.year.interval'='1', 
  'projection.year.range'='2021,2121', 
  'projection.year.type'='integer', 
  'projection.month.interval'='1', 
  'projection.month.range'='1,12', 
  'projection.month.type'='integer', 
  'projection.day.interval'='1', 
  'projection.day.range'='1,31', 
  'projection.day.type'='integer', 
  'storage.location.template'='s3://BUCKET_NAME/AWSLogs/AWS_ACCOUNT_ID/Config/AWS_REGION/${year}/${month}/${day}/ConfigHistory/')

Athena クエリ

テーブルを作成したら以下のクエリを実行します。

3行目の「YOUR_TAG」は検索したいタグに置き換えてください。
9行目の「year」は検索したい西暦に置き換えてください。(注1)
10行目の「month」は検索したい月に置き換えてください。(注1)
(注1) Athena 利用料金の抑制、検索時間の短縮のために可能な限り year,month を指定ください。

SELECT 
  configurationItem.resourceid,
  configurationItem.tags['YOUR_TAG'] as YOUR_TAG,
  configurationItem.configurationitemcapturetime,
  configurationItem.configurationItemStatus
FROM "default"."awsconfig"
  CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
WHERE 
  year = '2022'
  and month = '4'
  and configurationItem.resourceType = 'AWS::EC2::Instance'
order by resourceid, configurationitemcapturetime
;

すべてのタグ

すべてのタグを表示したい場合はこちらです。

SELECT 
  configurationItem.resourceid,
  configurationItem.tags,
  configurationItem.configurationitemcapturetime,
  configurationItem.configurationItemStatus
FROM "default"."awsconfig"
  CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
WHERE 
  year = '2022'
  and month = '4'
  and configurationItem.resourceType = 'AWS::EC2::Instance'
order by resourceid, configurationitemcapturetime
;

参考

1 か月あたりに記録された設定項目の数を取得して、AWS Config の請求を理解する方法を教えてください。
Identifying resources with the most configuration changes using AWS Config
How to query your AWS resource configuration states using AWS Config and Amazon Athena
Amazon S3 バケットへの設定スナップショットの配信

以上、吉井 亮 がお届けしました。