

# 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)