「このパラメータストア、誰が使ってるん?」の疑問を解消するための CloudTrail とAthena の使い方

AWSリソースの"こんまりメソッド"シリーズになりつつある。
2020.02.18

「あれ。。このパラメータストア、誰が使ってるんだっけ。」

(なんか最近読んだような入り方ですが…) 今回、SSM パラメータストアを整理する機会がありましたが、使ってるのか、使ってないのか判断に迷うところがあったので、CloudTrail と Athena を使って調査した方法をまとめます。

まず CloudTrail だけでやってみる

CloudTrail のイベント履歴を開き、[イベント名] [GetParameters] で検索してやると、パラメータストアを取得した履歴が表示されます。

ただ、これだとどのパラメータを GetParameters したのか判りません。ここから [イベントの表示] をクリックすると、以下のような詳細が表示され、はじめてパラメータストアの名前が判別できます。

正直、これを1件、1件やっていくのは無理ですよね。そうなると、Athena でサクッと検索したくなりますよね

Athena でクエリを実行

CloudTrail ログを Athena に取り込む

CloudTrail ログを Athena に取り込むのは非常に簡単です。CloudTrail のイベント履歴を開き、画面上部のリンクをクリックするだけです。

テーブル作成の画面が開きますので、CloudTrail ログを保存している S3 バケットを選択します。

保存している CloudTrail ログをすべて取り込んでよければ、このまま [テーブル作成] をクリックします。 が、全部の期間はログが多いし欲しくない、というときは、一旦このクエリをコピペして置いておきます。

次に、Athena の管理コンソールを開きます。テーブルを取り込みたいデータベースを選択し(今回は default)、先ほどのクエリを貼り付けます。

次に、クエリの下部に以下のような行があるかと思います。

COMMENT 'CloudTrail table for <YOUR_BUCKET_NAME> bucket'
ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://<YOUR_BUCKET_NAME>/AWSLogs/<YOUR_ACCOUNT_ID>/CloudTrail/'
TBLPROPERTIES ('classification'='cloudtrail');

LOCATION の部分に S3 のプレフィックスを付与することで、取り込み範囲を限定することが出来ます。当環境では /CloudTrail/ の直下に /リージョン/YYYY/MM/DD という形式でプレフィックスが切られていましたので、今回は 東京リージョンの 2020 年のログだけに絞るとしましょう。

COMMENT 'CloudTrail table for <YOUR_BUCKET_NAME> bucket'
ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://<YOUR_BUCKET_NAME>/AWSLogs/<YOUR_ACCOUNT_ID>/CloudTrail/ap-northeast-1/2020/'
TBLPROPERTIES ('classification'='cloudtrail');

プレフィックスを追記したら [クエリの実行] をクリックし、テーブルを作成します。以下のようなクエリを実行し、結果が返ってきたらテーブルの作成は正常に完了しています。

SELECT * FROM "default"."先ほどの TABLE_NAME" limit 10;

クエリを実行する

準備が整いましたので、クエリを投げましょう。今回は以下のようなログを抽出するクエリを実行します。

対象パラメータ 検索する値 備考
eventsource ssm.amazonaws.com
eventname GetParameter および GetParameters ”s”あり、なし、いずれでもパラメータストアを取得できるため
パラメータストア名 test-secure-string 各自、検索したい名前に変更

今回は該当のパラメータストアに対して、どの IAM ユーザもしくは、ロールがアクセスしたかを知りたかったので、クエリは以下のようにしました。

SELECT useridentity.arn AS userid_arn,
         useridentity.sessionContext.sessionIssuer.arn AS sessionuser_arn
FROM "default"."<TABLE_NAME>"
WHERE eventsource = 'ssm.amazonaws.com'
        AND eventname IN ('GetParameter', 'GetParameters')
        AND requestparameters LIKE '%"<PARAMETER_STORE_NAME>"%' 
group by 1,2

得られた結果がこのようになりました。

今回のケースだと、arn:aws:iam::XXXXXXXXXXXX:user/test-userarn:aws:iam::XXXXXXXXXXXX:role/cm-marumo.atsushi が利用しているパラメータであることが判りました。

検証は以上です!

さいごに

アテナを使って、パラメータストアの整理をしました。AWS
リソースを"こんまりメソッド"のように断捨離していくのは気持ち
が良いです!SQL はあまり書いた経験がなかったので、アテナ
とは疎遠だったのですが、いろいろと使いどころがあると思
うし、面白いですね。これからはログまわりのブログも書くぞ!

Developers.IO を通じて、技術の「面白さ」を伝えれるように、これからもブログ書いて行きます!

以上!大阪オフィスの丸毛(@marumo1981)でした!