Athena で GetParameter / GetParameters の回数を集計する

Posted on

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

実行結果は次のようなイメージです。ここに挙がってこないものは使われていないと判断できます。

Athena の実行結果

Parameter Store を取得する API は GetParameterGetParameters の 2 種類があるため、サブクエリで 2 つの結果を UNION ALL で結合しています。

GetParameters の結果は以下のような配列になっているため、フラット化するために CROSS JOINUNNEST で配列をバラして行に展開しています。

{
  "names": [
    "/foo/bar",
    "/hoge/fuga"
  ],
  "withDecryption": false
}

ちなみに、CloudTrail Lake でも同じようなことはできますが、CloudTrail Lake SQL と Athena SQL では細かい点で違いがあり、複雑な集計をしようとすると結構ハマります(上の SQL も CloudTrail Lake ではエラーになります)。 Athena の知見を活かせないので、個人的には CloudTrail Lake を積極的に使いたいとは感じませんでした。

Popular Entries

Recent Entries