チュートリアル: Amazon S3 トリガーを使用してサムネイル画像を作成する - AWS Lambda

チュートリアル: Amazon S3 トリガーを使用してサムネイル画像を作成する

このチュートリアルでは、Amazon Simple Storage Service (Amazon S3) バケットに追加された画像のサイズを変更する Lambda 関数を作成および構成します。バケットに画像ファイルを追加すると、Amazon S3 は Lambda 関数を呼び出します。その後、この関数が画像のサムネイルバージョンを作成し、別の Amazon S3 バケットに出力します。

Amazon S3 バケット、Lambda 関数、および別の Amazon S3 バケット間のデータフローを示す図

このチュートリアルを完了するには、次のステップを実行します。

  1. ソース元と保存先の Amazon S3 バケットを作成し、サンプル画像をアップロードします。

  2. 画像のサイズを変更し、Amazon S3 バケットにサムネイルを出力する Lambda 関数 を作成します。

  3. オブジェクトがソースバケットにアップロードされたときに、関数を呼び出す Lambda トリガーを設定します。

  4. 最初にダミーイベントを使用して関数をテストし、その後画像をソースバケットにアップロードしてテストします。

これらのステップを完了することで、Lambda を使用して Amazon S3 バケットに追加されたオブジェクトに対してファイル処理タスクを実行する方法が分かるようになります。AWS Command Line Interface または AWS CLI(AWS Management Console) を使って、このチュートリアルを完了できます。

Lambda 用に Amazon S3 トリガーを設定する方法を知るための、より簡単な例が必要であれば、「チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す」をお試しください。

前提条件

AWS アカウントがない場合は、以下のステップを実行して作成します。

AWS アカウントにサインアップするには
  1. https://portal.aws.amazon.com/billing/signup を開きます。

  2. オンラインの手順に従います。

    サインアップ手順の一環として、通話呼び出しを受け取り、電話キーパッドで検証コードを入力するように求められます。

    AWS アカウントにサインアップすると、AWS アカウントのルートユーザーが作成されます。ルートユーザーには、アカウントのすべてのAWS のサービスとリソースへのアクセス権があります。セキュリティのベストプラクティスとして、ユーザーに管理アクセスを割り当て、ルートユーザーのみを使用してルートユーザーアクセスが必要なタスクを実行してください。

サインアップ処理が完了すると、AWS からユーザーに確認メールが送信されます。https://aws.amazon.com/[マイアカウント] を選んで、いつでもアカウントの現在のアクティビティを表示し、アカウントを管理できます。

AWS アカウント にサインアップしたら、AWS アカウントのルートユーザー をセキュリティで保護し、AWS IAM Identity Center を有効にして、管理ユーザーを作成します。これにより、日常的なタスクにルートユーザーを使用しないようにします。

AWS アカウントのルートユーザーをセキュリティで保護する
  1. [ルートユーザー] を選択し、AWS アカウントのメールアドレスを入力して、アカウント所有者として AWS Management Console にサインインします。次のページでパスワードを入力します。

    ルートユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドの「ルートユーザーとしてサインインする」を参照してください。

  2. ルートユーザーの多要素認証 (MFA) を有効にします。

    手順については、IAM ユーザーガイドの「AWS アカウント のルートユーザーの仮想 MFA デバイスを有効にする (コンソール)」を参照してください。

管理アクセスを持つユーザーを作成する
  1. IAM アイデンティティセンターを有効にします。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「AWS IAM Identity Center の有効化」を参照してください。

  2. IAM アイデンティティセンターで、ユーザーに管理アクセスを付与します。

    IAM アイデンティティセンターディレクトリ をアイデンティティソースとして使用するチュートリアルについては、「AWS IAM Identity Center ユーザーガイド」の「デフォルト IAM アイデンティティセンターディレクトリを使用したユーザーアクセスの設定」を参照してください。

管理アクセス権を持つユーザーとしてサインインする
  • IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。

    IAM Identity Center ユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドの「AWS アクセスポータルにサインインする」を参照してください。

