チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す
このチュートリアルでは、コンソールを使用して Lambda 関数を作成し、Amazon Simple Storage Service (Amazon S3) バケットのトリガーを設定します。Amazon S3 バケットにオブジェクトを追加するたびに関数を実行し、Amazon CloudWatch Logs にオブジェクトタイプを出力します。

Lambda 関数と Amazon S3 トリガーを使用すると、さまざまな種類のファイル処理タスクを実行できます。例えば、Lambda 関数を使用して、画像ファイルが Amazon S3 バケットにアップロードされるたびにサムネイルを作成したり、アップロードされたドキュメントをさまざまな形式に変換したりできます。このチュートリアルを完了したら、「Amazon S3 トリガーを使用してサムネイル画像を作成する」のチュートリアルを試して、画像処理タスクを実行することができます。
このチュートリアルを完了するには、次のステップを実行します。
-
Amazon S3 バケットを作成する。
-
Amazon S3 バケット内のオブジェクトのオブジェクトタイプを返す Lambda 関数を作成します。
-
オブジェクトがバケットにアップロードされたときに関数を呼び出す Lambda トリガーを設定します。
-
最初にダミーイベントを使用して関数をテストし、次にトリガーを使用してテストします。
これらのステップを完了することにより、Amazon S3 バケットにオブジェクトが追加されたり、Amazon S3 バケットから削除されたりするたびに実行されるように Lambda 関数を設定する方法を学びます。AWS Management Console のみを使って、このチュートリアルを完了できます。
前提条件
AWS アカウント がない場合は、以下のステップを実行して作成します。
AWS アカウント にサインアップするには
オンラインの手順に従います。
サインアップ手順の一環として、通話呼び出しを受け取り、電話のキーパッドを用いて検証コードを入力するように求められます。
AWS アカウント にサインアップすると、AWS アカウントのルートユーザー が作成されます。ルートユーザーには、アカウントのすべての AWS のサービス とリソースへのアクセス権があります。セキュリティのベストプラクティスとして、管理ユーザーに管理アクセスを割り当て、ルートユーザーのみを使用してルートユーザーアクセスが必要なタスクを実行してください。
サインアップ処理が完了すると、AWS からユーザーに確認メールが送信されます。https://aws.amazon.com/
AWS アカウント にサインアップした後、日常的なタスクにルートユーザーを使用しないように、管理ユーザーを作成します。
AWS アカウントのルートユーザー をセキュリティで保護する
-
[ルートユーザー] を選択し、AWS アカウント のメールアドレスを入力して、アカウント所有者として AWS Management Console
にサインインします。次のページでパスワードを入力します。 ルートユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドの「ルートユーザーとしてサインインする」を参照してください。
-
ルートユーザーの多要素認証 (MFA) を有効にします。
手順については、IAM ユーザーガイドの「AWS アカウント のルートユーザーの仮想 MFA デバイスを有効にする (コンソール)」を参照してください。
管理ユーザーを作成する
-
日常的な管理タスクのためには、AWS IAM Identity Center の管理ユーザーに管理アクセスを割り当てます。
手順については、AWS IAM Identity Center ユーザーガイドの「開始方法」を参照してください。
管理ユーザーとしてサインインする
-
IAM Identity Center ユーザーとしてサインインするには、IAM Identity Center ユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。
IAM Identity Center ユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドの「AWS アクセスポータルにサインインする」を参照してください。
Amazon S3 バケットを作成する

AWS Management Console を使用して Amazon S3 バケットを初めて作成する
Amazon S3 バケットを作成するには
-
Amazon S3 コンソール
を開き、バケットページを選択します。 -
[バケットを作成する] を選択します。
-
[全般設定] で、次の操作を行います。
-
[バケット名] には、Amazon S3 バケットの命名規則を満たすグローバルに一意な名前を入力します。バケット名は、小文字、数字、ドット (.)、およびハイフン (-) のみで構成できます。
-
[AWS リージョン] で、リージョンを選択します。チュートリアルの後半では、同じリージョンで Lambda 関数を作成する必要があります。
-
-
他のすべてのオプションはデフォルト設定値のままにしておき、[バケットの作成] を選択します。
テストオブジェクトをバケットにアップロードする

チュートリアルの後半では、Lambda コンソールで Lambda 関数をテストします。関数のコードが正しく機能していることを確認するには、Amazon S3 バケットにテストオブジェクトが含まれている必要があります。このオブジェクトには任意のファイルを選択できます (例: HappyFace.jpg
)。
テストオブジェクトをアップロードするには
-
Amazon S3 コンソールのバケット
ページを開き、前のステップで作成したバケットを選択します。 -
[アップロード] を選択します。
-
[ファイルを追加] を選択し、ファイルセレクターを使用してアップロードするオブジェクトを選択します。
-
[開く]、[アップロード] の順に選択します。
チュートリアルの後半で関数コードをテストするときは、アップロードしたオブジェクトのファイル名を含むデータを渡すので、ここで書き留めておきます。
許可ポリシーを作成する

