AWS LambdaをS3イベントから実行してみたのでそのメモ。(2021/10)
AWS Lambdaとは?!
Amazon Web ServiceのLambdaは、Amazonのドキュメントによると、
参考:AWS Lambda とは?(https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html)
AWS Lambdaを使用するとサーバ側のコードをサーバレスで実行できる。また、AWSの各ソリューションとの連携もできる。
一方で、AWS Lambdaは実行時間や同時実行数に制限があるので、ベストプラクティスを参考に設計したほうがよさそう。
参考:AWS Lambda 関数を使用するためのベストプラクティス(https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html)
今回は、S3にファイルを置き、ファイルの内容によって起動するLambdaを変えてみる。
S3イベントではファイルの内容まで条件に設定できないので、下記の順にイベント駆動してみる。
S3イベント→Lambda(ファイルの名用判定)→対応するLambda
環境の構築
下記を実施する。
・S3にバケットを作成
・テスト用オブジェクトのアップロード
・Lambda関数の作成とS3イベントの設定
S3にバケットを作成
AWSコンソールを表示し、Amazon S3の画面で「バケットを作成」をクリックします。
下記を入力します。
AWS リージョン:アジアパシフィック(東京)ap-northeast-1
パブリックアクセスをすべて ブロック:パブリックアクセスをすべて ブロック
バケットのバージョニング:無効にする
画面右下の「バケットを作成」をクリックします。
画面左のメニュー「バケット」をクリックします。
一覧に作成したバケット「lambda-event-text」が表示されます。
作成は終了です。
テスト用オブジェクトのアップロード
Lambda関数を作成した後に、コンソール画面からLamdaの実行をテストできます。
そのときに使用するオブジェクトをアップロードしておきます。
アップロードするファイルは任意ですが、ここでは「sample.txt」をアップロードしておきます。
アップロードの手順は省略。
Lambda関数の作成とS3イベントの設定
次にS3にファイルをPUTしたときに実行するLambda関数を作成します。
AWSコンソールを表示し、Lambdaの画面を表示します。
画面左のメニュー「関数」をクリックします。
画面右上の「関数の作成」をクリックします。関数の作成方法の候補がいくつか表示されます。
今回はテンプレートを使用しますので「設計図の使用」を選択します。下に設計図の検索エリアが表示されますので"s3"と入力して、エンターキーを押します。
下に検索結果が表示されますので、「s3-get-object」を選択し、画面右下の「設定」をクリックします。
下記を入力します。
実行ロール:AWS ポリシーテンプレートから新しいロールを作成
ロール名:lambda-myfunc-s3-event-test-role
「S3 トリガー」で下記を入力します。
画面右下の「関数の作成」をクリックします。
作成は終了です。
テスト
作成した関数をテストしてみる。
Lambdaの関数一覧から作成した関数「myfunc-s3-event-test」をクリックします。
「myfunc-s3-event-test」の「関数の概要」が表示されます。
画面下はタブ「コード」が選択状態になっていますので、タブ「テスト」をクリックします。
「テストイベント」の画面が表示されます。
下記を入力します。
テンプレート:S3 Put」(s3-put)
名前:MyS3EventTest
jsonのイベント内の値は、テストしたい内容に合わせて変更します。
リージョン(下記の赤字の箇所)を、S3バケットのリージョンと同じにします。
"us-east-1"を"ap-northeast-1"に変更します。
"Records": [
{
"eventVersion": "2.0",
"eventSource": "aws:s3",
"awsRegion": "us-east-1",
"eventTime": "1970-01-01T00:00:00.000Z",
"eventName": "ObjectCreated:Put",
バケット名(下記の赤字の箇所)を、S3バケット名に変更します。
"example-bucket"を"lambda-event-text"に変更します。
"s3": { "s3SchemaVersion": "1.0", "configurationId": "testConfigRule", "bucket": { "name": "example-bucket", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::example-bucket" },
オブジェクトのキー名(下記の赤字の箇所)を、テスト用にアップロードしたファイル名に変更します。
"test%2Fkey"を"sample.txt"に変更します。
"object": {
"key": "test%2Fkey",
"size": 1024,
"eTag": "0123456789abcdef0123456789abcdef",
"sequencer": "0A1B2C3D4E5F678901"
}
右上の「変更を保存」をクリックします。
「テスト」をクリックすると、設定したイベントが発行され、Lambdaが実行されます。
テスト結果は「テスト」ボタンの上側に表示されます。
「実行結果: 成功」「実行結果: 失敗」などと表示されます。
失敗のときは「errorMessage」の内容を確認して対応します。
バケットのリージョンが異なる場合、指定したオブジェクトが無い場合は「失敗」になります。(テンプレートのnode.jsのコードでそのように実装されているため)
実行した回数や成功・失敗の件数はLambdaのモニタリング画面で確認できます。
AWS Lambdaの画面左メニュー「関数」で作成した関数「myfunc-s3-event-test」を選択し、画面下のタブで「モニタリング」を選択します。
S3にファイルをPUTしてテスト
バケット「lambda-event-text」に任意のファイルをアップロードするとLamda関数「myfunc-s3-event-test」が実行されます。
実行したログはCloudWatchで確認できます。
CloudWatchの画面左メニュー「ログ」-「ログループ」を選択し、次に画面右の一覧から「/aws/lambda/myfunc-s3-event-test」を選択します。
「ログストリーム」にLambdaの実行ログが表示されます。
ログ出力
実行ログを見てもイベントの内容などは出力されていない。
実際に開発する際にはトリガーとなったイベントはログに出力したい。
コードを変更するには、AWS Lambdaで関数「myfunc-s3-event-test」を選択し、タブ「コード」を選択する。
「コードソース」が表示され、左側にコードのフォルダとファイルがツリー形式で表示される。
ツリーのフォルダ「myfunc-s3-event-test」を開き、「index.js」をダブルクリックすると、右側にコードが表示される。
コードの赤字部分を追加する。
「JSON.stringify()」はmode.jsの関数で、引数の2番目のnullは「すべて出力」、3番目はインデントの文字数。
try {
console.info("env\n" + JSON.stringify(process.env, null, 2));
console.info("event\n" + JSON.stringify(event, null, 2));
const { ContentType } = await s3.getObject(params).promise();
console.log('CONTENT TYPE:', ContentType);
return ContentType;
} catch (err) {
変更したら上の「Deploy」をクリックして反映します。
「Test」をクリックしてテストすると、テスト結果が表示されます。
環境変数の値とイベントがログに出力されています。
これで、AWS LambdaをS3イベントから実行してみた、は終了。