AWSのリソースの作成を検知してSlackへ通知したい

2024/02/04に公開

はじめに

個人アカウントでAWSを使って遊んでる時に、きれいにお片付けできたらうれしいですよね?

今回はきれいにお片付けをするためにコンソールポチポチの結果作成されたリソースをSlackへ通知できるようにしてみました。

参考にした記事は以下

CloudTrailでAWSリソース作成を検知して通知する | DevelopersIO

ほぼほぼ同じ内容なので独自性としてメールでの通知ではなくLambdaを呼び出してSlackへの通知にしてます。

構成

CloudTrailの作成(同時にCloudWatchの作成)

1ページ目は次のようにしてください。

ポイントは次です。

  • S3バケットとKMSは今回使わないので適当
  • CloudWatchにログを出す設定にする(これで自動でCloudWatchが作られる)
  • 各種名前はお好きに

2ページ目は次です。

この設定で作成してください

Lambdaの作成

私はJSに慣れてるのでJSで作りました。

/* global fetch */
const { ungzip } = require("pako");

export const handler = async (event) => {
  const log = JSON.parse(
    new TextDecoder().decode(ungzip(Buffer.from(event.awslogs.data, "base64"))),
  );
  const eventNames = log.logEvents
    .map((event) => JSON.parse(event.message).eventName)
    .join(", ");
  await fetch("{SlackのwebhookのURL}",{headers:{"Content-Type":"application/json", body:JSON.stringify({text: `Resource Create: ${eventNames}`})}})
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};

npm packageの導入は別の方の次の記事を参考にしてください。

lambdaでnpm moduleを使う方法 - Qiita

この時lambdaが受け取るログはbase64でエンコードされたうえでgzip化されているのでデコードしてます。

エンコードのされ方に関する詳細は次のリンク

CloudWatch Logs サブスクリプションフィルターの使用 - Amazon CloudWatch Logs

LambdaでCloudWatchを購読

次のように設定してください。

この時、最初に作成したCloudWatchをLogGroupで指定してください。

また、FilterPatternでリソース作成のイベントだけ購読するよう設定してます。

完成!!

Discussion