チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す
このチュートリアルでは、コンソールを使用して Lambda 関数を作成し、Amazon Simple Storage Service (Amazon S3) バケットのトリガーを設定します。Amazon S3 バケットにオブジェクトを追加するたびに関数を実行し、Amazon CloudWatch Logs にオブジェクトタイプを出力します。
このチュートリアルでは、次の方法を示します。
-
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 IAM Identity Center を有効にして、管理ユーザーを作成します。これにより、日常的なタスクにルートユーザーを使用しないようにします。
AWS アカウントのルートユーザーをセキュリティで保護する
-
ルートユーザー] を選択し、AWS アカウント のメールアドレスを入力して、アカウント所有者として AWS Management Console
にサインインします。次のページでパスワードを入力します。 ルートユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドのルートユーザーとしてサインインするを参照してください。
-
ルートユーザーの多要素認証 (MFA) を有効にします。
手順については、IAM ユーザーガイドのAWS アカウント のルートユーザーの仮想 MFA デバイスを有効にする (コンソール)を参照してください。
管理アクセスを持つユーザーを作成する
-
IAM アイデンティティセンターを有効にします。
手順については、「AWS IAM Identity Center ユーザーガイド」の「AWS IAM Identity Center の有効化」を参照してください。
-
IAM アイデンティティセンターで、ユーザーに管理アクセスを付与します。
IAM アイデンティティセンターディレクトリ をアイデンティティソースとして使用するチュートリアルについては、「AWS IAM Identity Center ユーザーガイド」の「デフォルト IAM アイデンティティセンターディレクトリを使用したユーザーアクセスの設定」を参照してください。
管理アクセス権を持つユーザーとしてサインインする
-
IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。
IAM Identity Center ユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドのAWS アクセスポータルにサインインするを参照してください。
Amazon S3 バケットを作成する
Amazon S3 バケットを作成するには
-
Amazon S3 コンソール
を開き、バケットページを選択します。 -
[バケットを作成する] を選択します。
-
[全般設定] で、次の操作を行います。
-
[バケット名] には、Amazon S3 バケットの命名規則を満たすグローバルに一意な名前を入力します。バケット名は、小文字、数字、ドット (.)、およびハイフン (-) のみで構成できます。
-
[AWS リージョン] で、リージョンを選択します。チュートリアルの後半では、同じリージョンで Lambda 関数を作成する必要があります。
-
-
他のすべてのオプションはデフォルト設定値のままにしておき、[バケットの作成] を選択します。
テストオブジェクトをバケットにアップロードする
テストオブジェクトをアップロードするには
-
Amazon S3 コンソールのバケット
ページを開き、前のステップで作成したバケットを選択します。 -
[アップロード] を選択します。
-
[ファイルを追加] を選択し、アップロードするファイルを選択します。任意のファイルを選択できます (例えば、
HappyFace.jpg
)。 -
[開く]、[アップロード] の順に選択します。
チュートリアルの後半では、このオブジェクトを使用して Lambda 関数をテストします。
許可ポリシーを作成する
Lambda が Amazon S3 バケットからオブジェクトを取得し、Amazon CloudWatch Logs に書き込めるようにする許可ポリシーを作成します。
ポリシーを作成するには
-
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) ロールです。この手順では、前のステップで作成したアクセス権限ポリシーを使用して実行ロールを作成します。
実行ロールを作成して、カスタム許可ポリシーをアタッチするには
-
IAM コンソールのロールページ
を開きます。 -
[ロールの作成] を選択します。
-
信頼されたエンティティには、[AWS サービス] を選択し、ユースケースには [Lambda] を選択します。
-
[次へ] をクリックします。
-
ポリシー検索ボックスに、「
s3-trigger-tutorial
」と入力します。 -
検索結果で作成したポリシー (
s3-trigger-tutorial
) を選択し、[次へ] を選択します。 -
[ロールの詳細] で [ロール名] に
lambda-s3-trigger-role
を入力してから、[ロールの作成] を選択します。
Lambda 関数を作成する
Python 3.12 ランタイムを使用してコンソールで Lambda 関数を作成します。
Lambda 関数を作成するには
-
Lambda コンソールの関数
ページを開きます。 -
Amazon S3 バケットを作成したときと同じ AWS リージョン で操作していることを確認してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。
-
[関数の作成] を選択します。
-
[一から作成] を選択します。
-
[基本的な情報] で、以下を実行します。
-
[関数名] に
s3-trigger-tutorial
と入力します。 -
[ランタイム] には、[Python 3.12] を選択します。
-
[アーキテクチャ] で [x86_64] を選択します。
-
-
[デフォルトの実行ロールの変更] タブで、次の操作を行います。
-
タブを展開し、[既存のロールを使用する] を選択します。
-
先ほど作成した
lambda-s3-trigger-role
を選択します。
-
-
[Create function (関数の作成)] を選択します。
関数コードをデプロイする
このチュートリアルは Python 3.12 ランタイムを使用しますが、他のランタイム用のサンプルコードのファイルも用意しています。次のボックスでタブを選択すると、関心のあるランタイムのコードが表示されます。
Lambda 関数は、Amazon S3 から受信する event
パラメータから、アップロードされたオブジェクトのキー名およびバケットの名前を取得します。次に、関数は AWS SDK for Python (Boto3) から「get_object
関数コードをデプロイするには
-
次のボックスで [Python] タブを選択し、コードをコピーします。
-
Lambda コンソールの [コードソース] ペインで、コードを [lambda_function.py] ファイルに貼り付けます。
-
[デプロイ] をクリックします。
Amazon S3 トリガーを作成する
Amazon S3 トリガーを作成するには
-
[関数の概要] ペインで、[トリガーを追加] を選択します。
-
[S3] を選択します。
-
[バケット]で、前のチュートリアルで作成したバケットを選択します。
-
[イベントタイプ] で、[すべてのオブジェクトの作成イベント] を選択します。
-
[再帰呼び出し] でチェックボックスを選択して、入力と出力に同じ Amazon S3 バケットを使用することは推奨されないことを確認します。
-
[追加] を選択します。
注記
Lambda コンソールを使用して Lambda 関数の Amazon S3 トリガーを作成すると、Amazon S3 は指定したバケットに対してイベント通知を設定します。このイベント通知を設定する前に、Amazon S3 は一連のチェックを実行して、イベントの送信先が存在し、必要な IAM ポリシーがあることを確認します。また、Amazon S3 は、そのバケットに設定されている他のイベント通知に対してもこれらのテストを実行します。
このチェックが行われるために、既に存在しないリソースや必要なアクセス許可ポリシーを持たないリソースのイベントの送信先がバケットで既に設定されている場合、Amazon S3 は新しいイベント通知を作成できません。トリガーを作成できなかったことを示す次のエラーメッセージが表示されます。
An error occurred when creating the trigger: Unable to validate the following destination configurations.
このエラーは、以前に同じバケットを使用して別の Lambda 関数のトリガーを設定しており、その後に関数を削除したり、そのアクセス許可ポリシーを変更したりした場合に表示されます。
Lambda 関数をダミーイベントでテストする
Lambda 関数をダミーイベントでテストするには
-
関数の Lambda コンソールページで、[テスト] タブを選択します。
-
イベント名()で、
MyTestEvent
と入力します。 -
[イベント JSON] で、次のテストイベントを貼り付けます。次の値を必ず置き換えてください。
-
us-east-1
をAmazon S3 バケットを作成したリージョンに置き換えます。 -
amzn-s3-demo-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": "amzn-s3-demo-bucket
", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::amzn-s3-demo-bucket
" }, "object": { "key": "test%2Fkey
", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] } -
-
[Save] を選択します。
-
[Test] を選択します。
-
関数が正常に実行されると、[実行結果] タブに次のような出力が表示されます。
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: 'amzn-s3-demo-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 トリガーを使用してサムネイル画像を作成する では、Amazon S3 トリガーが関数を呼び出します。この感想は、バケットにアップロードされる各イメージファイルにサムネイルイメージを作成します。このチュートリアルでは、AWS と Lambda ドメインに関する中級レベルの知識が必要です。AWS Command Line Interface (AWS CLI) を使用してリソースを作成し、関数およびその依存関係に .zip ファイルアーカイブのデプロイパッケージを作成する方法を示します。