

# Lambda を使用した Amazon S3 イベント通知の処理
<a name="with-s3"></a>

Amazon Simple Storage Service からの[イベント通知](https://docs.aws.amazon.com/AmazonS3/latest/userguide/NotificationHowTo.html)は、Lambda を使用して処理することができます。Amazon S3 は、オブジェクトを作成または削除するときに、イベントを Lambda 関数に送信できます。バケットの通知設定を構成し、関数のリソースベースのアクセス許可ポリシーで関数を呼び出すためのアクセス許可を Amazon S3 に付与します。

**警告**  
 Lambda 関数で使用するバケットが、その関数をトリガーするのと同じバケットである場合、関数はループで実行される可能性があります。たとえば、オブジェクトがアップロードされるたびにバケットで関数をトリガーし、その関数によってオブジェクトがバケットにアップロードされると、その関数によって間接的にその関数自体がトリガーされます。これを回避するには、2 つのバケットを使用するか、受信オブジェクトで使用されるプレフィックスにのみ適用されるようにトリガーを設定します。

Amazon S3 は、オブジェクトに関する詳細を含むイベントで[非同期に](invocation-async.md)関数を呼び出します。次の例は、デプロイパッケージが Amazon S3 にアップロードされたときに Amazon S3 から送信されたイベントを示しています。

**Example Amazon S3 の通知イベント**  

```
{
  "Records": [
    {
      "eventVersion": "2.1",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-2",
      "eventTime": "2019-09-03T19:37:27.192Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "AWS:AIDAINPONIXQXHT3IKHL2"
      },
      "requestParameters": {
        "sourceIPAddress": "205.255.255.255"
      },
      "responseElements": {
        "x-amz-request-id": "D82B88E5F771F645",
        "x-amz-id-2": "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo="
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1",
        "bucket": {
          "name": "amzn-s3-demo-bucket",
          "ownerIdentity": {
            "principalId": "A3I5XTEXAMAI3E"
          },
          "arn": "arn:aws:s3:::lambda-artifacts-deafc19498e3f2df"
        },
        "object": {
          "key": "b21b84d653bb07b05b1e6b33684dc11b",
          "size": 1305107,
          "eTag": "b21b84d653bb07b05b1e6b33684dc11b",
          "sequencer": "0C0F6F405D6ED209E1"
        }
      }
    }
  ]
}
```

関数を呼び出すには、Amazon S3 には、関数の[リソースベースのポリシー](access-control-resource-based.md)によるアクセス許可が必要です。Lambda コンソールで Amazon S3 トリガーを設定すると、バケット名とアカウント ID が一致した場合に Amazon S3 で関数を呼び出せるように、コンソールでリソースベースのポリシーが変更されます。Amazon S3 の通知を設定する場合は、Lambda API を使用してこのポリシーを更新します。また、Lambda API を使用して、別のアカウントにアクセス許可を付与したり、指定されたエイリアスへのアクセス許可を制限したりできます。

関数で AWS SDK を使用して Amazon S3 リソースを管理する場合は、その[実行ロール](lambda-intro-execution-role.md)にも Amazon S3 のアクセス許可が必要です。

**Topics**
+ [

# チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す
](with-s3-example.md)
+ [

# チュートリアル: Amazon S3 トリガーを使用してサムネイル画像を作成する
](with-s3-tutorial.md)

# チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す
<a name="with-s3-example"></a>

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

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-example/s3_tut_config.png)


このチュートリアルでは、次の方法を示します。

1. Amazon S3 バケットを作成する。

1. Amazon S3 バケット内のオブジェクトのオブジェクトタイプを返す Lambda 関数を作成します。

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

1. 最初にダミーイベントを使用して関数をテストし、次にトリガーを使用してテストします。

これらのステップを完了することにより、Amazon S3 バケットにオブジェクトが追加されたり、Amazon S3 バケットから削除されたりするたびに実行されるように Lambda 関数を設定する方法を学びます。AWS マネジメントコンソール のみを使って、このチュートリアルを完了できます。

## Amazon S3 バケットを作成する
<a name="with-s3-example-create-bucket"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps1.png)


**Amazon S3 バケットを作成するには**

1. [[Amazon S3 コンソール]](https://console.aws.amazon.com/s3) を開き、**[汎用バケット]** ページを選択します。

1. 住まいの地域に最も近い AWS リージョン を選択してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。チュートリアルの後半では、同じリージョンで Lambda 関数を作成する必要があります。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/console_region_select.png)

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

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

   1. **[バケットタイプ]** で、**[汎用]** が選択されていることを確認してください。

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

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

## テストオブジェクトをバケットにアップロードする
<a name="with-s3-example-upload-test-object"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps2.png)


**テストオブジェクトをアップロードするには**

1. Amazon S3 コンソールの[バケット](https://console.aws.amazon.com/s3/buckets)ページを開き、前のステップで作成したバケットを選択します。

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

1. **[ファイルを追加]** を選択し、アップロードするファイルを選択します。任意のファイルを選択できます (例えば、`HappyFace.jpg`)。

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

チュートリアルの後半では、このオブジェクトを使用して Lambda 関数をテストします。

## 許可ポリシーを作成する
<a name="with-s3-example-create-policy"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps3.png)


