RDS の起動通知を Lambda で実装する
AWS Lambda は、サーバーレスでコードを実行できるイケイケのサービスです。
Lambdaの実装サンプルを考えていたところ
- 週に1度、RDSは勝手に起動してしまう
- 放っておくと財布に優しくない
- RDSの起動を監視するためにサーバーを常駐させたくない
- 結局サーバー代がかかってしまうから
- → サーバーレスでいきたい
- 自動で止めるのは怖いので、Slackに通知だけしたい
という手頃なテーマが見つかりました。
今回使うAWSのサービスは、
- RDS
- EventBridge
- 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」としておきます。
次に、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-0006
はDBインスタンスイベントの中でインスタンスの再起動にあたります)
{
"source": ["aws.rds"],
"detail-type": ["RDS DB Instance Event"],
"detail": {
"EventID": ["RDS-EVENT-0006"]
}
}
ターゲットを「Lambda 関数」、関数は上で作成した「rds-restart-notify」とし「レビューと作成にスキップ」を押します。
最後に「ルールの作成」を押して完了です。
⑤ 実際に動かす & 後片付け
RDSを実際に手動で起動し、Slack通知が行くことを確認しましょう。無事通知が来たでしょうか?
実際に1週間後に通知が来るか試したい方は、RDSを停止しておきましょう。今後使う予定が無い方は、RDSだけでも必ず削除するようにしましょう。
まとめ
今回はLambdaを使ったサーバーレスのアーキテクチャ、及びEventBridgeを使ったイベント駆動のワークロードを体験しました。