チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す - AWS Lambda

チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す

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

サムネイルイメージ作成のするチュートリアルを試す前に、このコンソールベースのチュートリアルを完了することをお勧めします。

Prerequisites

Lambda および他の AWS のサービスを使用するには、AWS アカウントが必要です。アカウントをお持ちでない場合は、aws.amazon.com にアクセスして [Create an AWS Account] (AWS アカウントを作成する) を選択してください。この手順については、「How do I create and activate a new AWS account? (新規アカウントを作成してアクティベートする方法を教えてください)」を参照してください。

このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。初めての方は、Lambda の開始方法 の手順に従って最初の Lambda 関数を作成してください。

バケットを作成し、サンプルオブジェクトをアップロードする

Amazon S3 バケットを作成し、新しいバケットにテストファイルをアップロードします。コンソールから関数をテストするときに、Lambda 関数はこのファイルに関する情報を取得します。

コンソールを使用して Amazon S3 バケットを作成するには

  1. Amazon S3 コンソールを開きます。

  2. [バケットを作成する] を選択します。

  3. [全般設定] で、次の操作を行います。

    1. [バケット名] に、一意の名前を入力します。

    2. [AWS リージョン] で、リージョンを選択します。Lambda 関数をは同じリージョンで作成する必要があることにご注意ください。

  4. [バケットを作成する] を選択します。

バケットを作成すると Amazon S3 で [Buckets] (バケット) ページが開き、現在のリージョンのアカウントにあるすべてのバケットが一覧表示されます。

Amazon S3 コンソールを使用してテストオブジェクトをアップロードするには

  1. Amazon S3 コンソールの [Buckets] (バケット) ページで、作成したバケットの名前を選択します。

  2. [オブジェクト] タブで、[アップロード] を選択します。

  3. テストファイルをローカルマシンから [アップロード] ページにドラッグします。

  4. [Upload (アップロード)] を選択します。

Lambda 関数を作成する

関数の設計図を使用して Lambda 関数を作成します。設計図には、Lambda を 他の AWS サービスで使用する方法を示す、サンプルの関数が用意されています。また、設計図には、特定のランタイム用のサンプルコードと関数設定プリセットが含まれています。このチュートリアルでは、Node.js または Python ランタイムの設計図を選択できます。

コンソールで設計図から Lambda 関数を作成するには

  1. Lambda コンソールで [Functions (関数)] ページを開きます。

  2. [Create function] を選択します。

  3. [Create function (関数の作成)] ページで、[Blueprints (設計図)] を選択します。

  4. [設計図] で、検索ボックスに「s3」と入力します。

  5. 検索結果で、次のいずれかの操作を行います。

    • Node.js 関数の場合は、[s3-get-object] を選択します。

    • Python 関数の場合は、[s3-get-object-python] を選択します。

  6. [Configure] を選択します。

  7. [基本的な情報] で、以下の作業を行います。

    1. [関数名] に「my-s3-function」と入力します。

    2. [実行ロール] ドロップダウンリストで、[AWS ポリシーテンプレートから新しいロールを作成] を選択します。

    3. [ロール名] に「my-s3-function-role」と入力します。

  8. [S3 トリガー] で、以前に作成した S3 バケットを選択します。

    Lambda コンソールを使用して S3 トリガーを設定すると、コンソールは、関数のリソースベースのポリシーを、Amazon S3 が関数を呼び出せるように変更します。

  9. [Create function] を選択します。

関数コードを確認する

Lambda 関数は、受信したイベントパラメータから、ソース S3 バケット名とアップロードされたオブジェクトのキー名を取得します。この関数は Amazon S3 getObject API を使用して、オブジェクトのコンテンツタイプを取得します。

Lambda コンソールで関数を表示している間、 [Code source] (コードソース) の下の [Code] (コード) タブで関数コードを確認できます。コード は次のようになります。

Node.js

例 index.js