Lambda が Amazon S3 バケットからオブジェクトを取得し、Amazon CloudWatch Logs に書き込めるようにする許可ポリシーを作成します。

**ポリシーを作成するには**

1. IAM コンソールの[ポリシー](https://console.aws.amazon.com/iam/home#/policies)ページを開きます。

1. **[ポリシーの作成]** を選択します。

1. **[JSON]** タブを選択して、次のカスタムポリシーを 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:::*/*"
           }
       ]
   }
   ```

------

1. **[次へ: タグ]** を選択します。

1. **[次へ: レビュー]** を選択します。

1. **[ポリシーの確認]** でポリシーの **[名前]** に「**s3-trigger-tutorial**」と入力します。

1. **[ポリシーの作成]** を選択します。

## 実行ロールを作成する
<a name="with-s3-example-create-role"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps4.png)


[実行ロール](lambda-intro-execution-role.md)とは、AWS のサービス およびリソースに対するアクセス許可を Lambda 関数に付与する AWS Identity and Access Management (IAM) のロールです。この手順では、前のステップで作成したアクセス権限ポリシーを使用して実行ロールを作成します。

**実行ロールを作成して、カスタム許可ポリシーをアタッチするには**

1. IAM コンソールの[ロールページ](https://console.aws.amazon.com/iam/home#/roles)を開きます。

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

1. 信頼されたエンティティには、**[AWS サービス]** を選択し、ユースケースには **[Lambda]** を選択します。

1. **[次へ]** をクリックします。

1. ポリシー検索ボックスに、「**s3-trigger-tutorial**」と入力します。

1. 検索結果で作成したポリシー (`s3-trigger-tutorial`) を選択し、**[次へ]** を選択します。

1. **[ロールの詳細]** で **[ロール名]** に **lambda-s3-trigger-role** を入力してから、**[ロールの作成]** を選択します。

## Lambda 関数を作成する
<a name="with-s3-example-create-function"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps5.png)


Python 3.14 ランタイムを使用してコンソールで Lambda 関数を作成します。

**Lambda 関数を作成するには**

1. Lambda コンソールの[関数](https://console.aws.amazon.com/lambda/home#/functions)ページを開きます。

1. Amazon S3 バケットを作成したときと同じ AWS リージョン で操作していることを確認してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/console_region_select.png)

1. **[関数の作成]** を選択します。

1. **[一から作成]** を選択します。

1. **[基本的な情報]** で、以下を実行します。

   1. **[関数名]** に `s3-trigger-tutorial` と入力します。

   1. **[ランタイム]** には、**[Python 3.14]** を選択します。

   1. **[アーキテクチャ]** で **[x86\$164]** を選択します。

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

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

   1. 先ほど作成した `lambda-s3-trigger-role` を選択します。

1. [**関数の作成**] を選択してください。

## 関数コードをデプロイする
<a name="with-s3-example-deploy-code"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps6.png)


このチュートリアルは Python 3.14 ランタイムを使用しますが、他のランタイム用のサンプルコードのファイルも用意しています。次のボックスでタブを選択すると、関心のあるランタイムのコードが表示されます。

Lambda 関数は、Amazon S3 から受信する `event` パラメータから、アップロードされたオブジェクトのキー名およびバケットの名前を取得します。次に、関数は AWS SDK for Python (Boto3) から「[get\$1object](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/get_object.html)」メソッドを使用し、アップロードされたオブジェクトのコンテンツタイプ (MIME タイプ) を含むオブジェクトのメタデータを取得します。

**関数コードをデプロイするには**

1. 次のボックスで **[Python]** タブを選択し、コードをコピーします。

------
#### [ .NET ]

**SDK for .NET**  
 GitHub には、その他のリソースもあります。[サーバーレスサンプル](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda)リポジトリで完全な例を検索し、設定および実行の方法を確認してください。
.NET を使用して Lambda で S3 イベントを消費します。  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   ﻿using System.Threading.Tasks;
   using Amazon.Lambda.Core;
   using Amazon.S3;
   using System;
   using Amazon.Lambda.S3Events;
   using System.Web;
   
   // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
   [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
   
   namespace S3Integration
   {
       public class Function
       {
           private static AmazonS3Client _s3Client;
           public Function() : this(null)
           {
           }
   
           internal Function(AmazonS3Client s3Client)
           {
               _s3Client = s3Client ?? new AmazonS3Client();
           }
   
           public async Task<string> Handler(S3Event evt, ILambdaContext context)
           {
               try
               {
                   if (evt.Records.Count <= 0)
                   {
                       context.Logger.LogLine("Empty S3 Event received");
                       return string.Empty;
                   }
   
                   var bucket = evt.Records[0].S3.Bucket.Name;
                   var key = HttpUtility.UrlDecode(evt.Records[0].S3.Object.Key);
   
                   context.Logger.LogLine($"Request is for {bucket} and {key}");
   
                   var objectResult = await _s3Client.GetObjectAsync(bucket, key);
   
                   context.Logger.LogLine($"Returning {objectResult.Key}");
   
                   return objectResult.Key;
               }
               catch (Exception e)
               {
                   context.Logger.LogLine($"Error processing request - {e.Message}");
   
                   return string.Empty;
               }
           }
       }
   }
   ```

------
#### [ Go ]

**SDK for Go V2**  
 GitHub には、その他のリソースもあります。[サーバーレスサンプル](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda)リポジトリで完全な例を検索し、設定および実行の方法を確認してください。
Go を使用して Lambda で S3 イベントを消費します。  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   package main
   
   import (
   	"context"
   	"log"
   
   	"github.com/aws/aws-lambda-go/events"
   	"github.com/aws/aws-lambda-go/lambda"
   	"github.com/aws/aws-sdk-go-v2/config"
   	"github.com/aws/aws-sdk-go-v2/service/s3"
   )
   
   func handler(ctx context.Context, s3Event events.S3Event) error {
   	sdkConfig, err := config.LoadDefaultConfig(ctx)
   	if err != nil {
   		log.Printf("failed to load default config: %s", err)
   		return err
   	}
   	s3Client := s3.NewFromConfig(sdkConfig)
   
   	for _, record := range s3Event.Records {
   		bucket := record.S3.Bucket.Name
   		key := record.S3.Object.URLDecodedKey
   		headOutput, err := s3Client.HeadObject(ctx, &s3.HeadObjectInput{
   			Bucket: &bucket,
   			Key:    &key,
   		})
   		if err != nil {
   			log.Printf("error getting head of object %s/%s: %s", bucket, key, err)
   			return err
   		}
   		log.Printf("successfully retrieved %s/%s of type %s", bucket, key, *headOutput.ContentType)
   	}
   
   	return nil
   }
   
   func main() {
   	lambda.Start(handler)
   }
   ```

------
#### [ Java ]

**SDK for Java 2.x**  
 GitHub には、その他のリソースもあります。[サーバーレスサンプル](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda)リポジトリで完全な例を検索し、設定および実行の方法を確認してください。
Java を使用した Lambda での S3 イベントの消費。  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   package example;
   
   import software.amazon.awssdk.services.s3.model.HeadObjectRequest;
   import software.amazon.awssdk.services.s3.model.HeadObjectResponse;
   import software.amazon.awssdk.services.s3.S3Client;
   
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import com.amazonaws.services.lambda.runtime.events.S3Event;
   import com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification.S3EventNotificationRecord;
   
   import org.slf4j.Logger;
   import org.slf4j.LoggerFactory;
   
   public class Handler implements RequestHandler<S3Event, String> {
       private static final Logger logger = LoggerFactory.getLogger(Handler.class);
       @Override
       public String handleRequest(S3Event s3event, Context context) {
           try {
             S3EventNotificationRecord record = s3event.getRecords().get(0);
             String srcBucket = record.getS3().getBucket().getName();
             String srcKey = record.getS3().getObject().getUrlDecodedKey();
   
             S3Client s3Client = S3Client.builder().build();
             HeadObjectResponse headObject = getHeadObject(s3Client, srcBucket, srcKey);
   
             logger.info("Successfully retrieved " + srcBucket + "/" + srcKey + " of type " + headObject.contentType());
   
             return "Ok";
           } catch (Exception e) {
             throw new RuntimeException(e);
           }
       }
   
       private HeadObjectResponse getHeadObject(S3Client s3Client, String bucket, String key) {
           HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()
                   .bucket(bucket)
                   .key(key)
                   .build();
           return s3Client.headObject(headObjectRequest);
       }
   }
   ```

------
#### [ JavaScript ]

**SDK for JavaScript (v3)**  
 GitHub には、その他のリソースもあります。[サーバーレスサンプル](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda)リポジトリで完全な例を検索し、設定および実行の方法を確認してください。
JavaScript を使用した Lambda での S3 イベントの消費。  

   ```
   import { S3Client, HeadObjectCommand } from "@aws-sdk/client-s3";
   
   const client = new S3Client();
   
   export const handler = async (event, context) => {
   
       // 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, ' '));
   
       try {
           const { ContentType } = await client.send(new HeadObjectCommand({
               Bucket: bucket,
               Key: key,
           }));
   
           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);
       }
   };
   ```
TypeScript を使用した Lambda での S3 イベントの消費。  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import { S3Event } from 'aws-lambda';
   import { S3Client, HeadObjectCommand } from '@aws-sdk/client-s3';
   
   const s3 = new S3Client({ region: process.env.AWS_REGION });
   
   export const handler = async (event: S3Event): Promise<string | undefined> => {
     // 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.send(new HeadObjectCommand(params));
       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);
     }
   };
   ```

------
#### [ PHP ]

**SDK for PHP**  
 GitHub には、その他のリソースもあります。[サーバーレスサンプル](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda)リポジトリで完全な例を見つけて、設定と実行の方法を確認してください。
PHP を使用して Lambda で S3 イベントの消費。  

   ```
   <?php
   
   use Bref\Context\Context;
   use Bref\Event\S3\S3Event;
   use Bref\Event\S3\S3Handler;
   use Bref\Logger\StderrLogger;
   
   require __DIR__ . '/vendor/autoload.php';
   
   
   class Handler extends S3Handler 
   {
       private StderrLogger $logger;
       public function __construct(StderrLogger $logger)
       {
           $this->logger = $logger;
       }
       
       public function handleS3(S3Event $event, Context $context) : void
       {
           $this->logger->info("Processing S3 records");
   
           // Get the object from the event and show its content type
           $records = $event->getRecords();
           
           foreach ($records as $record) 
           {
               $bucket = $record->getBucket()->getName();
               $key = urldecode($record->getObject()->getKey());
   
               try {
                   $fileSize = urldecode($record->getObject()->getSize());
                   echo "File Size: " . $fileSize . "\n";
                   // TODO: Implement your custom processing logic here
               } catch (Exception $e) {
                   echo $e->getMessage() . "\n";
                   echo 'Error getting object ' . $key . ' from bucket ' . $bucket . '. Make sure they exist and your bucket is in the same region as this function.' . "\n";
                   throw $e;
               }
           }
       }
   }
   
   $logger = new StderrLogger();
   return new Handler($logger);
   ```

------
#### [ Python ]

**SDK for Python (Boto3)**  
 GitHub には、その他のリソースもあります。[サーバーレスサンプル](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda)リポジトリで完全な例を検索し、設定および実行の方法を確認してください。
Python を使用して Lambda で S3 イベントを消費します。  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   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
   ```

------
#### [ Ruby ]

**SDK for Ruby**  
 GitHub には、その他のリソースもあります。[サーバーレスサンプル](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda)リポジトリで完全な例を見つけて、設定と実行の方法を確認してください。
Ruby を使用して Lambda での S3 イベントの消費。  

   ```
   require 'json'
   require 'uri'
   require 'aws-sdk'
   
   puts 'Loading function'
   
   def lambda_handler(event:, context:)
     s3 = Aws::S3::Client.new(region: 'region') # Your AWS region
     # puts "Received event: #{JSON.dump(event)}"
   
     # Get the object from the event and show its content type
     bucket = event['Records'][0]['s3']['bucket']['name']
     key = URI.decode_www_form_component(event['Records'][0]['s3']['object']['key'], Encoding::UTF_8)
     begin
       response = s3.get_object(bucket: bucket, key: key)
       puts "CONTENT TYPE: #{response.content_type}"
       return response.content_type
     rescue StandardError => e
       puts e.message
       puts "Error getting object #{key} from bucket #{bucket}. Make sure they exist and your bucket is in the same region as this function."
       raise e
     end
   end
   ```

------
#### [ Rust ]

**SDK for Rust**  
 GitHub には、その他のリソースもあります。[サーバーレスサンプル](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda)リポジトリで完全な例を検索し、設定および実行の方法を確認してください。
Rust を使用して Lambda で S3 イベントを消費します。  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   use aws_lambda_events::event::s3::S3Event;
   use aws_sdk_s3::{Client};
   use lambda_runtime::{run, service_fn, Error, LambdaEvent};
   
   
   /// Main function
   #[tokio::main]
   async fn main() -> Result<(), Error> {
       tracing_subscriber::fmt()
           .with_max_level(tracing::Level::INFO)
           .with_target(false)
           .without_time()
           .init();
   
       // Initialize the AWS SDK for Rust
       let config = aws_config::load_from_env().await;
       let s3_client = Client::new(&config);
   
       let res = run(service_fn(|request: LambdaEvent<S3Event>| {
           function_handler(&s3_client, request)
       })).await;
   
       res
   }
   
   async fn function_handler(
       s3_client: &Client,
       evt: LambdaEvent<S3Event>
   ) -> Result<(), Error> {
       tracing::info!(records = ?evt.payload.records.len(), "Received request from SQS");
   
       if evt.payload.records.len() == 0 {
           tracing::info!("Empty S3 event received");
       }
   
       let bucket = evt.payload.records[0].s3.bucket.name.as_ref().expect("Bucket name to exist");
       let key = evt.payload.records[0].s3.object.key.as_ref().expect("Object key to exist");
   
       tracing::info!("Request is for {} and object {}", bucket, key);
   
       let s3_get_object_result = s3_client
           .get_object()
           .bucket(bucket)
           .key(key)
           .send()
           .await;
   
       match s3_get_object_result {
           Ok(_) => tracing::info!("S3 Get Object success, the s3GetObjectResult contains a 'body' property of type ByteStream"),
           Err(_) => tracing::info!("Failure with S3 Get Object request")
       }
   
       Ok(())
   }
   ```

------

1. Lambda コンソールの **[コードソース]** ペインで、コードをコードエディタに貼り付け、Lambda が作成したコードを置き換えます。

1. **[DEPLOY]** セクションで、**[デプロイ]** を選択して関数のコードを更新します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## Amazon S3 トリガーを作成する
<a name="with-s3-example-create-trigger"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps7.png)


**Amazon S3 トリガーを作成するには**

1. **[関数の概要]** ペインで、**[トリガーを追加]** を選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/overview-trigger.png)

1. **[S3]** を選択します。

1. **[バケット]**で、前のチュートリアルで作成したバケットを選択します。

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

1. **[再帰呼び出し]** でチェックボックスを選択して、入力と出力に同じ Amazon S3 バケットを使用することは推奨されないことを確認します。

1. **[Add]** (追加) を選択します。

**注記**  
Lambda コンソールを使用して Lambda 関数の Amazon S3 トリガーを作成すると、Amazon S3 は指定したバケットに対して[イベント通知](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventNotifications.html)を設定します。このイベント通知を設定する前に、Amazon S3 は一連のチェックを実行して、イベントの送信先が存在し、必要な IAM ポリシーがあることを確認します。また、Amazon S3 は、そのバケットに設定されている他のイベント通知に対してもこれらのテストを実行します。  
このチェックが行われるために、既に存在しないリソースや必要なアクセス許可ポリシーを持たないリソースのイベントの送信先がバケットで既に設定されている場合、Amazon S3 は新しいイベント通知を作成できません。トリガーを作成できなかったことを示す次のエラーメッセージが表示されます。  

```
An error occurred when creating the trigger: Unable to validate the following destination configurations.
```
このエラーは、以前に同じバケットを使用して別の Lambda 関数のトリガーを設定しており、その後に関数を削除したり、そのアクセス許可ポリシーを変更したりした場合に表示されます。

## Lambda 関数をダミーイベントでテストする
<a name="with-s3-example-test-dummy-event"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps8.png)


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

1. 関数の Lambda コンソールページで、**[テスト]** タブを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-tab.png)

1. **イベント名**()で、`MyTestEvent` と入力します。

1. **[イベント 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"
           }
         }
       }
     ]
   }
   ```

1. **[保存]** を選択します。

1. [**Test**] を選択します。

1. 関数が正常に実行されると、**[実行結果]** タブに次のような出力が表示されます。

   ```
   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 関数をテストする
<a name="with-s3-example-test-s3-trigger"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps9.png)


設定したトリガーで関数をテストするには、コンソールを使用して Amazon S3 バケットにオブジェクトをアップロードします。Lambda 関数が予想通りに実行されたことを確認するには、CloudWatch Logs を使用して関数の出力を確認します。

**オブジェクトを Amazon S3 バケットにアップロードするには**

1. Amazon S3 コンソールの「[バケット](https://console.aws.amazon.com/s3/buckets)」ページを開き、先ほど作成したバケットを選択します。

1. **アップロード** を選択します。

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

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

**CloudWatch Logs を使用して関数の呼び出しを確認する方法**

1. [CloudWatch](https://console.aws.amazon.com/cloudwatch/home) コンソールを開きます。

1. Lambda 関数を作成したところと同じ AWS リージョン で操作していることを確認してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/console_region_select.png)

1. **[ログ]**、**[ロググループ]** の順に選択します。

1. 関数のロググループの名前を選択します (`/aws/lambda/s3-trigger-tutorial`) 。

1. **[ログストリーム]** から、最新のログストリームを選択します。

1. Amazon S3 トリガーに応答して関数が正しく呼び出される場合、次のような内容と同じような出力が表示されます。表示される `CONTENT TYPE` は、バケットにアップロードしたファイルのタイプによって異なります。

   ```
   2022-05-09T23:17:28.702Z	0cae7f5a-b0af-4c73-8563-a3430333cc10	INFO	CONTENT TYPE: image/jpeg
   ```

## リソースのクリーンアップ
<a name="cleanup"></a>

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

**Lambda 関数を削除するには**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

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

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

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

**実行ロールを削除する**

1. IAM コンソールの [[ロール]](https://console.aws.amazon.com/iam/home#/roles) ページを開きます。

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

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

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

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

1. [Amazon S3 コンソール](https://console.aws.amazon.com//s3/home#)を開きます。

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

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

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

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

## 次のステップ
<a name="next-steps"></a>

[チュートリアル: Amazon S3 トリガーを使用してサムネイル画像を作成する](with-s3-tutorial.md) では、Amazon S3 トリガーが関数を呼び出します。この感想は、バケットにアップロードされる各イメージファイルにサムネイルイメージを作成します。このチュートリアルでは、AWS と Lambda ドメインに関する中級レベルの知識が必要です。AWS Command Line Interface (AWS CLI) を使用してリソースを作成し、関数およびその依存関係に .zip ファイルアーカイブのデプロイパッケージを作成する方法を示します。

# チュートリアル: Amazon S3 トリガーを使用してサムネイル画像を作成する
<a name="with-s3-tutorial"></a>

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

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_resources.png)


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

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

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

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

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

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

Lambda 用に Amazon S3 トリガーを設定する方法を知るための、より簡単な例が必要であれば、「[チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html)」をお試しください。

**Topics**
+ [

## 前提条件
](#with-s3-example-prereqs)
+ [

## 2 つの Amazon S3 バケットを作成する
](#with-s3-tutorial-prepare-create-buckets)
+ [

## テスト画像をソース元バケットにアップロードする
](#with-s3-tutorial-test-image)
+ [

## 許可ポリシーを作成する
](#with-s3-tutorial-create-policy)
+ [

## 実行ロールを作成する
](#with-s3-tutorial-create-execution-role)
+ [

## 関数デプロイパッケージを作成する
](#with-s3-tutorial-create-function-package)
+ [

## Lambda 関数を作成する
](#with-s3-tutorial-create-function-createfunction)
+ [

## 関数を呼び出すように Amazon S3 を設定する
](#with-s3-tutorial-configure-s3-trigger)
+ [

## Lambda 関数をダミーイベントでテストする
](#with-s3-tutorial-dummy-test)
+ [

## Amazon S3 トリガーを使用して関数をテストする
](#with-s3-tutorial-test-s3)
+ [

## リソースのクリーンアップ
](#s3-tutorial-cleanup)

## 前提条件
<a name="with-s3-example-prereqs"></a>

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

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

### AWS Command Line Interface のインストール
<a name="install_aws_cli"></a>

AWS Command Line Interface をまだインストールしていない場合は、「[最新バージョンの AWS CLI のインストールまたは更新](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」にある手順に従ってインストールしてください。

このチュートリアルでは、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要です。Linux および macOS では、任意のシェルとパッケージマネージャーを使用してください。

**注記**  
Windows では、Lambda でよく使用される一部の Bash CLI コマンド (`zip` など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、[Windows Subsystem for Linux をインストール](https://docs.microsoft.com/en-us/windows/wsl/install-win10)します。

## 2 つの Amazon S3 バケットを作成する
<a name="with-s3-tutorial-prepare-create-buckets"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps1.png)


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

------
#### [ AWS マネジメントコンソール ]

**Amazon S3 バケットを作成する方法 (コンソール)**

1. [[Amazon S3 コンソール]](https://console.aws.amazon.com/s3) を開き、**[汎用バケット]** ページを選択します。

1. 住まいの地域に最も近い AWS リージョン を選択してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。チュートリアルの後半では、同じリージョンで Lambda 関数を作成する必要があります。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/console_region_select.png)

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

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

   1. **[バケットタイプ]** で、**[汎用]** が選択されていることを確認してください。

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

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

1. ステップ 1 ～ 5 を繰り返して、送信先のバケットを作成します。**[バケット名]** には `amzn-s3-demo-source-bucket-resized` と入力します。`amzn-s3-demo-source-bucket` は先ほど作成したソース元バケットの名前です。

------
#### [ AWS CLI ]

**Amazon S3 バケットを作成する方法 (AWS CLI)**

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

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-source-bucket --region us-east-1 \
   --create-bucket-configuration LocationConstraint=us-east-1
   ```

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

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

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-source-bucket-resized --region us-east-1 \
   --create-bucket-configuration LocationConstraint=us-east-1
   ```

------

## テスト画像をソース元バケットにアップロードする
<a name="with-s3-tutorial-test-image"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps2.png)


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

------
#### [ AWS マネジメントコンソール ]

**テスト画像をソース元バケットにアップロードする方法 (コンソール)**

1. Amazon S3 コンソールの[バケット](https://console.aws.amazon.com/s3/buckets)ページを開きます。

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

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

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

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

------
#### [ AWS CLI ]

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

  ```
  aws s3api put-object --bucket amzn-s3-demo-source-bucket --key HappyFace.jpg --body ./HappyFace.jpg
  ```

------

## 許可ポリシーを作成する
<a name="with-s3-tutorial-create-policy"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps3.png)


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

------
#### [ AWS マネジメントコンソール ]

**ポリシーを作成する方法 (コンソール)**

1. AWS Identity and Access Management (IAM) コンソールの [[Policies (ポリシー)] ページ](https://console.aws.amazon.com/iamv2/home#policies)を開きます。

1. [**Create policy**] (ポリシーの作成) を選択します。

1. **[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:::*/*"
           }
       ]
   }
   ```

1. [**次へ**] を選択します。

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

1. [**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:::*/*"
           }
       ]
   }
   ```

