Athena で GetParameter / GetParameters の回数を集計する
AWS Systems Manager の Parameter Store は、最後に変更した日付とユーザーは API で確認できますが、最後に取得された日付はわかりません。 CloudTrail で GetParameter
/ GetParameters
のイベント名で検索すれば調べられますが、使われていないものを探し出すのは大変です。
『「このパラメータストア、誰が使ってるん?」の疑問を解消するための CloudTrail と Athena の使い方』のように個別に調べていくことはできますが、数が多いと手間がかかるためもう少し楽な方法を考えてみました。
次の SQL は指定した期間内に GetParameter
/ GetParameters
が何回呼ばれたのかを集計します。
SELECT
name,
count(*) AS apiCount
FROM
(
SELECT
name
FROM
table_name -- FIXME
CROSS JOIN
UNNEST(CAST(json_extract(requestParameters, '$.names') AS array(varchar))) AS t(name)
WHERE
eventName = 'GetParameters'
AND
eventTime >= '2023-09-01 00:00:00'
UNION ALL
SELECT
CAST(json_extract(requestParameters, '$.name') AS varchar) AS name
FROM
table_name -- FIXME
WHERE
eventName = 'GetParameter'
AND
eventTime >= '2023-09-01 00:00:00'
)
GROUP BY
name
ORDER BY
apiCount DESC
実行結果は次のようなイメージです。ここに挙がってこないものは使われていないと判断できます。
Parameter Store を取得する API は GetParameter
と GetParameters
の 2 種類があるため、サブクエリで 2 つの結果を UNION ALL
で結合しています。
GetParameters
の結果は以下のような配列になっているため、フラット化するために CROSS JOIN
と UNNEST
で配列をバラして行に展開しています。
{
"names": [
"/foo/bar",
"/hoge/fuga"
],
"withDecryption": false
}
ちなみに、CloudTrail Lake でも同じようなことはできますが、CloudTrail Lake SQL と Athena SQL では細かい点で違いがあり、複雑な集計をしようとすると結構ハマります(上の SQL も CloudTrail Lake ではエラーになります)。 Athena の知見を活かせないので、個人的には CloudTrail Lake を積極的に使いたいとは感じませんでした。