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

このチュートリアルを完了するには、次のステップを実行します。
-
ソース元と保存先の Amazon S3 バケットを作成し、サンプル画像をアップロードします。
-
画像のサイズを変更し、Amazon S3 バケットにサムネイルを出力する Lambda 関数 を作成します。
-
オブジェクトがソースバケットにアップロードされたときに、関数を呼び出す Lambda トリガーを設定します。
-
最初にダミーイベントを使用して関数をテストし、その後画像をソースバケットにアップロードしてテストします。
これらのステップを完了することで、Lambda を使用して Amazon S3 バケットに追加されたオブジェクトに対してファイル処理タスクを実行する方法が分かるようになります。AWS Command Line Interface または AWS CLI(AWS Management Console) を使って、このチュートリアルを完了できます。
Lambda 用に Amazon S3 トリガーを設定する方法を知るための、より簡単な例が必要であれば、「チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す」をお試しください。
トピック
前提条件
AWS CLI を使用してチュートリアルを完了する場合は、AWS Command Line Interface の最新バージョンをインストールしてください。
Lambda 関数コードには、Python または Node.js を使用できます。使用する言語の言語サポートツールとパッケージマネージャーをインストールします。
AWS Command Line Interface をまだインストールしていない場合は、「最新バージョンの AWS CLI のインストールまたは更新」にある手順に従ってインストールしてください。
このチュートリアルでは、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要です。Linux および macOS では、任意のシェルとパッケージマネージャーを使用してください。
注記
Windows では、Lambda でよく使用される一部の Bash CLI コマンド (zip
など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、Windows Subsystem for Linux をインストール
2 つの Amazon S3 バケットを作成する

まず、2 つの Amazon S3 バケットを作成します。1 つ目のバケットは、画像をアップロードするソースバケットです。2 つ目のバケットは、関数を呼び出したときにサイズ変更されたサムネイルを保存するために Lambda が使用するバケットです。
Amazon S3 バケットを作成する方法 (コンソール)
-
[Amazon S3 コンソール]
を開き、[汎用バケット] ページを選択します。 -
住まいの地域に最も近い AWS リージョン を選択してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。チュートリアルの後半では、同じリージョンで Lambda 関数を作成する必要があります。
-
[バケットを作成する] を選択します。
-
[全般設定] で、次の操作を行います。
-
[バケットタイプ] で、[汎用] が選択されていることを確認してください。
-
[バケット名] には、Amazon S3 バケットの命名規則を満たすグローバルに一意な名前を入力します。バケット名は、小文字、数字、ドット (.)、およびハイフン (-) のみで構成できます。
-
-
他のすべてのオプションはデフォルト設定値のままにしておき、[バケットの作成] を選択します。
-
ステップ 1 ~ 5 を繰り返して、送信先のバケットを作成します。[バケット名] には
と入力します。amzn-s3-demo-source-bucket-resized
は先ほど作成したソース元バケットの名前です。amzn-s3-demo-source-bucket
テスト画像をソース元バケットにアップロードする

チュートリアルの後半では、AWS CLI または Lambda コンソールを使用して、Lambda 関数を呼び出してテストします。関数が正しく動作していることを確認するために、ソース元バケットにはテスト画像が含まれている必要があります。この画像には、任意の JPG または PNG ファイルを使用できます。
テスト画像をソース元バケットにアップロードする方法 (コンソール)
-
Amazon S3 コンソールのバケット
ページを開きます。 -
前のステップで作成したソースバケットを選択します。
-
[アップロード] を選択します。
-
[ファイルを追加] を選択し、ファイルセレクターを使用してアップロードするオブジェクトを選択します。
-
[開く]、[アップロード] の順に選択します。
許可ポリシーを作成する

Lambda 関数を作成するための最初のステップは、許可ポリシーを作成することです。このポリシーは、他の AWS リソースにアクセスするために必要となるアクセス許可を関数に付与します。このチュートリアルでは、ポリシーにより Lambda に Amazon S3 バケットの読み取り権限と書き込み権限が付与され、Amazon CloudWatch Logs に書き込めるようになります。
ポリシーを作成する方法 (コンソール)
-
AWS Identity and Access Management (IAM) コンソールの [Policies (ポリシー)] ページ
を開きます。 -
[Create policy] を選択します。
-
[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:::*/*" } ] }
-
[Next] を選択します。
-
[ポリシーの詳細] で [ポリシー名] に「
」と入力します。LambdaS3Policy
-
[Create policy] を選択します。
実行ロールを作成する

実行ロールとは、AWS のサービス とリソースにアクセスする許可を Lambda 関数に付与する IAM ロールです。関数に Amazon S3 バケットへの読み取りおよび書き込みアクセス許可を付与するには、前のステップで作成した許可ポリシーをアタッチします。
実行ロールを作成して、許可ポリシーをアタッチする方法 (コンソール)
-
(IAM) コンソールの [ロール]
ページを開きます。 -
[ロールの作成] を選択します。
-
[信頼できるエンティティタイプ] で AWS のサービス を選択し、[ユースケース] では [Lambda] を選択します。
-
[Next] を選択します。
-
次の手順を実行して、前のステップで作成した許可ポリシーを追加します。
-
ポリシー検索ボックスに、「
」と入力します。LambdaS3Policy
-
検索結果内にある
LambdaS3Policy
のチェックボックスを選択します。 -
[Next] を選択します。
-
-
[ロールの詳細] にある [ロール名] には
を入力します。LambdaS3Role
-
[ロールの作成] を選択します。
関数デプロイパッケージを作成する

関数を作成するには、関数コードとその依存関係を含むデプロイパッケージを作成します。この CreateThumbnail
関数では、関数コードで画像のサイズ変更に別のライブラリを使用します。選択した言語の指示に従って、必要なライブラリを含むデプロイパッケージを作成します。
デプロイパッケージを作成する方法 (Node.js)
-
関数コードと依存関係用に
lambda-s3
という名前のディレクトリを作成し、そこに移動します。mkdir lambda-s3 cd lambda-s3
-
npm
で新しい Node.js プロジェクトを作成します。インタラクティブな形式で提供されるデフォルトオプションを受け入れるには、Enter
を押します。npm init
-
以下の関数コードを
index.mjs
という名のファイルに保存します。必ずus-east-1
を 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-east-1'
}); // 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); }; -
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
-
関数コードと依存関係が含まれる.zip ファイル形式のデプロイパッケージを作成します。MacOS および Linux では、次のコマンドを実行します。
zip -r function.zip .
Windows では、任意の zip ツールを使用して .zip ファイルを作成します。
index.mjs
、package.json
、package-lock.json
ファイルとnode_modules
ディレクトリがすべて、.zip ファイルのルートにあることを確認します。
Lambda 関数を作成する

AWS CLI または Lambda コンソールを使用して、Lambda 関数を作成することができます。選択した言語の指示に従って関数を作成します。
関数を作成するには (コンソール)
コンソールを使用して Lambda 関数を作成するには、まず「Hello world」コードが含まれるベーシックな関数を作成します。次に、前のステップで作成した .zip または JAR ファイルをアップロードして、このコードを自身で作成した関数コードへと置き換えます。
-
Lambda コンソールの関数
ページを開きます。 -
Amazon S3 バケットを作成したときと同じ AWS リージョン で操作していることを確認してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。
-
[関数の作成] を選択します。
-
Author from scratch を選択します。
-
基本的な情報 で、以下の作業を行います。
-
[関数名] に「
」と入力します。CreateThumbnail
-
[ランタイム] には、関数に選択した言語に応じて [Node.js 22.x] または [Python 3.12] を選択します。
-
[アーキテクチャ] で [x86_64] を選択します。
-
-
[デフォルトの実行ロールの変更] タブで、次の操作を行います。
-
タブを展開し、[既存のロールを使用する] を選択します。
-
先ほど作成した
LambdaS3Role
を選択します。
-
-
[Create function (関数の作成)] を選択します。
関数コードをアップロードする方法 (コンソール)
-
[コードソース] ペインで、[アップロード元] をクリックします。
-
[.zip ファイル] をクリックします。
-
[アップロード] を選択します。
-
ファイルセレクターで .zip ファイルを選択し、[開く] を選択します。
-
[Save] を選択します。
関数を呼び出すように Amazon S3 を設定する

ソース元のバケットに画像をアップロードしたときに Lambda 関数を実行するには、関数のトリガーを設定する必要があります。Amazon S3 トリガーは、コンソールまたは AWS CLI を使用して設定できます。
重要
この手順では、オブジェクトがバケット内に作成されるたびに関数を呼び出すように、Amazon S3 バケットを設定します。この設定は、ソース元バケットのみで行うようにしてください。Lambda 関数が自身を呼び出した同じバケットにオブジェクトを作成する場合、関数が連続的にループして呼び出される
Amazon S3 トリガーを設定する方法 (コンソール)
-
Lambda コンソールの [関数]
ページを開き、関数を選択します ( CreateThumbnail
)。 -
[Add trigger] を選択します。
-
[S3] を選択します。
-
[バケット] で、ソース元のバケットを選択します。
-
[イベントタイプ] で、[すべてのオブジェクト作成イベント] を選択します。
-
[再帰呼び出し] でチェックボックスを選択して、入力と出力に同じ Amazon S3 バケットを使用することは推奨されないことを確認します。Lambda の再帰呼び出しパターンについて詳しくは、Serverless Land の「Lambda 関数が暴走する原因となる再帰パターン
」を参照してください。 -
[追加] を選択します。
Lambda コンソールを使用してトリガーを作成すると、Lambda はリソースベースのポリシーを自動的に作成し、選択したサービスに関数を呼び出すアクセス許可を付与します。
Lambda 関数をダミーイベントでテストする

Amazon S3 ソース元バケットに画像ファイルを追加してセットアップ全体をテストする前に、ダミーイベントで Lambda 関数を呼び出して正しく動作するかどうかをテストします。Lambda 内のイベントは、関数が処理するデータが含まれる JSON 形式のドキュメントです。Amazon S3 によって関数が呼び出されたとき、関数に送信されるイベントには、バケット名、バケット ARN、オブジェクトキーなどの情報が含まれます。
Lambda 関数をダミーイベントでテストする方法 (コンソール)
-
Lambda コンソールの [関数]
ページを開き、関数を選択します ( CreateThumbnail
)。 -
[テスト] タブを選択します。
-
テストイベントを作成するには、[テストイベント] ペインで次の操作を行います。
-
[テストイベントアクション] で、[新しいイベントを作成] を選択します。
-
イベント名()で、
myTestEvent
と入力します。 -
[テンプレート] で [S3 Put] を選択します。
-
次のパラメータの値を自分自身の値へと置き換えます。
-
awsRegion
では、us-east-1
を Amazon S3 バケットを作成した AWS リージョン へと置き換えます。 -
name
では、amzn-s3-demo-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":"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] を選択します。
-
-
[テストイベント] ペインで [テスト] を選択します。
-
関数によってサイズ変更した画像が作成され、送信先の Amazon S3 バケットに保存されたかどうかを確認するには、以下を実行してください。
-
Amazon S3 コンソールの [バケットページ]
を開きます。 -
送信先のバケットを選択し、サイズ変更したファイルが [オブジェクト] ペインに表示されていることを確認します。
-
Amazon S3 トリガーを使用して関数をテストする

Lambda 関数が正しく動作していることを確認した後は、Amazon S3 ソース元バケットに画像ファイルを追加して、セットアップ全体をテストします。ソース元バケットに画像を追加すると、Lambda 関数が自動的に呼び出されるはずです。関数がファイルのサイズを変更したバージョンを作成し、送信先のバケットに保存します。
Amazon S3 トリガーを使用して Lambda 関数をテストする方法 (コンソール)
-
画像を Amazon S3 バケットにアップロードするには、以下を実行します。
-
Amazon S3 コンソールの[バケット]
ページを開き、ソース元のバケットを選択します。 -
[アップロード] を選択します。
-
[ファイルを追加] を選択し、ファイルセレクターを使用してアップロードする画像ファイルを選択します。画像オブジェクトには、任意の .jpg ファイルまたは.png ファイルを使用できます。
-
[開く]、[アップロード] の順に選択します。
-
-
以下を実行して、Lambda が画像ファイルのサイズを変更したバージョンを送信先のバケットに保存したことを確認します。
-
Amazon S3 コンソールの [バケット]
ページに戻り、送信先バケットを選択します。 -
[オブジェクト] ペインに、Lambda 関数に対する各テストで 1 つずつ作成された、合計 2 つのサイズ変更された画像ファイルが表示されるはずです。サイズを変更した画像をダウンロードするには、ファイルを選択してから [Download] を選択します。
-
リソースのクリーンアップ
このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウント アカウントに請求される料金の発生を防ぎます。
Lambda 関数を削除するには
-
Lambda コンソールの関数
ページを開きます。 -
作成した関数を選択します。
-
[アクション] で、[削除] を選択します。
-
テキスト入力フィールドに
confirm
と入力し、[削除] を選択します。
作成したポリシーを削除する
-
IAM コンソールの [Policies (ポリシー)]
ページを開きます。 -
作成したポリシー (AWSLambdaS3Policy) を選択します。
-
[ポリシーアクション]、[削除] の順に選択します。
-
[削除] を選択します。
実行ロールを削除するには
-
IAM コンソールのロールページ
を開きます。 -
作成した実行ロールを選択します。
-
[削除] を選択します。
-
テキスト入力フィールドにロールの名前を入力し、[削除] を選択します。
S3 バケットを削除するには
-
Amazon S3 コンソール
を開きます。 -
作成したバケットを選択します。
-
[削除] を選択します。
-
テキスト入力フィールドにバケットの名前を入力します。
-
[バケットの削除] を選択します。