追加のユーザーにアクセス権を割り当てる
  1. IAM アイデンティティセンターで、最小特権のアクセス許可を適用するというベストプラクティスに従ったアクセス許可セットを作成します。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「権限設定を作成する」を参照してください。

  2. グループにユーザーを割り当て、そのグループにシングルサインオンアクセス権を割り当てます。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「グループの参加」を参照してください。

AWS CLI を使用してチュートリアルを完了する場合は、AWS Command Line Interface の最新バージョンをインストールしてください。

Lambda 関数コードには、Python または Node.js を使用できます。使用する言語の言語サポートツールとパッケージマネージャーをインストールします。

2 つの Amazon S3 バケットを作成する

Amazon S3 バケットの手順で、バケットを作成しているところを示すチュートリアルのワークフロー図

まず、2 つの Amazon S3 バケットを作成します。1 つ目のバケットは、画像をアップロードするソースバケットです。2 つ目のバケットは、関数を呼び出したときにサイズ変更されたサムネイルを保存するために Lambda が使用するバケットです。

AWS Management Console
Amazon S3 バケットを作成する方法 (コンソール)
  1. Amazon S3 コンソールのバケットページを開きます。

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

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

    1. [バケット名] には、Amazon S3 バケットの命名規則を満たすグローバルに一意な名前を入力します。バケット名は、小文字、数字、ドット (.)、およびハイフン (-) のみで構成できます。

    2. AWS リージョン については、お住まいの地域に最も近い AWS リージョン を選択してください。チュートリアルの後半では、同じ AWS リージョン で Lambda 関数を作成する必要があるため、選択したリージョンを書き留めておいてください。

  4. 他のすべてのオプションはデフォルト設定値のままにしておき、[バケットの作成] を選択します。

  5. ステップ 1 ~ 4 を繰り返して、送信先のバケットを作成します。[バケット名] には DOC-EXAMPLE-SOURCE-BUCKET-resized と入力します。DOC-EXAMPLE-SOURCE-BUCKET は先ほど作成したソース元バケットの名前です。

AWS CLI
Amazon S3 バケットを作成する方法 (AWS CLI)
  1. 次の CLI コマンドを実行して、ソース元のバケットを作成します。バケットに付ける名前は、グローバルに一意で、Amazon S3 バケットの命名規則に従ったものである必要があります。名前には、小文字、数字、ドット (.)、およびハイフン (-) のみを使用できます。region および LocationConstraint については、お住まいの地域に最も近い AWS リージョン を選択してください。

    aws s3api create-bucket --bucket DOC-EXAMPLE-SOURCE-BUCKET --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2

    チュートリアルの後半では、ソース元バケットと同じ AWS リージョン で Lambda 関数を作成する必要があるため、選択したリージョンを書き留めておいてください。

  2. 次のコマンドを実行して、送信先のバケットを作成します。バケット名には DOC-EXAMPLE-SOURCE-BUCKET-resized を使用する必要があります。DOC-EXAMPLE-SOURCE-BUCKET はステップ 1 で作成したソース元バケットの名前です。region および LocationConstraint については、ソース元バケットを作成するときに使用したものと同じ AWS リージョン を選択してください。

    aws s3api create-bucket --bucket DOC-EXAMPLE-SOURCE-BUCKET-resized --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2

テスト画像をソース元バケットにアップロードする

Amazon S3 バケットの手順で、バケットをアップロードしているところを示すチュートリアルのワークフロー図

チュートリアルの後半では、AWS CLI または Lambda コンソールを使用して、Lambda 関数を呼び出してテストします。関数が正しく動作していることを確認するために、ソース元バケットにはテスト画像が含まれている必要があります。この画像には、任意の JPG または PNG ファイルを使用できます。

AWS Management Console
テスト画像をソース元バケットにアップロードする方法 (コンソール)
  1. Amazon S3 コンソールのバケットページを開きます。

  2. 前のステップで作成したソースバケットを選択します。

  3. [アップロード] を選択します。

  4. [ファイルを追加] を選択し、ファイルセレクターを使用してアップロードするオブジェクトを選択します。

  5. [開く][アップロード] の順に選択します。

