EventBridgeの発火条件にしたS3バケットとフォルダ含むファイル名をパラメータとして受け渡ししてみた
皆さん、こんにちは。
クルトンです!
今回はS3の特定のバケットへファイルをアップロードしたときに、EventBridgeが発火するようにしてみました。 またEventBridgeの入力トランスフォーマーを使って、アップロードしたファイルの名前と、アップロード先のバケット名をパラメータとしてターゲットへ渡します。簡単のためターゲットにはLambdaを使います。
実行の準備
S3とEventBridge、Lambdaの3つを準備します。準備はマネージメントコンソール(以下マネコン)上で全て操作をします。
S3での準備
まずはバケットを作成してください。すでに作成している場合は、利用できるバケットがございましたら作成しなくとも大丈夫です。
新規で作成する場合は、名前以外はデフォルト設定でOKです!(筆者は新規で作成して実行しています。)
また、今回はS3の特定のフォルダへアップロードした時にEventBridgeを発火しようと考えています。 適当なフォルダを作成してください。(筆者はtestという名前でフォルダを作成しました。)
作成後のバケット名をクリックすると次の画像のようにプロパティというタブをクリックできるかと思います。
クリック後にページをスクロールしていくと次の画像のようにEventBridgeへイベントを通知するかどうかが書かれているところがあります。画像のようにオフと書かれている場合は、編集ボタンをクリックしてオンに変更してください。
これでS3バケットでの準備は完了です。
Lambdaでの準備
マネコンでLambadaを検索してください。
次に関数の作成というボタンをクリックしてください。もし見つからなければ、左ペインにある関数という項目をクリックすると、ボタンが見つかるかと思います。
次の画像のような画面で設定をします。今回ランタイムにPythonを設定していますが、他の言語に読み替えて進められる方は、他の言語を設定しても大丈夫です。
設定完了後に、ページ下部にある関数の作成ボタンをクリックしてください。そうすると、コードを編集できる画面へ遷移します。
コードを次のように書き換えてください。
import json def lambda_handler(event, context): print(event) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
書き換え後にDeployというボタンをクリックしてください。
簡単ですが、これでLambdaでの設定は完了です。受け取ったパラメータが引数eventへ格納されるので、本当にパラメータが格納されているかprint関数を使って確認をします。
EventBridgeでの準備
マネコンでEventBridgeを検索してください。
次に、左ペインで選択できるルールをクリックしてください。
クリック後に表示される画面で、ルールを作成と書かれたオレンジのボタンをクリックしてください。
ここからSTEP1~5の段階を踏んで各種設定ができる画面が出てきます。ステップを1つずつ順番に設定していきます。
STEP1: ルールの詳細を定義
名前をご記入ください。イベントバスはデフォルトのままでOKです。
ページ下部の次へボタンをクリックしてください。
STEP2: イベントパターンを構築
ページをスクロールして、作成のメソッドという欄でカスタムパターン (JSON エディタ)を選択します。
作成のメソッド欄の下にあるイベントパターンへ下記JSONをご自身の環境に合わせて書き換えた上で、入力してください。書き換える箇所はバケット名とフォルダ名です。
{ "source": ["aws.s3"], "detail-type": ["Object Created"], "detail": { "bucket": { "name": ["<ご自身の対象のバケット名を記入>"] }, "object": { "key": [{ "prefix": "<フォルダ名を記入>/" }] } } }
ここまでで、EventBridgeが発火する条件は整いました。次のSTEP3では、発火した後に起動するAWSサービスに関して設定していきます。
ページ下部の次へボタンをクリックしてください。
STEP3: ターゲットを選択
次の画像のようにターゲットを選択のドロップダウンでLambdaと検索して選択してください。その後ドロップダウンをクリックして、Lambdaでの準備で作成した関数名を入力して選択してください。
次に、追加設定と書かれているところをクリックしてください。
ターゲット入力を設定と書かれている欄が、一致したイベントと設定されているかと思います。ここを入力トランスフォーマーと設定してください。その後、入力トランスフォーマーを設定ボタンをクリックしてください。
入力トランスフォーマーを設定という画面が出てきてるかと思います。修正は2箇所必要で、入力パスとテンプレートです。
入力パスは次のように修正してください。
{ "input_bucket_name": "$.detail.bucket.name", "input_s3_key": "$.detail.object.key" }
テンプレートは次のように修正してください。
{"Parameters": {"input_bucket_name":"<input_bucket_name>", "input_s3_key":"<input_s3_key>"}}
入力パスでは、イベントが発火した時の情報をどういった名前で受け取るかを書くことができます。 テンプレートはターゲットに指定したサービス(今回はLambda)へどういった情報を渡すかを書くことができます。
テンプレートでは山括弧を書くことで、入力パスで受け取った内容を展開する事ができます。
つまり上記設定では、S3のバケット名(input_bucket_name)とファイル名(input_s3_key)をターゲット(Lambda)へ渡すという事をしています。
Lambdaでのパラメータの受け取り方は、引数eventを使用しています。(Lambdaで書いたコードをご参照ください。)
STEP4でタグを設定する必要が今回ないため、レビューと作成にスキップボタンをクリックします。
STEP4: タグを設定
今回は特にタグを設定する必要がないためスキップをしています。
STEP5: レビューと作成
各STEPで設定した内容が問題ないかご確認ください。設定の確認が終わりましたら、ページ下部のルールの作成ボタンをクリックしてください。
STEP5まで終わったらEventBridgeの設定は完了です!
実行してみた
実際にS3へファイルをアップロードして、バケット名とファイル名が取得できているかを確認してみます。
まずはS3のページを開き、EventBridgeの発火条件にしたフォルダのページを開きます。
次のような画面が出ているかと思います。
上記画像のような画面において、適当なファイルをドラッグ&ドロップしてください。別ページへ遷移するので、ページ下部のアップロードボタンをクリックしてください。
アップロード完了後にLambdaの関数のページを開いてください。(Lambdaのページへ移動後、左ペインの関数という項目をクリックします。その後関数名を検索し、関数名をクリックしてください。)
Lambdaの関数名のページにおいて、モニタリングと書かれているタブをクリック後に現れる、CloudWatch ログを表示ボタンをクリックしてください。
CloudWatchログのストリームを確認すると、
{'Parameters': {'input_bucket_name': '<EventBridgeの発火条件となっているバケット名>', 'input_s3_key': '<発火条件にしたフォルダ名>/<アップロードしたファイル名>'}}
となっている事が確認できるかと思います。パラメータの受け渡し出来ている事がこれで確認できました。
終わりに
今回はEventBridgeの発火条件をS3へのファイルアップロード時に設定し、発火条件となっているバケット名とファイル名をパラメータとしてEventBridgeのターゲットになっているLambdaへ受け渡しをやりました。
Lambdaへパラメータを受け渡しをしていますが、例えばAWS Batchへパラメータを渡し、カスタムコンテナ実行時にアップロードしたファイルを使用するという用途にも今回の内容は使えるかと思います。
ちなみにAWS Batchでパラメータを受け取るにはコンテナ設定のコマンドという項目欄に
["python","<コンテナ内で実行するファイル名>.py","--input_bucket_name","Ref::input_bucket_name","--input_s3_key","Ref::input_s3_key"]
という風に書きます。これで、カスタムコンテナで実行するファイル内でargparseを使えばパラメータを受け取れます。
今回はここまで。
それでは、また!