console.log('Loading function'); const aws = require('aws-sdk'); const s3 = new aws.S3({ apiVersion: '2006-03-01' }); exports.handler = async (event, context) => { //console.log('Received event:', JSON.stringify(event, null, 2)); // Get the object from the event and show its content type const bucket = event.Records[0].s3.bucket.name; const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); const params = { Bucket: bucket, Key: key, }; try { const { ContentType } = await s3.getObject(params).promise(); console.log('CONTENT TYPE:', ContentType); return ContentType; } catch (err) { console.log(err); const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`; console.log(message); throw new Error(message); } };
Python

例 lambda-function.py

import json import urllib.parse import boto3 print('Loading function') s3 = boto3.client('s3') def lambda_handler(event, context): #print("Received event: " + json.dumps(event, indent=2)) # Get the object from the event and show its content type bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') try: response = s3.get_object(Bucket=bucket, Key=key) print("CONTENT TYPE: " + response['ContentType']) return response['ContentType'] except Exception as e: print(e) print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) raise e

コンソールでテストする

サンプルの Amazon S3 イベントデータを使用して手動で Lambda 関数を呼び出します。

コンソールを使用して Lambda 関数をテストします。

  1. [Code source] (コードソース) の下の [Code] (コード) タブで、[Test] (テスト) の横にある矢印を選択し、ドロップダウンリストから [Configure test events] (テストイベントの設定) を選択します。

  2. [テストイベントの設定] ページで、以下の操作を行います。

    1. [Create new test event] を選択します。

    2. [イベントテンプレート] で、[Amazon S3 Put (s3-put)] を選択します。

    3. [イベント名] には、テストイベントの名前を入力します。例えば、 。mys3testevent

    4. テストイベント JSON で、S3 バケット名 (example-bucket) とオブジェクトキー (test/key) をバケット名とテストファイル名に置き換えます。テストイベントは、次のようになります。

      { "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion": "us-west-2", "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-s3-bucket", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::example-bucket" }, "object": { "key": "HappyFace.jpg", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] }
    5. [作成] を選択します。

  3. テストイベントで関数を呼び出すには、[コードソース] で [テスト] を選択します。

    [実行結果] タブには、次のような応答、関数ログ、リクエスト ID が表示されます。

    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-s3-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

S3 トリガーでテストする

Amazon S3 ソースバケットにファイルをアップロードするときに、関数を呼び出します。

S3 トリガーを使用して Lambda 関数をテストするには

  1. Amazon S3 コンソールの [Buckets] (バケット) ページで、前に作成したソースバケットの名前を選択します。

  2. [Upload] (アップロード) ページで、いくつかの .jpg または .png イメージファイルをバケットにアップロードします。

  3. Lambda コンソールの [Functions] (関数) ページを開きます。

  4. 関数の名前 (my-s3-function) を選択します。

  5. [Monitor] (モニタリング) タブを選択し、アップロードしたファイルごとに関数が 1 回実行されたことを確認します。このページでは、Lambda から CloudWatch に送信されるメトリクスのグラフが表示されます。[Invocations] (呼び出し) グラフ内のカウント数は、Amazon S3 バケットにアップロードしたファイルの数と一致している必要があります。

    これらのグラフの詳細AWS Lambda コンソールで関数をモニタリングするを参照してください。

  6. (オプション) CloudWatch コンソールでログを表示するには、[View logs in CloudWatch] (CloudWatch でログを表示) を選択します。ログストリームを選択して、関数呼び出しの 1 つのログ出力を表示します。

リソースのクリーンアップ

このチュートリアル用に作成したリソースは、保持を希望しない場合、すぐに削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウントに請求される料金が発生しないようにできます。

Lambda 関数を削除するには

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. 作成した関数を選択します。

  3. [ Actions] で、[Delete ] を選択します。

  4. [削除] を選択します。

IAM ポリシーを削除するには

  1. AWS Identity and Access Management (IAM) コンソールの [Policies (ポリシー)] ページを開きます。

  2. Lambda が作成したポリシーを選択します。ポリシー名は、AWSLambdaS3ExecutionRole- で始まります。

  3. [ポリシーアクション]、[削除] の順に選択します。

  4. [削除] を選択します。

実行ロールを削除するには

  1. IAM コンソールの [Roles (ロール)] ページを開きます。

  2. 作成した実行ロールを選択します。

  3. [ロールの削除] を選択します。

  4. [はい、削除します] を選択します。

S3 バケットを削除するには

  1. Amazon S3 コンソールを開きます。

  2. 作成したバケットを選択します。

  3. [削除] を選択します。

  4. テキストボックスにバケットの名前を入力します。

  5. [Confirm] を選択します。

次のステップ

詳細なチュートリアルをお試しください。このチュートリアルでは、S3 トリガーは関数を呼び出して、S3 バケットにアップロードされる各イメージファイルのサムネイルイメージを作成します。このチュートリアルでは、AWS と Lambda ドメインに関する中級レベルの知識が必要です。AWS Command Line Interface( AWS CLI) を使用してリソースを作成し、関数とその依存関係の .zip ファイルアーカイブデプロイパッケージを作成します。