1. JSON ポリシードキュメントを保存したディレクトリから、次の CLI コマンドを実行します。

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

------

## 実行ロールを作成する
<a name="with-s3-tutorial-create-execution-role"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps4.png)


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

------
#### [ AWS マネジメントコンソール ]

**実行ロールを作成して、許可ポリシーをアタッチする方法 (コンソール)**

1. (IAM) コンソールの [[ロール]](https://console.aws.amazon.com/iamv2/home#roles) ページを開きます。

1. [**ロールの作成**] を選択してください。

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

1. [**次へ**] を選択します。

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

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

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

   1. [**次へ**] を選択します。

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

1. [**ロールの作成**] を選択してください。

------
#### [ 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"
       }
     ]
   }
   ```

1. JSON 信頼ポリシードキュメントを保存したディレクトリから、次の CLI コマンドを実行して実行ロールを作成します。

   ```
   aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
   ```

1. 次の CLI コマンドを実行して、前のステップで作成した許可ポリシーをアタッチします。ポリシーの ARN にある AWS アカウント 番号を、自分のアカウント番号へと置き換えます。

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

------

## 関数デプロイパッケージを作成する
<a name="with-s3-tutorial-create-function-package"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps5.png)


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

------
#### [ Node.js ]

**デプロイパッケージを作成する方法 (Node.js)**

1. 関数コードと依存関係用に `lambda-s3` という名前のディレクトリを作成し、そこに移動します。

   ```
   mkdir lambda-s3
   cd lambda-s3
   ```

1. `npm` で新しい Node.js プロジェクトを作成します。インタラクティブな形式で提供されるデフォルトオプションを受け入れるには、`Enter` を押します。

   ```
   npm init
   ```

1. 以下の関数コードを `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);
     };
   ```

1. 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
   ```

