blog top

RDS の起動通知を Lambda で実装する

AWS Lambda は、サーバーレスでコードを実行できるイケイケのサービスです。

Lambdaの実装サンプルを考えていたところ

という手頃なテーマが見つかりました。

今回使うAWSのサービスは、

  1. RDS
  2. EventBridge
  3. Lambda

になります。

① SlackのWebhook URLを取得する

こちらの手順に従い、Webhook URLを作成してください。

ここで作成するURLはhttps://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXXのようになります。

② RDSを準備する

筆者は今回MySQLのv5.7.44、インスタンスクラスはdb.t3.microで試しました。

初回起動に時間がかかるので、以下の手順を進めながら起動を待ち、停止まで行ってください。

③ LambdaからSlackに通知する

まず、AWSのコンソールからLambda関数を作成してください。関数名は「rds-restart-notify」としておきます。

Lambda関数の作成

次に、index.mjsの中身を以下のように書き換えて、「Deploy」を押します。fetchの中身のURLは、上で作成したものを使用します。

export const handler = async (event) => {
  await fetch("https://hooks.slack.com/services/<自身のURLに差し替えてください>", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: '{"text":"RDSが再起動されました"}'
  })
};

なお、Slack通知は「Test」ボタンから試すことができます。

コードの編集

④ EventBridgeを使ってRDSの起動を検知する

EventBridgeは、他サービスのイベントをトリガーにして処理を繋げることができます。今回は、RDSの再起動イベントを受け取り、上で作成したLambdaにつなげます。

まず、EventBridgeの画面から「ルール」を選択し、「ルールを作成」を押します。

次に、名前を「rds-restart」とし、「次へ」を押します。

ルールの新規作成

画面最下の「パターンを編集」を押し、イベントパターンを以下のように編集し、「次へ」を押します。(ここで、RDS-EVENT-0006DBインスタンスイベントの中でインスタンスの再起動にあたります)

{
  "source": ["aws.rds"],
  "detail-type": ["RDS DB Instance Event"],
  "detail": {
    "EventID": ["RDS-EVENT-0006"]
  }
}

ターゲットを「Lambda 関数」、関数は上で作成した「rds-restart-notify」とし「レビューと作成にスキップ」を押します。

Lambda関数との紐づけ

最後に「ルールの作成」を押して完了です。

⑤ 実際に動かす & 後片付け

RDSを実際に手動で起動し、Slack通知が行くことを確認しましょう。無事通知が来たでしょうか?

実際に1週間後に通知が来るか試したい方は、RDSを停止しておきましょう。今後使う予定が無い方は、RDSだけでも必ず削除するようにしましょう。

まとめ

今回はLambdaを使ったサーバーレスのアーキテクチャ、及びEventBridgeを使ったイベント駆動のワークロードを体験しました。