サウナハットは持ち歩かずタオルを頭に巻く派の小菅です。
Glueワークフローを使ったS3オブジェクトのParquet変換のブログを以前ご紹介させていただきました。 このブログの中で、Glue Workflowsの起動トリガーとして、2種類(イベントトリガー or スケジュール起動)あることを言及しました。 本稿では、イベントトリガーの場合、つまりはS3のイベントをトリガーにしたGlue Workflowsの実行について解説します。 blog.serverworks.co.jp
概要
今回のイベントトリガーに関して図にすると以下のようなイメージとなります。

設定対象としては、S3、EventBridge、Glue Workflowsのトリガーノードとなります。
それでは設定していきます。
イベントトリガーのワークフロー設定(S3 -> EventBridge -> Glue Workflows)
1. S3バケットのイベント通知設定(EventBridgeへイベントの送信)
オブジェクトが格納されるS3バケットで、新しいオブジェクトが作成されたときにイベント通知をEventBridgeに送信するように設定します。 対象S3バケットのプロパティ設定画面に移動します。 「イベント通知」セクションまでスクロールし、「Amazon EventBridge」の「編集」をクリックします。

「このバケット内のすべてのイベントについて Amazon EventBridge に通知を送信する」を「オン」に切り替え「変更の保存」をクリックします。

これにより、このバケット内のすべてのオブジェクトに関するイベントが、AWSアカウントのデフォルトのEventBridgeイベントバスに送信されるようになります 。
2. Glue Workflowsへのトリガーとジョブの追加
ワークフローについては作成済みであることを前提とします。
作成方法については本ブログ冒頭で紹介の過去記事「3. ワークフロー作成」を参照ください。 blog.serverworks.co.jp
ワークフローのグラフビューで、「Add trigger」をクリックします。

以下の通りトリガーを設定します。
- Name: ※任意の名前を設定します。
- Trigger type: EventBridge event
ここからの設定はポイントです。
S3バケットにオブジェクトが生成される度に、ワークフローが実行されると生成されるオブジェクトが多い環境下ではあまり好ましくありません。 頻繁に処理は呼び出されるし呼び出されたとしてもそんな処理量はないので非効率です。
TriggeringCriteriaでは、以下2つの設定が可能です。
- Number of events: ワークフローがトリガーするまでに待機するイベントの数を指定する。つまりは、指定した値のイベント数に達するまで処理の実行を待つ、という設定値です。
- Time delay in seconds (optional): 指定した時間内に「Number of events」に達しなかった場合にトリガーする遅延時間。最初のイベントを受信したタイミングから時間カウントが開始する。
例)Number of events: 10、Time delay in seconds (optional): 900の場合
- 900秒以内にイベント数が10に達した場合、処理が実行される。
- 900秒経過した時点でイベント数が6(10未満)でも処理が実行される。

「追加」をクリックすると、トリガーノードが追加されます。 後続のジョブのトリガーについては、本ブログ冒頭で紹介の過去記事「3. ワークフロー作成」を参照ください。

3. EventBridgeルールの作成
EventBridgeでルールを作成し、S3から受信した特定のイベントを、作成したGlue Workflowsにルーティングします。
Amazon EventBridgeコンソールの「ルール」セクションに移動し、「ルールを作成」を選択します。

ルール名を入力します。 イベントバスとして「デフォルト」を選択します(S3イベント通知はデフォルトバスに送信されるため )。 ルールのタイプとして「イベントパターンを持つルール」を選択します。 「次へ」をクリックします。

イベントソースとして「AWSのイベントまたはEventBridgeパートナーイベント」を選択します。

以下の通り、イベントパターンを定義します。
- イベントソース: AWS のサービス
- AWS のサービス: Simple Storage Service (S3)
- イベントタイプ: Amazon S3 イベント通知
- イベントタイプの仕様 1: 特定のイベント→Object Created
- イベントタイプの仕様 2: 特定のバケット (名前別)→<S3バケット名>

※イベントパターンにキープレフィックスを指定したい場合は以下のように記述してください。
{
"source": ["aws.s3"],
"detail-type": ["Object Created"],
"detail": {
"bucket": {
"name": ["<S3バケット名>"]
},
"object": {
"key": [{
"prefix": "AWSLogs/xxxxxxxxxxxx/network-firewall/alert/"★キープレフィックス
}]
}
}
}
以下の通り、ターゲットを選択します。
- ターゲットタイプ: AWS のサービス
- ターゲットを選択: Glue ワークフロー
- ワークフロー: ※作成したGlue Workflowsを選択
- 実行ロール: ※EventBridgeがGlue Workflowを開始するための権限を持つIAMロールを選択または新規作成します。このロールには、Glue WorkflowのARNに対して glue:StartWorkflowRun アクション(または glue:NotifyEvent )を許可するポリシーが必要です 。また、信頼ポリシーで events.amazonaws.com サービスプリンシパルを許可する必要があります 。

「次へ」をクリックし、設定を確認してルールを作成します。
動作確認
S3へオブジェクトを生成した後に、Glue WorkflowsのHistoryから正常に実行ができているか確認してみてください。

感想
イベントトリガーにせよ、スケジュール起動にせよ、「分析時に常に〇時間前のログが最新状態である」などログの種別や重要度に応じてSLAを設定することが1番重要かと思います。そうすると自ずと手段は決まってきます。 なるべく直近のデータで且つコスパを考慮したい場合は是非、オブジェクトの処理数や処理までの待機時間など考えてトリガー設定してみてください。
小菅 信幸(執筆記事の一覧)
仙台在住/サウナをこよなく愛するエンジニア
2024 Japan AWS All Certifications Engineers