AWS Lambda イベントソースその1 – CloudWatch Events –

cover

こんにちは。クラウドイノベーションセンターの丸山です。
今回から複数回に分けてLambdaを起動するきっかけとすることができる、event sourceについて解説します。

Lambdaのevent source

現在Lambdaのevet sourceとして選択できるものには、以下のAWSサービスがあります。

  • AWS IoT
  • CloudWatch Events – Schedule
  • CloudWatch Logs
  • Cognito Sync Trigger
  • DynamoDB
  • Kinesis
  • S3
  • SNS
  • SES
  • CloudWatch Events(CloudWatchの管理コンソールから設定可能)

全てを一度に紹介すると量が多くなってしまいますので、今回はCloudWatch Eventsについて説明します。

CloudWatch Events

CloudWatch EventsはAWSリソースの変更情報をタイムリーに教えてくれるサービスです。GUIからの簡単なルールを作成で、Lambda、SNS、Kinesis Stream、Built-in targetと連携することができます。

現在のCloudWatch Eventsには、以下の4つをイベントソースがあります。

(CloudWatch Eventsのルールを作成する際に選択できます)

  1. EC2 instance state change notification
  2. Schedule
  3. AWS API Call
  4. Auto Scaling

1. EC2 instance state change notification

EC2 instance State change notificationを使うことで、EC2のインスタンスの状態(Pending/Running/Shutting down/Stopped/Stopping/Terminated)が変わるタイミングでLambdaを起動することが可能になります。

どの状態に遷移した時にイベント発行するのか、6つの状態の中から任意で複数選択可能です。
また、対象とするインスタンスも複数台選択できます。

#2_01_CloudWatchEvents01

2. Schedule

Scheduleはその名の通り、Lambdaが実行されるタイミングをスケジュールすることができます。
一定間隔(最短5分)での繰り返し実行と、cron表記による実行がサポートされていますので、これまで夜間バッチで行っていたような作業で、短時間で処理が終わるものでしたら、Lambdaでの処理に置き換えることができるかもしれません。

下記の図は一定間隔でLambdaを起動するように設定する場合の画面です。

#2_02_CloudWatchEvents02

下記スクリーンショットのcron表記は、日本時間で毎週金曜日の09:00(00:00(UTC))にイベントを発行するという表記です。

ここで注意しなければならないのが、時間はUTCで設定するという点です。

#2_03_CloudWatchEvents03

cronの書き方については、AWSの公式ドキュメントを参照してください。

  • スケジュールされたイベントでの AWS Lambda の使用

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-scheduled-events.html

3. AWS API Call

AWS API Callは、AWSリソースへのAPI呼び出しをトリガーとすることができます。

(例えばEC2を起動・停止、DynamoDBのTable作成・削除するなどをトリガーにする)

#2_04_CloudWatchEvents04

現在私が利用しているAWS検証環境では複数のメンバーが同じ環境を利用しており、誰が作ったリソースなのか分からなくなることが多発していたため、この機能を使ってリソース作成者が誰なのか、自動でTag付けするような仕組みを作っています。

4. Auto Scaling

Auto ScalingはEC2のAuto Scaling Groupに対し、インスタンスの起動が成功した/失敗した、インスタンスの削除が成功した/失敗したなどの状態を、イベント発行のトリガーとすることができます。
こちらも、どのイベント、どのAuto Scaling Groupを対象とするのか複数選択することができます。

#2_05_CloudWatchEvents05

 

このようにAWSリソースに対する各種イベントをLambda起動のトリガーとすることができますので、アイデア次第で様々なことを実現することができると思います。

イベントの説明だけではさみしいので、今回はAWS API Callを使用した例として、EC2が起動されたら誰が作ったインスタンスなのかTagを付けるNode.jsのコードを紹介します。

コード説明

  • 7行目:所有者を判別するためのTag配列を作っています。
  • 8行目:EC2のインスタンスIDを抜き出しています。
  • 19行目:EC2にTagを付けるためのメソッドを呼び出しています。パラメータは12行目からのparamsです。
  • 23行目:Lambdaがエラーで終了してしまうと、自動で再実行処理が走ってしまうため、context.succeedを呼び出し、Lambdaを終了させています。
  • 39~41行目:CloudWatch Eventsから渡されるイベント情報から、必要なものを取り出しています。

CloudWatch Eventsの設定は以下のようにしています。

#2_06_CloudWatchEvents06

 

CloudWatch Eventsのevent内容を確認する

CloudWatch EventsでどのようなeventがLambdaに渡されているのか確認するためには、以下のようなコードをLambdaに設定し、CloudWatch Eventsで作ったイベントルールに紐づけ、実際にイベントを実行してみると良いかと思います。

イベント発生後はCloudWatch Logsに下記のようにイベントの詳細が出力されます。

#2_07_Event

以上、CloudWatch Eventsを使ったLambdaのトリガーでした。
次回も引き続きLambdaのイベントソースについて解説していきたいと思います。

Pocket

コメント