メモ

ACTABAのホームページ

TOP > AWS LambdaをS3イベントから実行してみた

見出し

AWS LambdaをS3イベントから実行してみたのでそのメモ。(2021/10)

AWS Lambdaとは?!

Amazon Web ServiceのLambdaは、Amazonのドキュメントによると、

Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。Lambda は可用性の高いコンピューティングインフラストラクチャでコードを実行し、コンピューティングリソースの管理をすべて担当します。
とのこと。
参考: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の画面で「バケットを作成」をクリックします。
下記を入力します。

バケット名:lambda-event-text
AWS リージョン:アジアパシフィック(東京)ap-northeast-1
パブリックアクセスをすべて ブロック:パブリックアクセスをすべて ブロック
バケットのバージョニング:無効にする
上記以外はデフォルトの設定のまま
画面右下の「バケットを作成」をクリックします。

画面左のメニュー「バケット」をクリックします。
一覧に作成したバケット「lambda-event-text」が表示されます。

作成は終了です。

テスト用オブジェクトのアップロード

Lambda関数を作成した後に、コンソール画面からLamdaの実行をテストできます。
そのときに使用するオブジェクトをアップロードしておきます。
アップロードするファイルは任意ですが、ここでは「sample.txt」をアップロードしておきます。
アップロードの手順は省略。

Lambda関数の作成とS3イベントの設定

次にS3にファイルをPUTしたときに実行するLambda関数を作成します。

AWSコンソールを表示し、Lambdaの画面を表示します。
画面左のメニュー「関数」をクリックします。
画面右上の「関数の作成」をクリックします。関数の作成方法の候補がいくつか表示されます。
今回はテンプレートを使用しますので「設計図の使用」を選択します。下に設計図の検索エリアが表示されますので"s3"と入力して、エンターキーを押します。
下に検索結果が表示されますので、「s3-get-object」を選択し、画面右下の「設定」をクリックします。

下記を入力します。

関数名:myfunc-s3-event-test
実行ロール:AWS ポリシーテンプレートから新しいロールを作成
ロール名:lambda-myfunc-s3-event-test-role

「S3 トリガー」で下記を入力します。
バケット名:lambda-event-text
「S3にバケットを作成」で作成したバケット名を選択します。
イベントタイプ:PUT
画面右下の「関数の作成」をクリックします。

作成は終了です。

テスト

作成した関数をテストしてみる。

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イベントから実行してみた、は終了。


ページのトップへ戻る