AWS CLI
テスト画像をソース元バケットにアップロードする方法 (AWS CLI)
  • アップロードする画像が含まれるディレクトリから、次の CLI コマンドを実行します。--bucket パラメータをソース元バケットの名前に置き換えます。--key および --body パラメータには、テスト画像のファイル名を使用します。

    aws s3api put-object --bucket DOC-EXAMPLE-SOURCE-BUCKET --key HappyFace.jpg --body ./HappyFace.jpg

許可ポリシーを作成する

Lambda 関数の手順で、許可ポリシーを作成しているところを示すチュートリアルのワークフロー図

Lambda 関数を作成するための最初のステップは、許可ポリシーを作成することです。このポリシーは、他の AWS リソースにアクセスするために必要となるアクセス許可を関数に付与します。このチュートリアルでは、ポリシーにより Lambda に Amazon S3 バケットの読み取り権限と書き込み権限が付与され、Amazon CloudWatch Logs に書き込めるようになります。

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

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

  3. [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:::*/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::*/*" } ] }
  4. [Next] を選択します。

  5. [ポリシーの詳細] で [ポリシー名] に「LambdaS3Policy」と入力します。

  6. [Create policy] を選択します。

AWS CLI
ポリシーを作成する方法 (AWS CLI)
  1. 次の JSON を policy.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:::*/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::*/*" } ] }
  2. JSON ポリシードキュメントを保存したディレクトリから、次の CLI コマンドを実行します。

    aws iam create-policy --policy-name LambdaS3Policy --policy-document file://policy.json

実行ロールを作成する

Lambda 関数の手順で実行ロールを作成しているところを示すチュートリアルのワークフロー図

実行ロールとは、AWS のサービス とリソースにアクセスする許可を Lambda 関数に付与する IAM ロールです。関数に Amazon S3 バケットへの読み取りおよび書き込みアクセス許可を付与するには、前のステップで作成した許可ポリシーをアタッチします。

AWS Management Console
実行ロールを作成して、許可ポリシーをアタッチする方法 (コンソール)
  1. (IAM) コンソールの [ロール] ページを開きます。

  2. [ロールの作成] を選択します。

  3. [信頼できるエンティティタイプ] で AWS のサービス を選択し、[ユースケース] では [Lambda] を選択します。

  4. [Next] を選択します。

  5. 次の手順を実行して、前のステップで作成した許可ポリシーを追加します。

    1. ポリシー検索ボックスに、「LambdaS3Policy」と入力します。

    2. 検索結果内にある LambdaS3Policy のチェックボックスを選択します。

    3. [Next] を選択します。

  6. [ロールの詳細] にある [ロール名] には LambdaS3Role を入力します。

  7. [ロールの作成] を選択します。

AWS CLI
実行ロールを作成して、許可ポリシーをアタッチする方法 (AWS CLI)
  1. 次の JSON を trust-policy.json という名のファイルに保存します。この信頼ポリシーは、AWS Security Token Service (AWS STS) AssumeRole アクションを呼び出すサービスプリンシパルの lambda.amazonaws.com アクセス許可を付与することで、Lambda がロールのアクセス許可を使用できるようにします。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. JSON 信頼ポリシードキュメントを保存したディレクトリから、次の CLI コマンドを実行して実行ロールを作成します。

    aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
  3. 次の CLI コマンドを実行して、前のステップで作成した許可ポリシーをアタッチします。ポリシーの ARN にある AWS アカウント 番号を、自分のアカウント番号へと置き換えます。

    aws iam attach-role-policy --role-name LambdaS3Role --policy-arn arn:aws:iam::123456789012:policy/LambdaS3Policy

関数デプロイパッケージを作成する

Lambda 関数の手順で、デプロイパッケージを作成しているところを示すチュートリアルのワークフロー図

関数を作成するには、関数コードとその依存関係を含むデプロイパッケージを作成します。この CreateThumbnail 関数では、関数コードで画像のサイズ変更に別のライブラリを使用します。選択した言語の指示に従って、必要なライブラリを含むデプロイパッケージを作成します。

Node.js
デプロイパッケージを作成する方法 (Node.js)
  1. 関数コードと依存関係用に lambda-s3 という名前のディレクトリを作成し、そこに移動します。

    mkdir lambda-s3 cd lambda-s3
  2. 以下の関数コードを index.mjs という名のファイルに保存します。必ず 'us-west-2' を AWS リージョン (独自のソースバケットおよび宛先バケットを作成したもの) に置き換えてください。

    // dependencies import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3'; import { Readable } from 'stream'; import sharp from 'sharp'; import util from 'util'; // create S3 client const s3 = new S3Client({region: 'us-west-2'}); // define the handler function export const handler = async (event, context) => { // Read options from the event parameter and get the source bucket console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); const srcBucket = event.Records[0].s3.bucket.name; // Object key may have spaces or unicode non-ASCII characters const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); const dstBucket = srcBucket + "-resized"; const dstKey = "resized-" + srcKey; // Infer the image type from the file suffix const typeMatch = srcKey.match(/\.([^.]*)$/); if (!typeMatch) { console.log("Could not determine the image type."); return; } // Check that the image type is supported const imageType = typeMatch[1].toLowerCase(); if (imageType != "jpg" && imageType != "png") { console.log(`Unsupported image type: ${imageType}`); return; } // Get the image from the source bucket. GetObjectCommand returns a stream. try { const params = { Bucket: srcBucket, Key: srcKey }; var response = await s3.send(new GetObjectCommand(params)); var stream = response.Body; // Convert stream to buffer to pass to sharp resize function. if (stream instanceof Readable) { var content_buffer = Buffer.concat(await stream.toArray()); } else { throw new Error('Unknown object stream type'); } } catch (error) { console.log(error); return; } // set thumbnail width. Resize will set the height automatically to maintain aspect ratio. const width = 200; // Use the sharp module to resize the image and save in a buffer. try { var output_buffer = await sharp(content_buffer).resize(width).toBuffer(); } catch (error) { console.log(error); return; } // Upload the thumbnail image to the destination bucket try { const destparams = { Bucket: dstBucket, Key: dstKey, Body: output_buffer, ContentType: "image" }; const putResult = await s3.send(new PutObjectCommand(destparams)); } catch (error) { console.log(error); return; } console.log('Successfully resized ' + srcBucket + '/' + srcKey + ' and uploaded to ' + dstBucket + '/' + dstKey); };
  3. npm を使用して、lambda-s3 ディレクトリに sharp ライブラリをインストールします。sharp の最新バージョン (0.33) は Lambda と互換性がないことに注意してください。このチュートリアルを完了するには、バージョン 0.32.6 をインストールしてください。

    npm install sharp@0.32.6

    npm install コマンドによって、モジュール用の node_modules ディレクトリが作成されます。このステップ完了後のディレクトリ構造は、次のようになります。

    lambda-s3 |- index.mjs |- node_modules | |- base64js | |- bl | |- buffer ... |- package-lock.json |- package.json
  4. 関数コードと依存関係が含まれる.zip ファイル形式のデプロイパッケージを作成します。MacOS および Linux では、次のコマンドを実行します。

    zip -r function.zip .

    Windows では、任意の zip ツールを使用して .zip ファイルを作成します。index.mjspackage.jsonpackage-lock.json ファイルと node_modules ディレクトリがすべて、.zip ファイルのルートにあることを確認します。

Python
デプロイパッケージを作成する方法 (Python)
  1. サンプルコードをファイル名 lambda_function.py で保存します。

    import boto3 import os import sys import uuid from urllib.parse import unquote_plus from PIL import Image import PIL.Image s3_client = boto3.client('s3') def resize_image(image_path, resized_path): with Image.open(image_path) as image: image.thumbnail(tuple(x / 2 for x in image.size)) image.save(resized_path) def lambda_handler(event, context): for record in event['Records']: bucket = record['s3']['bucket']['name'] key = unquote_plus(record['s3']['object']['key']) tmpkey = key.replace('/', '') download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey) upload_path = '/tmp/resized-{}'.format(tmpkey) s3_client.download_file(bucket, key, download_path) resize_image(download_path, upload_path) s3_client.upload_file(upload_path, '{}-resized'.format(bucket), 'resized-{}'.format(key))
  2. lambda_function.py ファイルを作成したのと同じディレクトリに、package という名前の新しいディレクトリを作成し、Pillow (PIL) ライブラリと AWS SDK for Python (Boto3) をインストールします。Lambda Python ランタイムには Boto3 SDK のあるバージョンが含まれていますが、ランタイムに含まれている場合でも、関数の依存関係はすべてデプロイパッケージに追加することをお勧めします。詳細については、「Python のランタイム依存関係」を参照してください。

    mkdir package pip install \ --platform manylinux2014_x86_64 \ --target=package \ --implementation cp \ --python-version 3.9 \ --only-binary=:all: --upgrade \ pillow boto3

    Pillow ライブラリには C/C++ コードが含まれています。--platform manylinux_2014_x86_64 および --only-binary=:all: のオプションを使用すると、pip は Amazon Linux 2 オペレーティングシステムと互換性のあるプリコンパイル済みバイナリを含むバージョンの Pillow をダウンロードしてインストールします。これにより、ローカルビルドマシンのオペレーティングシステムやアーキテクチャに関係なく、デプロイパッケージが Lambda 実行環境で動作することが保証されます。

  3. アプリケーションコードと Pillow および Boto3 ライブラリを含む .zip ファイルを作成します。Linux または MacOS では、コマンドラインインターフェイスから次のコマンドを実行します。

    cd package zip -r ../lambda_function.zip . cd .. zip lambda_function.zip lambda_function.py

    Windows では、任意の zip ツールを使用して、lambda_function.zip ファイルを作成します。lambda_function.py ファイルと依存関係が含まれるフォルダは、.zip ファイルのルートにインストールする必要があります。

また、Python 仮想環境を使用してデプロイパッケージを作成することもできます。「Python Lambda 関数で .zip ファイルアーカイブを使用する」を参照してください。

Lambda 関数を作成する

Lambda 関数の手順で、関数を作成しているところを示すチュートリアルのワークフロー図

AWS CLI または Lambda コンソールを使用して、Lambda 関数を作成することができます。選択した言語の指示に従って関数を作成します。

AWS Management Console
関数を作成するには (コンソール)

コンソールを使用して Lambda 関数を作成するには、まず「Hello world」コードが含まれるベーシックな関数を作成します。次に、前のステップで作成した .zip または JAR ファイルをアップロードして、このコードを自身で作成した関数コードへと置き換えます。

  1. Lambda コンソールの関数ページを開きます。

  2. Amazon S3 バケットを作成したときと同じ AWS リージョン で操作していることを確認してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。

    Lambda コンソールのドロップダウンリージョンメニューを示す画像
  3. [関数の作成] を選択します。

  4. Author from scratch を選択します。

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

    1. [関数名] に「CreateThumbnail」と入力します。

    2. [ランタイム] には、関数で選択した言語に応じて [Node.js 18.x] または [Python 3.9] を選択します。

    3. [アーキテクチャ] で [x86_64] を選択します。

  6. [デフォルトの実行ロールの変更] タブで、次の操作を行います。

    1. タブを展開し、[既存のロールを使用する] を選択します。

    2. 先ほど作成した LambdaS3Role を選択します。

  7. [Create function (関数の作成)] を選択します。

関数コードをアップロードする方法 (コンソール)
  1. [コードソース] ペインで、[アップロード元] をクリックします。

  2. [.zip ファイル] をクリックします。

  3. [アップロード] を選択します。

  4. ファイルセレクターで .zip ファイルを選択し、[開く] を選択します。

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

AWS CLI
関数を作成する方法 (AWS CLI)
  • 選択した言語の CLI コマンドを実行します。role パラメータでは、123456789012 を自分自身の AWS アカウント ID へと置き換えます。region パラメータでは、us-west-2 を Amazon S3 バケットを作成したリージョンへと置き換えます。

    • Node.js の場合は、function.zip ファイルが含まれるディレクトリから次のコマンドを実行します。

      aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-west-2
    • Python の場合は、lambda_function.zip ファイルが含まれるディレクトリから次のコマンドを実行します。

      aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://lambda_function.zip --handler lambda_function.lambda_handler \ --runtime python3.9 --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-west-2

関数を呼び出すように Amazon S3 を設定する

トリガーの手順で、Amazon S3 トリガーを作成しているところを示すチュートリアルのワークフロー図

ソース元のバケットに画像をアップロードしたときに Lambda 関数を実行するには、関数のトリガーを設定する必要があります。Amazon S3 トリガーは、コンソールまたは AWS CLI を使用して設定できます。

重要

この手順では、オブジェクトがバケット内に作成されるたびに関数を呼び出すように、Amazon S3 バケットを設定します。この設定は、ソース元バケットのみで行うようにしてください。Lambda 関数が自身を呼び出した同じバケットにオブジェクトを作成する場合、関数が連続的にループして呼び出される可能性があります。その結果、予期しない請求がお客様の AWS アカウント に請求される可能性があります。

AWS Management Console
Amazon S3 トリガーを設定する方法 (コンソール)
  1. Lambda コンソールの [関数] ページを開き、関数を選択します (CreateThumbnail)。

  2. [Add trigger] を選択します。

  3. [S3] を選択します。

  4. [バケット] で、ソース元のバケットを選択します。

  5. [イベントタイプ] で、[すべてのオブジェクト作成イベント] を選択します。

  6. [再帰呼び出し] でチェックボックスを選択して、入力と出力に同じ Amazon S3 バケットを使用することは推奨されないことを確認します。Lambda の再帰呼び出しパターンについて詳しくは、Serverless Land の「Lambda 関数が暴走する原因となる再帰パターン」を参照してください。

  7. 追加] を選択します。

    Lambda コンソールを使用してトリガーを作成すると、Lambda はリソースベースのポリシーを自動的に作成し、選択したサービスに関数を呼び出すアクセス許可を付与します。

AWS CLI
Amazon S3 トリガーを設定する方法 (AWS CLI)
  1. 画像ファイルを追加したときに Amazon S3 ソース元バケットが関数を呼び出すようにするには、まずはリソースベースのポリシーを使用して関数への権限を設定する必要があります。リソースベースのポリシーステートメントが、他の AWS のサービス に関数を呼び出す権限を付与します。Amazon S3 に関数を呼び出す権限を付与するには、次の CLI コマンドを実行します。source-account パラメータは必ず自分自身の AWS アカウント ID に置き換えて、自分自身のソース元バケット名を使用するようにしてください。

    aws lambda add-permission --function-name CreateThumbnail \ --principal s3.amazonaws.com --statement-id s3invoke --action "lambda:InvokeFunction" \ --source-arn arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET \ --source-account 123456789012

    このコマンドで定義するポリシーにより、Amazon S3 はソース元バケットでアクションが発生した場合にのみ、関数を呼び出すことができるようになります。

    注記

    Amazon S3 のバケット名は世界的に一意ですが、リソースベースのポリシーを使用する場合には、バケットがアカウントに属していなければならないことを指定するのがベストプラクティスです。これは、バケットを削除したときに、別の AWS アカウント が同じ Amazon リソースネーム (ARN) でバケットを作成する可能性があるからです。

  2. 次の JSON を notification.json という名のファイルに保存します。この JSON をソースバケットに適用すると、新しいオブジェクトが追加されるたびに Lambda 関数に通知を送信するようにバケットが設定されます。Lambda 関数 ARN の AWS アカウント 番号と AWS リージョン を、自分自身のアカウント番号とリージョンへと置き換えます。

    { "LambdaFunctionConfigurations": [ { "Id": "CreateThumbnailEventConfiguration", "LambdaFunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:CreateThumbnail", "Events": [ "s3:ObjectCreated:Put" ] } ] }
  3. 次の CLI コマンドを実行して、JSON ファイル内に作成した通知設定をソース元のバケットに適用します。DOC-EXAMPLE-SOURCE-BUCKET を自分自身のソース元バケットの名前へと置き換えます。

    aws s3api put-bucket-notification-configuration --bucket DOC-EXAMPLE-SOURCE-BUCKET \ --notification-configuration file://notification.json

    put-bucket-notification-configuration コマンドと notification-configuration オプションの詳細については、「AWS CLI コマンドリファレンス」の「put-bucket-notification-configuration」を参照してください。

Lambda 関数をダミーイベントでテストする

テスト手順において、ダミーイベントでテストしているところを示すチュートリアルのワークフロー図

Amazon S3 ソース元バケットに画像ファイルを追加してセットアップ全体をテストする前に、ダミーイベントで Lambda 関数を呼び出して正しく動作するかどうかをテストします。Lambda 内のイベントは、関数が処理するデータが含まれる JSON 形式のドキュメントです。Amazon S3 によって関数が呼び出されたとき、関数に送信されるイベントには、バケット名、バケット ARN、オブジェクトキーなどの情報が含まれます。

AWS Management Console
Lambda 関数をダミーイベントでテストする方法 (コンソール)
  1. Lambda コンソールの [関数] ページを開き、関数を選択します (CreateThumbnail)。

  2. [テスト] タブを選択します。

  3. テストイベントを作成するには、[テストイベント] ペインで次の操作を行います。

    1. [テストイベントアクション] で、[新しいイベントを作成] を選択します。

    2. イベント名()で、myTestEvent と入力します。

    3. [テンプレート] で [S3 Put] を選択します。

    4. 次のパラメータの値を自分自身の値へと置き換えます。

      • awsRegion では、us-east-1 を Amazon S3 バケットを作成した AWS リージョン へと置き換えます。

      • name では、DOC-EXAMPLE-BUCKET を自分自身の Amazon S3 ソース元バケットの名前へと置き換えます。

      • key では、test%2Fkey を テスト画像をソース元バケットにアップロードする ステップでソース元バケットにアップロードしたテストオブジェクトのファイル名へと置き換えます。

      { "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": "DOC-EXAMPLE-BUCKET", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::DOC-EXAMPLE-BUCKET" }, "object": { "key": "test%2Fkey", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] }
    5. [Save] を選択します。

  4. [テストイベント] ペインで [テスト] を選択します。

  5. 関数によってサイズ変更した画像が作成され、送信先の Amazon S3 バケットに保存されたかどうかを確認するには、以下を実行してください。

    1. Amazon S3 コンソールの [バケットページ] を開きます。

    2. 送信先のバケットを選択し、サイズ変更したファイルが [オブジェクト] ペインに表示されていることを確認します。

AWS CLI
Lambda 関数をダミーイベントでテストする方法 (AWS CLI)
  1. 次の JSON を dummyS3Event.json という名のファイルに保存します。次のパラメータの値を自分自身の値へと置き換えます。

    1. awsRegion では、us-west-2 を Amazon S3 バケットを作成した AWS リージョン へと置き換えます。

    2. name では、DOC-EXAMPLE-SOURCE-BUCKET を自分自身の Amazon S3 ソース元バケットの名前へと置き換えます。

    3. key では、HappyFace.jpg を テスト画像をソース元バケットにアップロードする ステップでソース元バケットにアップロードしたテストオブジェクトのファイル名へと置き換えます。

    { "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"us-west-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"DOC-EXAMPLE-SOURCE-BUCKET", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET" }, "object":{ "key":"HappyFace.jpg", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ] }
  2. dummyS3Event.json ファイルを保存したディレクトリから、次の CLI コマンドを実行して関数を呼び出します。このコマンドは、RequestResponse を呼び出しタイプパラメータの値として指定することにより、Lambda 関数を同期的に呼び出します。同期呼び出しと非同期呼び出しの詳細については、「Lambda 関数の呼び出し」を参照してください。

    aws lambda invoke --function-name CreateThumbnail \ --invocation-type RequestResponse --cli-binary-format raw-in-base64-out \ --payload file://dummyS3Event.json outputfile.txt

    AWS CLI のバージョン 2 を使用している場合は、cli-binary-format オプションが必要です。これをデフォルト設定にするには、aws configure set cli-binary-format raw-in-base64-out を実行します。詳細については、AWS CLI でサポートされているグローバルコマンドラインオプションを参照してください。

  3. 関数が画像のサムネイルバージョンを作成し、それを送信先の Amazon S3 バケットに保存していることを確認します。DOC-EXAMPLE-SOURCE-BUCKET-resized を自分自身の送信先のバケットの名前へと置き換えて、次の CLI コマンドを実行します。

    aws s3api list-objects-v2 --bucket DOC-EXAMPLE-SOURCE-BUCKET-resized

    次のような出力が表示されます。Key パラメータには、サイズ変更された画像ファイルのファイル名が表示されます。

    { "Contents": [ { "Key": "resized-HappyFace.jpg", "LastModified": "2023-06-06T21:40:07+00:00", "ETag": "\"d8ca652ffe83ba6b721ffc20d9d7174a\"", "Size": 2633, "StorageClass": "STANDARD" } ] }

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

テストの手順で、バケットを Amazon S3 にアップロードしているところを示すチュートリアルのワークフロー図

Lambda 関数が正しく動作していることを確認した後は、Amazon S3 ソース元バケットに画像ファイルを追加して、セットアップ全体をテストします。ソース元バケットに画像を追加すると、Lambda 関数が自動的に呼び出されるはずです。関数がファイルのサイズを変更したバージョンを作成し、送信先のバケットに保存します。

AWS Management Console
Amazon S3 トリガーを使用して Lambda 関数をテストする方法 (コンソール)
  1. 画像を Amazon S3 バケットにアップロードするには、以下を実行します。

    1. Amazon S3 コンソールの[バケット] ページを開き、ソース元のバケットを選択します。

    2. [アップロード] を選択します。

    3. [ファイルを追加] を選択し、ファイルセレクターを使用してアップロードする画像ファイルを選択します。画像オブジェクトには、任意の .jpg ファイルまたは.png ファイルを使用できます。

    4. [開く][アップロード] の順に選択します。

  2. 以下を実行して、Lambda が画像ファイルのサイズを変更したバージョンを送信先のバケットに保存したことを確認します。

    1. Amazon S3 コンソールの [バケット] ページに戻り、送信先バケットを選択します。

    2. [オブジェクト] ペインに、Lambda 関数に対する各テストで 1 つずつ作成された、合計 2 つのサイズ変更された画像ファイルが表示されるはずです。サイズを変更した画像をダウンロードするには、ファイルを選択してから [Download] を選択します。

AWS CLI
Amazon S3 トリガーを使用して Lambda 関数をテストする方法 (AWS CLI)
  1. アップロードする画像が含まれるディレクトリから、次の CLI コマンドを実行します。--bucket パラメータをソース元バケットの名前に置き換えます。--key および --body パラメータには、テスト画像のファイル名を使用します。テスト画像には、任意の .jpg ファイルまたは .png ファイルを使用できます。

    aws s3api put-object --bucket DOC-EXAMPLE-SOURCE-BUCKET --key SmileyFace.jpg --body ./SmileyFace.jpg
  2. 関数が画像のサムネイルバージョンを作成し、それを送信先の Amazon S3 バケットに保存していることを確認します。DOC-EXAMPLE-SOURCE-BUCKET-resized を自分自身の送信先のバケットの名前へと置き換えて、次の CLI コマンドを実行します。

    aws s3api list-objects-v2 --bucket DOC-EXAMPLE-SOURCE-BUCKET-resized

    関数が正常に実行されると、以下に類似した出力が表示されます。これで、送信先のバケットに、サイズ変更されたファイルが 2 つ含まれるはずです。

    { "Contents": [ { "Key": "resized-HappyFace.jpg", "LastModified": "2023-06-07T00:15:50+00:00", "ETag": "\"7781a43e765a8301713f533d70968a1e\"", "Size": 2763, "StorageClass": "STANDARD" }, { "Key": "resized-SmileyFace.jpg", "LastModified": "2023-06-07T00:13:18+00:00", "ETag": "\"ca536e5a1b9e32b22cd549e18792cdbc\"", "Size": 1245, "StorageClass": "STANDARD" } ] }

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

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

Lambda 関数を削除するには
  1. Lambda コンソールの関数ページを開きます。

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

  3. [アクション] で、[削除] を選択します。

  4. テキスト入力フィールドに delete と入力し、[削除] を選択します。

作成したポリシーを削除する
  1. IAM コンソールの [Policies (ポリシー)] ページを開きます。

  2. 作成したポリシー (AWSLambdaS3Policy) を選択します。

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

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

実行ロールを削除するには
  1. IAM コンソールのロールページを開きます。

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

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

  4. テキスト入力フィールドにロールの名前を入力し、[削除] を選択します。

S3 バケットを削除するには
  1. Amazon S3 コンソールを開きます。

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

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

  4. テキスト入力フィールドにバケットの名前を入力します。

  5. [バケットの削除] を選択します。