1. 関数コードと依存関係が含まれる.zip ファイル形式のデプロイパッケージを作成します。MacOS および Linux では、次のコマンドを実行します。

   ```
   zip -r function.zip .
   ```

   Windows では、任意の zip ツールを使用して .zip ファイルを作成します。`index.mjs`、`package.json`、`package-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))
   ```

1. `lambda_function.py` ファイルを作成したのと同じディレクトリに、`package` という名前の新しいディレクトリを作成し、[Pillow (PIL)](https://pypi.org/project/Pillow/) ライブラリと AWS SDK for Python (Boto3) をインストールします。Lambda Python ランタイムには Boto3 SDK のあるバージョンが含まれていますが、ランタイムに含まれている場合でも、関数の依存関係はすべてデプロイパッケージに追加することをお勧めします。詳細については、「[Python のランタイム依存関係](https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies)」を参照してください。

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

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

1. アプリケーションコードと 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 ファイルアーカイブを使用する](python-package.md)」を参照してください。

------

## Lambda 関数を作成する
<a name="with-s3-tutorial-create-function-createfunction"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps6.png)


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

------
#### [ AWS マネジメントコンソール ]

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

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

1. Lambda コンソールの[関数](https://console.aws.amazon.com/lambda/home#/functions)ページを開きます。

1. Amazon S3 バケットを作成したときと同じ AWS リージョン で操作していることを確認してください。画面上部にあるドロップダウンリストを使用して、リージョンを変更できます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/console_region_select.png)