Lambda 関数の実行ロールを作成する前に、必要な AWS リソースにアクセスするための許可を関数に付与する許可ポリシーを作成します。このチュートリアルでは、このポリシーが、Amazon S3 バケットからオブジェクトを取得し、Amazon CloudWatch Logs に書き込むことを Lambda に許可します。
ポリシーを作成するには
-
IAM コンソールのポリシー
ページを開きます。 -
[ポリシーの作成] を選択します。
-
[JSON] タブを選択して、次のカスタムポリシーを JSON エディタに貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogGroup", "logs:CreateLogStream" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::*/*" } ] }
-
[次へ: タグ] を選択します。
-
[次へ: レビュー] を選択します。
-
[ポリシーの確認] でポリシーの [名前] に「
s3-trigger-tutorial
」と入力します。 -
[ポリシーの作成] を選択します。
実行ロールを作成する

実行ロールとは、AWS サービスとリソースにアクセスする許可を Lambda 関数に付与する AWS Identity and Access Management (IAM) ロールです。関数が Amazon S3 バケットからオブジェクトを取得できるようにするには、前のステップで作成した許可ポリシーをアタッチします。
実行ロールを作成して、カスタム許可ポリシーをアタッチするには
-
IAM コンソールのロールページ
を開きます。 -
[ロールの作成] を選択します。
-
信頼されたエンティティには、[AWS サービス] を選択し、ユースケースには [Lambda] を選択します。
-
[次へ] をクリックします。
-
ポリシー検索ボックスに、「
s3-trigger-tutorial
」と入力します。 -
検索結果で作成したポリシー (
s3-trigger-tutorial
) を選択し、[次へ] を選択します。 -
[ロールの詳細] で [ロール名] に
lambda-s3-trigger-role
を入力してから、[ロールの作成] を選択します。
Lambda 関数を作成する

この例では、Node.js 16.x ランタイムを使用してコンソールで Lambda 関数を作成します。コンソールで作成する関数には、基本的な「Hello World」コードがいくつか含まれています。次のステップでは、これを関数コードに置き換えて、Amazon S3 バケットからオブジェクトを取得します。
Lambda 関数を作成するには
-
Lambda コンソールの関数
ページを開きます。 -
Amazon S3 バケットを作成したときと同じ AWS リージョン で操作していることを確認してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。
-
[関数の作成] を選択します。
-
[一から作成] を選択します。
-
[基本的な情報] で、以下を実行します。
-
[関数名] に
s3-trigger-tutorial
と入力します。 -
[ランタイム] で [Node.js 16.x] を選択します。
-
[アーキテクチャ] で [x86_64] を選択します。
-
-
[デフォルトの実行ロールの変更] タブで、次の操作を行います。
-
タブを展開し、[既存のロールを使用する] を選択します。
-
先ほど作成した
lambda-s3-trigger-role
を選択します。
-
-
[機能の作成]を選択します。
関数コードをデプロイする

Lambda 関数は、Amazon S3 から受信した event
パラメータから、アップロードされたオブジェクトのキー名とバケット名を取得します。次に、関数は AWS SDK for JavaScript の HeadObject
API 呼び出しを使用して、アップロードされたオブジェクトのオブジェクトタイプを取得します。
このチュートリアルでは Node.js 16.x ランタイムを使用しますが、他のランタイム用のサンプルコードファイルも提供しています。次のボックスでタブを選択すると、関心のあるランタイムのコードが表示されます。デプロイする JavaScript コードは、[JavaScript] というラベルのタブに表示されている最初のサンプルです。
関数コードをデプロイするには
-
Lambda コンソールの「関数
」ページを開きます。 -
前のステップで作成した関数を選択します (
s3-trigger-tutorial
)。 -
[コード] タブを選択します。
-
提供された JavaScript コードをコピーして、[コードソース] ペインの [index.js] タブに貼り付けます。
-
[デプロイ] をクリックします。
Amazon S3 トリガーを作成する

関数コードをデプロイしたので、関数を呼び出す Amazon S3 トリガーを作成します。
Amazon S3 トリガーを作成するには
-
関数のコンソールページの[関数の概要] ペインで、[トリガーを追加] を選択します。
-
[S3] を選択します。
-
[バケット]で、前のチュートリアルで作成したバケットを選択します。
-
[イベントタイプ] で、[すべてのオブジェクト作成イベント] を選択します。オブジェクトが削除されたときに Lambda を呼び出すようにトリガーを設定することもできますが、このチュートリアルではそのオプションは使用しません。
-
[再帰呼び出し] でチェックボックスを選択して、入力と出力に同じ Amazon S3 バケットを使用することは推奨されないことを確認します。Lambda の再帰呼び出しパターンについて詳しくは、Serverless Land の「Lambda 関数が暴走する原因となる再帰パターン
」を参照してください。 -
[Add] (追加) を選択します。
Lambda 関数をダミーイベントでテストする

