背景・目的
EventBridgeをアプリケーションから作成する機会がありましたので、簡単に試してみます。
概要
Amazon EventBridge スケジューラとは
Amazon EventBridge スケジューラとはを元に整理します
Amazon EventBridge スケジューラはサーバーレススケジューラで、一元化されたマネージドサービスからタスクを作成、実行、管理できます。EventBridge スケジューラは拡張性が高く、270 を超える AWS サービスと 6,000 を超える API オペレーションを呼び出すことができる何百万ものタスクをスケジュールできます。EventBridge スケジューラでは、インフラストラクチャをプロビジョニングして管理したり、複数のサービスと統合したりすることなく、スケジュールを大規模に配信してメンテナンスコストを削減できます。
- マネージドサービス
- 270を超えるAWSサービスを呼び出すことができる
- 6,000を超えるAPIオペレーションを呼び出すことができる
- 何百万ものタスクをスケジュールできる
EventBridge スケジューラは、ダウンストリームのターゲットの空き状況に基づいてスケジュールを調整する組み込みメカニズムにより、タスクを確実に配信します。EventBridge スケジューラでは、繰り返しのパターンに cron やレート式を使ってスケジュールを作成したり、1回限りの呼び出しを設定したりできます。配信の時間枠を柔軟に設定したり、再試行制限を定義したり、失敗したトリガーの最大保持時間を設定したりできます。
- cron、レート式を使ってスケジュールを作成したり、一回限りの呼び出しを設定したりできる
EventBridge スケジューラの主な機能
EventBridge スケジューラには、ターゲットの設定やスケジュールの拡張に使用できる以下の主要機能があります。
- テンプレート化されたターゲット — EventBridge スケジューラは、Amazon SQS、Amazon SNS、Lambda、EventBridge を使用して、一般的な API オペレーションを実行するテンプレート化されたターゲットをサポートしています。定義済みのターゲットを使用すると、EventBridge スケジューラのコンソール、EventBridge スケジューラ SDK、または AWS CLI を使用してスケジュールをすばやく設定できます。
- ユニバーサルターゲット — EventBridge スケジューラにはユニバーサルターゲットパラメーター (UTP) が用意されています。これを使用して、スケジュール上で 270を超える AWS サービスと 6,000 を超える API オペレーションをターゲットとするカスタマイズされたトリガーを作成できます。UTP では、EventBridge スケジューラのコンソール、EventBridge スケジューラ SDK、または AWS CLI を使用して、カスタマイズされたトリガーを設定できます。
- 柔軟な時間枠 — EventBridge スケジューラは柔軟な時間枠をサポートしているため、ターゲットの呼び出しを正確にスケジュールする必要のないユースケースでも、スケジュールを分散してトリガーの信頼性を高めることができます。
- 再試行 — EventBridge スケジューラは、ターゲットに少なくとも 1 回のイベント配信を行います。つまり、ターゲットからの応答で少なくとも 1 つの配信が成功します。EventBridge スケジューラでは、失敗したタスクのスケジュールの再試行回数を設定できます。EventBridge スケジューラは、スケジュールの信頼性を高め、ターゲットが確実に利用できるようにするために、失敗したタスクを遅延させて再試行します。
下記の機能がある
- テンプレート化されたターゲット
- SQS、SNS、Lambda、EventBridgeを使用して、一般的なAPIを実行するテンプレート化されたターゲットをサポート子ている
- ユニバーサルターゲット
- ユニバーサルターゲットパラメータ(UTP)が用意されている
- 270以上のAWSサービス、6000を超えるAPIオペレーションをターゲットとするカスタマイズされたトリガーを作成できる
- ユニバーサルターゲットパラメータ(UTP)が用意されている
- 柔軟な時間枠
- 柔軟な時間枠をサポートしている
- ターゲットの呼び出しを正確にスケジュールする必要のないユースケースでもスケジュールを分散してトリガーの信頼性を高める
- 再試行
- ターゲットに少なくても一回のイベント配信を行える
- ターゲットからの応答で少なくても1つの配信が成功する
- 失敗したタスクのスケジュールの再試行回数を設定できる
スケジュールグループの管理
スケジュールグループとは、スケジュールを整理するために使用する Amazon EventBridge スケジューラのリソースです。
AWS アカウント には default スケジューラグループが付属しています。新しいスケジュールは、default グループ、または自分で作成して管理するスケジュールグループに関連付けることができます。AWS アカウント には最大 500 個のスケジュールグループを作成できます。EventBridge スケジューラでは、タグを適用することで、個々のスケジュールではなく、スケジュールグループを整理できます。
- スケジュールグループは500まで作成できる
- スケジュールは、タグを適用しスケジュールグループを整理できる
タグとは、ユーザーが定義する大文字と小文字を区別するキーと値で構成されるラベルです。タグを作成して、目的、所有者、環境などの基準に基づいてスケジュールを分類できます。例えば、次のタグを使用して、スケジュールが属する環境を特定できます
スケジュールグループには、ACTIVE と DELETING という 2 つの状態があります。
最初にグループを作成すると、デフォルトでは ACTIVE になっています。スケジュールは ACTIVE グループに追加できます。グループを削除すると、EventBridge スケジューラが関連付けれらたスケジュールの削除を完了するまで状態は DELETING に変わります。EventBridge スケジューラがグループ内のスケジュールを削除すると、そのグループはアカウントで使用できなくなります。
- グループのステータスはACTIVEと、DELETINGという2つの状態がある
- ACTIVEグループに、グループを追加できる
- グループを削除すると、関連付けられたスケジュールの削除までは、DELETINGになる
- すべてのスケジュールを削除すると、グループはアカウントで使用できなくなる
実装
下記の構成で試してみます。
事前準備
ネットワーク
VPCおよびプライベートサブネットを作成します。
EventBridge SchedulerのIAMロール
- IAMに移動します
- ナビゲーションペインで「ロール」をクリックします
- 信頼関係では、下記を設定します
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
- IMAポリシーに「AWSLambdaRole」をアタッチします
Lambdaの作成
- Lambdaに移動します
起動されるLambda
-
「関数の作成」をクリックします
-
下記を入力します
-
下記を指定して、「関数の作成」をクリックします
-
コードは、デフォルトのままです
import json def lambda_handler(event, context): # TODO implement return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
-
動作を確認するため、「テスト」タブをクリックします
EventBridgeを作成するLambda
-
「関数の作成」をクリックします
-
下記を入力します
-
下記を指定して、「関数の作成」をクリックします
-
設定タブ、一般設定を選択します
-
タイムアウトを1分に設定しておきます
EventBridgeを作成するコード
Boto3のドキュメントを参考に作成します。
-
下記をアップロードします
import json import boto3 def lambda_handler(event, context): client = boto3.client('scheduler') response = create_schedule(client) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') } def create_schedule(client): response = client.create_schedule( ActionAfterCompletion='NONE', ClientToken='string', Description='test-scheduler', FlexibleTimeWindow={ 'MaximumWindowInMinutes': 5, 'Mode': 'FLEXIBLE' }, Name='test-scheduler', ScheduleExpression='rate(5 minutes)', State='ENABLED', Target={ 'Arn': 'arn:aws:lambda:{リージョン}:XXXXXXX:function:hello_world', 'Input': '{"key1":"test"}', # 作成したEventBridgeのIAMロールのARNを指定します。 'RoleArn': 'arn:aws:iam::XXXXXXX:role/EventBridgeScheduleLambdaInvoke', } ) return response
IAMポリシーの作成
EventBridge スケジューラのアクセス許可に記載があるポリシーをLambdaを作成したときのIAMロールにアタッチします。
- IAMに移動します
- ナビゲーションウィンドウで「ポリシー」をクリックします
- 「ポリシーの作成」をクリックします
- ポリシエディタで、EventBridge Schedulerを選択し、下記のポリシーを作ります
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "scheduler:ListTagsForResource", "scheduler:GetSchedule", "scheduler:UpdateSchedule", "scheduler:TagResource", "scheduler:CreateSchedule", "scheduler:ListSchedules", "scheduler:GetScheduleGroup", "scheduler:UntagResource", "scheduler:ListScheduleGroups", "scheduler:DeleteScheduleGroup", "scheduler:CreateScheduleGroup", "scheduler:DeleteSchedule" ], "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::*:role/*", "Condition": { "StringLike": { "iam:PassedToService": "scheduler.amazonaws.com" } } } ] }
- ポリシー名を入力し、「ポリシーの作成」をクリックします
- 作成したIAMロールで「ポリシーをアタッチ」をクリックします
- 作成したIAMポリシーをアタッチし、「許可を追加」をクリックします
コードの実行
Lambdaの実行
- Lambdaに移動します
EventBridge Schedulerの確認
-
EventBridgeを作成するLambdaで、「テスト」をクリックします
-
EventBridge Scheduleに移動します
起動されるLambdaの確認
CloudWatch Logsの確認
CloudWatch Logs(CWL)でも起動確認します。
考察
今回、EventBridge ScheduleをVPC内のLambdaから作成しました。
対応する過程で、VPCeがなく、NATGWやIGWなど用意する必要があるなど、若干ハマりました。
今後は、各種スケジュールの設定や、デッドレターキューの設定などいくつか試してみたいと思います。
参考