1. **関数の作成** を選択します。

1. **Author from scratch** を選択します。

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

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

   1. **[ランタイム]** には、関数に選択した言語に応じて **[Node.js 22.x]** または **[Python 3.12]** を選択します。

   1. **[アーキテクチャ]** で **[x86\$164]** を選択します。

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

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

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

1. [**関数の作成**] を選択してください。

**関数コードをアップロードする方法 (コンソール)**

1. **[コードソース]** ペインで、**[アップロード元]** をクリックします。

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

1. **アップロード** を選択します。

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

1. **[保存]** を選択します。

------
#### [ AWS CLI ]

**関数を作成する方法 (AWS CLI)**
+ 選択した言語の CLI コマンドを実行します。`role` パラメータでは、`123456789012` を自分自身の AWS アカウント ID へと置き換えます。`region` パラメータでは、`us-east-1` を Amazon S3 バケットを作成したリージョンへと置き換えます。
  + **Node.js** の場合は、`function.zip` ファイルが含まれるディレクトリから次のコマンドを実行します。

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

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

------

## 関数を呼び出すように Amazon S3 を設定する
<a name="with-s3-tutorial-configure-s3-trigger"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps7.png)


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

**重要**  
この手順では、オブジェクトがバケット内に作成されるたびに関数を呼び出すように、Amazon S3 バケットを設定します。この設定は、ソース元バケットのみで行うようにしてください。Lambda 関数が自身を呼び出した同じバケットにオブジェクトを作成する場合、関数が[連続的にループして呼び出される](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway)可能性があります。その結果、予期しない請求がお客様の AWS アカウント に請求される可能性があります。