Lambda 関数を作成して設定したので、テストする準備ができました。まず、ダミーの Amazon S3 イベントを送信して関数が正しく動作していることを確認することで、関数をテストします。
Lambda 関数をダミーイベントでテストするには
-
Lambda コンソールページで関数の [コード] タブを選択します。
-
[コードソース] ペインで、[テスト] を選択します。
-
[テストイベントの設定] ボックスで、以下の操作を行います。
-
[イベント名] で、
MyTestEvent
と入力します。 -
[テンプレート] で、[S3 Put] を選択します。
-
Event JSONで、以下の値を置き換えます。
-
us-east-1
をAmazon S3 バケットを作成したリージョンに置き換えます。 -
my-bucket
の両方のインスタンスをお使いの Amazon S3 バケットの名前に置き換えます。 -
test%2FKey
を前にバケットにアップロードしたテストオブジェクトの名前 (例えば、HappyFace.jpg
) に置き換えます。
{ "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion": "
us-east-1
", "eventTime": "1970-01-01T00:00:00.000Z", "eventName": "ObjectCreated:Put", "userIdentity": { "principalId": "EXAMPLE" }, "requestParameters": { "sourceIPAddress": "127.0.0.1" }, "responseElements": { "x-amz-request-id": "EXAMPLE123456789", "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH" }, "s3": { "s3SchemaVersion": "1.0", "configurationId": "testConfigRule", "bucket": { "name": "my-bucket
", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::my-bucket
" }, "object": { "key": "test%2Fkey
", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] } -
-
[保存] を選択します。
-
-
[コードソース] ペインで、[テスト] を選択します。
-
関数が正常に実行されると、[実行結果] タブに次のような出力が表示されます。
Response "image/jpeg" Function Logs START RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 Version: $LATEST 2021-02-18T21:40:59.280Z 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 INFO INPUT BUCKET AND KEY: { Bucket: 'my-bucket', Key: 'HappyFace.jpg' } 2021-02-18T21:41:00.215Z 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 INFO CONTENT TYPE: image/jpeg END RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 REPORT RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 Duration: 976.25 ms Billed Duration: 977 ms Memory Size: 128 MB Max Memory Used: 90 MB Init Duration: 430.47 ms Request ID 12b3cae7-5f4e-415e-93e6-416b8f8b66e6
Amazon S3 トリガーを使用して Lambda 関数をテストする

設定したトリガーで関数をテストするには、コンソールを使用して Amazon S3 バケットにオブジェクトをアップロードします。Lambda 関数が正しく呼び出されたことを確認するには、次に CloudWatch Logs を使用して関数の出力を確認します。
オブジェクトを Amazon S3 バケットにアップロードするには
-
Amazon S3 コンソールのバケット
ページを開き、前に作成したバケットを選択します。 -
[アップロード] を選択します。
-
[ファイルを追加] を選択し、ファイルセレクターを使用してアップロードするオブジェクトを選択します。このオブジェクトには任意のファイルを選択できます。
-
[開く]、[アップロード] の順に選択します。
CloudWatch Logs を使用して正しい操作を確認するには
-
CloudWatch
コンソールを開きます。 -
Lambda 関数を作成したところと同じ AWS リージョン で操作していることを確認してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。
-
[ログ]、[ロググループ] の順に選択します。
-
関数のロググループの名前を選択します (
/aws/lambda/s3-trigger-tutorial
) 。 -
[ログストリーム] から、最新のログストリームを選択します。
-
Amazon S3 トリガーに応答して関数が正しく呼び出されると、次のような出力が表示されます。表示される
CONTENT TYPE
は、バケットにアップロードしたファイルのタイプによって異なります。2022-05-09T23:17:28.702Z 0cae7f5a-b0af-4c73-8563-a3430333cc10 INFO CONTENT TYPE:
image/jpeg
リソースのクリーンアップ
このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウントに請求される料金が発生しないようにできます。
Lambda 関数を削除するには
-
Lambda コンソールの関数
ページを開きます。 -
作成した関数を選択します。
-
[アクション] で、[削除] を選択します。
-
テキスト入力フィールドに
delete
と入力し、[削除] を選択します。
実行ロールを削除する
-
IAM コンソールのロールページ
を開きます。 -
作成した実行ロールを選択します。
-
[削除] を選択します。
-
テキスト入力フィールドにロールの名前を入力し、[削除] を選択します。
S3 バケットを削除するには
-
Amazon S3 コンソール
を開きます。 -
作成したバケットを選択します。
-
[削除] を選択します。
-
テキスト入力フィールドにバケットの名前を入力します。
-
[バケットを削除] を選択します。
次のステップ
詳細なチュートリアルをお試しください。このチュートリアルでは、Amazon S3 トリガーが関数を呼び出して、バケットにアップロードされる各イメージファイルのサムネイルイメージを作成します。このチュートリアルでは、AWS と Lambda ドメインに関する中級レベルの知識が必要です。AWS Command Line Interface( AWS CLI) を使用してリソースを作成し、関数とその依存関係の .zip ファイルアーカイブデプロイパッケージを作成します。