------
#### [ AWS マネジメントコンソール ]

**Amazon S3 トリガーを設定する方法 (コンソール)**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開き、関数を選択します (`CreateThumbnail`)。

1. **[トリガーを追加]** を選択します。

1. **[S3]** を選択します。

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

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

1. **[再帰呼び出し]** でチェックボックスを選択して、入力と出力に同じ Amazon S3 バケットを使用することは推奨されないことを確認します。Lambda の再帰呼び出しパターンについて詳しくは、Serverless Land の「[Lambda 関数が暴走する原因となる再帰パターン](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway)」を参照してください。

1. **[Add]** (追加) を選択します。

   Lambda コンソールを使用してトリガーを作成すると、Lambda は[リソースベースのポリシー](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)を自動的に作成し、選択したサービスに関数を呼び出すアクセス許可を付与します。

------
#### [ AWS CLI ]

**Amazon S3 トリガーを設定する方法 (AWS CLI)**

1. 画像ファイルを追加したときに Amazon S3 ソース元バケットが関数を呼び出すようにするには、まずは[リソースベースのポリシー](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)を使用して関数への権限を設定する必要があります。リソースベースのポリシーステートメントが、他の 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:::amzn-s3-demo-source-bucket \
   --source-account 123456789012
   ```

   このコマンドで定義するポリシーにより、Amazon S3 はソース元バケットでアクションが発生した場合にのみ、関数を呼び出すことができるようになります。
**注記**  
Amazon S3 のバケット名は世界的に一意ですが、リソースベースのポリシーを使用する場合には、バケットがアカウントに属していなければならないことを指定するのがベストプラクティスです。これは、バケットを削除したときに、別の AWS アカウント が同じ Amazon リソースネーム (ARN) でバケットを作成する可能性があるからです。

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

   ```
   {
   "LambdaFunctionConfigurations": [
       {
         "Id": "CreateThumbnailEventConfiguration",
         "LambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:CreateThumbnail",
         "Events": [ "s3:ObjectCreated:Put" ]
       }
     ]
   }
   ```

1. 次の CLI コマンドを実行して、JSON ファイル内に作成した通知設定をソース元のバケットに適用します。`amzn-s3-demo-source-bucket` を自分自身のソース元バケットの名前へと置き換えます。

   ```
   aws s3api put-bucket-notification-configuration --bucket amzn-s3-demo-source-bucket \
   --notification-configuration file://notification.json
   ```

   `put-bucket-notification-configuration` コマンドと `notification-configuration` オプションの詳細については、「AWS CLI コマンドリファレンス」の「[put-bucket-notification-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-notification-configuration.html)」を参照してください。

------

## Lambda 関数をダミーイベントでテストする
<a name="with-s3-tutorial-dummy-test"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps8.png)


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

------
#### [ AWS マネジメントコンソール ]

**Lambda 関数をダミーイベントでテストする方法 (コンソール)**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開き、関数を選択します (`CreateThumbnail`)。

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

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

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

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

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

   1. 次のパラメータの値を自分自身の値へと置き換えます。
      + `awsRegion` では、`us-east-1` を Amazon S3 バケットを作成した AWS リージョン へと置き換えます。
      + `name` では、`amzn-s3-demo-bucket` を自分自身の Amazon S3 ソース元バケットの名前へと置き換えます。
      + `key` では、`test%2Fkey` を [テスト画像をソース元バケットにアップロードする](#with-s3-tutorial-test-image) ステップでソース元バケットにアップロードしたテストオブジェクトのファイル名へと置き換えます。

      ```
      {
        "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"
              }
            }
          }
        ]
      }
      ```

   1. **[保存]** を選択します。

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

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

   1. Amazon S3 コンソールの [[バケットページ]](https://console.aws.amazon.com/s3/buckets) を開きます。

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

------
#### [ AWS CLI ]

**Lambda 関数をダミーイベントでテストする方法 (AWS CLI)**

1. 次の JSON を `dummyS3Event.json` という名のファイルに保存します。次のパラメータの値を自分自身の値へと置き換えます。
   + `awsRegion` では、`us-east-1` を Amazon S3 バケットを作成した AWS リージョン へと置き換えます。
   + `name` では、`amzn-s3-demo-bucket` を自分自身の Amazon S3 ソース元バケットの名前へと置き換えます。
   + `key` では、`test%2Fkey` を [テスト画像をソース元バケットにアップロードする](#with-s3-tutorial-test-image) ステップでソース元バケットにアップロードしたテストオブジェクトのファイル名へと置き換えます。

   ```
   {
     "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"
           }
         }
       }
     ]
   }
   ```

1. `dummyS3Event.json` ファイルを保存したディレクトリから、次の CLI コマンドを実行して関数を呼び出します。このコマンドは、`RequestResponse` を呼び出しタイプパラメータの値として指定することにより、Lambda 関数を同期的に呼び出します。同期呼び出しと非同期呼び出しの詳細については、[「Lambda 関数の呼び出し」](https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html)を参照してください。

   ```
   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 でサポートされているグローバルコマンドラインオプション](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)を参照してください。

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

   ```
   aws s3api list-objects-v2 --bucket amzn-s3-demo-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 トリガーを使用して関数をテストする
<a name="with-s3-tutorial-test-s3"></a>

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps9.png)


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

------
#### [ AWS マネジメントコンソール ]

**Amazon S3 トリガーを使用して Lambda 関数をテストする方法 (コンソール)**

1. 画像を Amazon S3 バケットにアップロードするには、以下を実行します。

   1. Amazon S3 コンソールの[[バケット]](https://console.aws.amazon.com/s3/buckets) ページを開き、ソース元のバケットを選択します。

   1. **アップロード** を選択します。

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

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

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

   1. Amazon S3 コンソールの [[バケット]](https://console.aws.amazon.com/s3/buckets) ページに戻り、送信先バケットを選択します。

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

------
#### [ AWS CLI ]

**Amazon S3 トリガーを使用して Lambda 関数をテストする方法 (AWS CLI)**

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

   ```
   aws s3api put-object --bucket amzn-s3-demo-source-bucket --key SmileyFace.jpg --body ./SmileyFace.jpg
   ```

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

   ```
   aws s3api list-objects-v2 --bucket amzn-s3-demo-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"
           }
       ]
   }
   ```

------

## リソースのクリーンアップ
<a name="s3-tutorial-cleanup"></a>

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

**Lambda 関数を削除するには**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

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

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

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

**作成したポリシーを削除する**

1. IAM コンソールの [[Policies (ポリシー)]](https://console.aws.amazon.com/iam/home#/policies) ページを開きます。

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

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

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

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

1. IAM コンソールの [[ロール]](https://console.aws.amazon.com/iam/home#/roles) ページを開きます。

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

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

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

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

1. [Amazon S3 コンソール](https://console.aws.amazon.com//s3/home#)を開きます。

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

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

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

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