

# Lambda 関数の呼び出しメソッドについて
<a name="lambda-invocation"></a>

「Lambda 関数をデプロイ」した後、いくつかの方法で呼び出すことができます。
+ [Lambda コンソール](testing-functions.md) - Lambda コンソールを使用し、テストイベントをすばやく作成して関数を呼び出します。
+ [AWS SDK](https://aws.amazon.com/developer/tools/) - AWS SDK を使用して関数をプログラムによって呼び出します。
+ 「[呼び出し](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)」 API - Lambda 呼び出し API を使用して関数を直接呼び出します。
+ [AWS Command Line Interface (AWS CLI)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html) — `aws lambda invoke` AWS CLI コマンドを使用して、コマンドラインから関数を直接呼び出します。
+ [関数 URL の HTTP(S) エンドポイント](urls-configuration.md) — 関数 URL を使用し、関数を呼び出すために使用できる専用の HTTP(S) エンドポイントを作成します。

これらのメソッドはすべて関数を直接呼び出す方法です。**Lambda では、アプリケーションの他の場所で発生するイベントに基づいて関数を呼び出すことが一般的な使用例です。一部のサービスは、新しいイベントごとに Lambda 関数を呼び出すことができます。これは[トリガー](lambda-services.md)と呼ばれます。ストリームおよびキューベースのサービスの場合、Lambda はレコードのバッチで関数を呼び出します。これは[イベントソースマッピング](invocation-eventsourcemapping.md)と呼ばれます。

関数を呼び出す際は、同期的に呼び出すか非同期的に呼び出すかを選択できます。[同期呼び出しでは](invocation-sync.md)、イベントを処理する関数を待ってレスポンスを返します。[非同期](invocation-async.md)呼び出しでは、Lambda はイベントをキューに入れて処理し、すぐにレスポンスを返します。[呼び出し API の `InvocationType` リクエストパラメータ](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html#API_Invoke_RequestParameters)は、Lambda が関数を呼び出す方法を判定します。`RequestResponse` の値は同期呼び出しを示し、`Event` の値は非同期呼び出しを示します。

IPv6 経由で関数を呼び出すには、Lambda のパブリック[デュアルスタックエンドポイント](https://docs.aws.amazon.com/general/latest/gr/rande.html#dual-stack-endpoints)を使用します。IPv4 と IPv6 の両方をサポートするデュアルスタックのエンドポイント Lambda デュアルスタックエンドポイントは次の構文を使用します。

```
protocol://lambda.us-east-1.api.aws
```

また、[Lambda 関数 URL](urls-configuration.md) を使用して IPv6 経由で関数を呼び出すこともできます。関数 URL のエンドポイントでは、次の形式を使用します。

```
https://url-id.lambda-url.us-east-1.on.aws
```

関数の呼び出しでエラーが発生したら、同期呼び出しの場合は応答のエラーメッセージを確認し、手動で呼び出しを再試行してください。非同期呼び出しの場合、Lambda は再試行を自動的に処理し、呼び出しレコードを [宛先](invocation-async-retain-records.md#invocation-async-destinations) に送信できます。

# Lambda 関数を同期的に呼び出す
<a name="invocation-sync"></a>

関数を同期的に呼び出すと、Lambda は関数を実行し、レスポンスを待ちます。関数の実行が終了すると、Lambda は、呼び出された関数のバージョンなどの追加データとともに、関数のコードからのレスポンスを返します。AWS CLI を使用して関数を同期的に呼び出すには、`invoke` コマンドを使用します。

```
aws lambda invoke --function-name my-function \
    --cli-binary-format raw-in-base64-out \
    --payload '{ "key": "value" }' response.json
```

AWS CLI バージョン 2 を使用している場合、**cli-binary-format** オプションは必須です。これをデフォルト設定にするには、`aws configure set cli-binary-format raw-in-base64-out` を実行します。詳細については、バージョン 2 の AWS Command Line Interface ユーザーガイドの「[AWS CLI でサポートされているグローバルコマンドラインオプション](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)」を参照してください。

以下の出力が表示されます。

```
{
    "ExecutedVersion": "$LATEST",
    "StatusCode": 200
}
```

次の図は、Lambda 関数を同期的に呼び出すクライアントを示しています。Lambda はイベントを関数に直接送信し、関数の応答を呼び出し側に返します。

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/invocation-sync.png)


`payload` は、JSON 形式のイベントを含む文字列です。AWS CLI が関数からのレスポンスを書き込むファイルの名前は `response.json` です。関数がオブジェクトまたはエラーを返す場合、レスポンス本文は JSON 形式のオブジェクトまたはエラーになります。エラーなしで終了した場合、レスポンス本文は `null` になります。

**注記**  
Lambda は外部拡張機能の完了を待たずにレスポンスを送信します。外部拡張機能は、実行環境内の独立したプロセスとして実行され、関数の呼び出しが完了した後も引き続き実行されます。詳細については、「[Lambda 拡張機能を使用して Lambda 関数を補強する](lambda-extensions.md)」を参照してください。

端末に表示されるコマンドの出力には、Lambda からのレスポンスのヘッダーにある情報が含まれます。これには、イベントを処理したバージョン ([エイリアス](configuration-aliases.md)を使用する場合に役立つ)、および Lambda. から返されるステータスコードが含まれます。Lambda が関数を実行できた場合は、関数がエラーを返したとしても、ステータスコードは 200 です。

**注記**  
タイムアウトが長い関数では、同期呼び出し中にレスポンスを待機している間に、クライアントが切断される場合があります。HTTP クライアント、SDK、ファイアウォール、プロキシ、またはオペレーティングシステムを構成して、タイムアウトまたはキープアライブ設定での長い接続を許可するようにしてください。

Lambda が関数を実行できない場合は、エラーが出力に表示されます。

```
aws lambda invoke --function-name my-function \
    --cli-binary-format raw-in-base64-out \
    --payload value response.json
```

次のような出力が表示されます。

```
An error occurred (InvalidRequestContentException) when calling the Invoke operation: Could not parse request body into json: Unrecognized token 'value': was expecting ('true', 'false' or 'null')
 at [Source: (byte[])"value"; line: 1, column: 11]
```

AWS CLI は、コマンドラインシェルでコマンドを使用して AWS サービスとやり取りするためのオープンソースツールです。このセクションの手順を完了するには、[AWS CLIバージョン 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) が必要です。

[AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) および `--log-type` コマンドオプションを使用して、呼び出しのログを取得します。レスポンスには、`LogResult`フィールドが含まれ、このフィールドには、呼び出しから base64 コードされた最大 4 KB のログが含まれます。

**Example ログ ID を取得します**  
次の例は、`LogResult`という名前の関数の`my-function`フィールドから*ログ ID * を取得する方法を示しています。  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
次のような出力が表示されます。  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example ログをデコードします**  
同じコマンドプロンプトで、`base64` ユーティリティを使用してログをデコードします。次の例は、`my-function`の base64 でエンコードされたログを取得する方法を示しています 。  

```
aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
```
AWS CLI バージョン 2 を使用している場合、**cli-binary-format** オプションは必須です。これをデフォルト設定にするには、`aws configure set cli-binary-format raw-in-base64-out` を実行します。詳細については、バージョン 2 の AWS Command Line Interface ユーザーガイドの「[AWS CLI でサポートされているグローバルコマンドラインオプション](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)」を参照してください。  
以下の出力が表示されます。  

```
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB
```
`base64`このユーティリティは、Linux、macOS、および [ Windows の Ubuntu ](https://docs.microsoft.com/en-us/windows/wsl/install-win10) で使用できます。macOS ユーザーは、`base64 -D`を使用する必要があります 。

パラメータ、ヘッダー、エラーの完全なリストを含む `Invoke` API の詳細については、「[呼び出し](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)」を参照してください。

関数を直接呼び出す場合は、エラーレスポンスを確認し、再試行することができます。また、AWS CLI と AWS SDK は、クライアントのタイムアウト、スロットル、およびサービスエラーで自動的に再試行します。詳細については、「[Lambda での再試行動作について](invocation-retries.md)」を参照してください。

# Lambda 関数を非同期的に呼び出す
<a name="invocation-async"></a>

Amazon Simple Storage Service (Amazon S3) や Amazon Simple Notification Service (Amazon SNS) などの複数の AWS のサービス では、関数を非同期的に呼び出してイベントを処理します。AWS Command Line Interface (AWS CLI) または AWS SDK のいずれかを使用して、Lambda 関数を非同期的に呼び出すこともできます。関数を非同期的に呼び出す場合は、関数コードからのレスポンスを待機しません。イベントを Lambda に渡すと、Lambda が残りを処理します。Lambda がエラーを処理する方法を設定し、Amazon Simple Queue Service (Amazon SQS) または Amazon EventBridge (EventBridge) などのダウンストリームリソースに呼び出しレコードを送信して、アプリケーションのコンポーネントをつなぎ合わせることができます。

次の図は、クライアントによる Lambda 関数の非同期的呼び出しを示しています。Lambda は、イベントを関数に送信する前にキューに入れます。

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/features-async.png)


非同期呼び出しの場合、Lambda はリクエストをキューに入れ、追加情報のない成功のレスポンスを返します。別のプロセスがキューからイベントを読み取って関数に送信します。

 AWS Command Line Interface (AWS CLI) または AWS SDK のいずれかを使用して Lambda 関数を非同期的に呼び出すには、[呼び出しタイプ](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html#lambda-Invoke-request-InvocationType)パラメータを `Event` に設定します。次のコード例は、関数を呼び出す AWS CLI コマンドを示しています。

```
aws lambda invoke \
  --function-name my-function  \
  --invocation-type Event \
  --cli-binary-format raw-in-base64-out \
  --payload '{ "key": "value" }' response.json
```

以下の出力が表示されます。

```
{
    "StatusCode": 202
}
```

AWS CLI バージョン 2 を使用している場合、**cli-binary-format** オプションは必須です。これをデフォルト設定にするには、`aws configure set cli-binary-format raw-in-base64-out` を実行します。詳細については、バージョン 2 の AWS Command Line Interface ユーザーガイドの「[AWS CLI でサポートされているグローバルコマンドラインオプション](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)」を参照してください。

出力ファイル (`response.json`) には情報は含まれないものの、このコマンドを実行すると作成されます。Lambda がイベントをキューに追加することができない場合、エラーメッセージがコマンド出力に表示されます。

# Lambda がエラーを処理し、非同期呼び出しで再試行する方法
<a name="invocation-async-error-handling"></a>

Lambda は関数の非同期イベントキューを管理し、エラー発生時に再試行を行います。関数からエラーが返された場合、Lambda はデフォルトでその関数をさらに 2 回再試行します。その際、最初の 2 回の試行の間に 1 分間、2 回目と 3 回目の間に 2 分間の待機時間があります。関数エラーには、関数のコードによって返されるエラーと、タイムアウトなど関数のランタイムによって返されるエラーが含まれます。

関数にすべてのイベントを処理するために十分な同時実行数がない場合は、追加のリクエストはスロットリングされます。スロットルエラー (429) およびシステムエラー (500 番台) の場合、Lambda はイベントをキューに返し、デフォルトで最大 6 時間関数の再実行を試行します。再試行間隔は、最初の試行後 1 秒から最大 5 分まで指数関数的に増加します。キューに多くのエントリが含まれている場合、Lambda は再試行の間隔を長くして、キューからイベントを読み取る速度を低下させます。

関数がエラーを返さない場合でも、キュー自体は最終的に一貫しているため、同じイベントを Lambda から複数回受信する可能性があります。関数が受信するイベントに対応できない場合、イベントは関数に送信されずにキューから削除される場合があります。関数コードが重複イベントを適切に処理し、すべての呼び出しを処理するのに十分な同時実行数があることを確認してください。

キューが非常に長い場合、新しいイベントは Lambda によって関数に送信される前に期限切れになる場合があります。期限切れになったイベントや、すべての処理試行に失敗したイベントは Lambda によって破棄されます。関数の[エラー処理を設定](invocation-async-configuring.md)して、Lambda による再試行の回数を減らしたり、未処理のイベントをより速やかに破棄したりできます。廃棄されたイベントをキャプチャするには、関数の[デッドレターキューを設定](invocation-async-retain-records.md#invocation-dlq)します。失敗した呼び出し (タイムアウトやランタイムエラーなど) のレコードをキャプチャするには、[失敗時の送信先を作成](invocation-async-retain-records.md#invocation-async-destinations)します。

# Lambda 非同期呼び出しのエラー処理の設定
<a name="invocation-async-configuring"></a>

次の設定を使用して、Lambda で非同期の関数呼び出しのエラーと再試行をどのように処理するかを設定します。
+ [MaximumEventAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html#lambda-PutFunctionEventInvokeConfig-request-MaximumEventAgeInSeconds): Lambda が非同期イベントキューにイベントを保持する最大時間を秒単位で設定します。この時間を過ぎると、イベントは破棄されます。
+ [MaximumRetryAttempts](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html#lambda-PutFunctionEventInvokeConfig-request-MaximumRetryAttempts): 関数がエラーを返したときに Lambda がイベントを再試行する回数の上限を設定します。

Lambda コンソールまたは AWS CLI を使用して、関数、バージョン、またはエイリアスのエラー処理を設定します。

------
#### [ Console ]

**エラー処理を設定するには**

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

1. 関数を選択します。

1. [**設定**]、[**Asynchronous invocation (非同期呼び出し)**] の順に選択します。

1. [**Asynchronous invocation (非同期呼び出し)**] で、[**Edit (編集)**] を選択します。

1. 以下を設定します。
   + [**Maximum age of event**] (イベントの最大有効期間) － Lambda が非同期イベントキューにイベントを保持する最大時間 (最大 6 時間)。
   + [**Retry attempts**] (再試行) － 関数がエラーを返したときに Lambda が再試行する回数 (0 〜 2)。

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

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

AWS CLI で非同期呼び出しを設定するには、[put-function-event-invoke-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/put-function-event-invoke-config.html) コマンドを使用します。以下の例では、最大イベント有効期間が 1 時間で再試行なしの関数を設定しています。

```
aws lambda put-function-event-invoke-config \ 
  --function-name error \
  --maximum-event-age-in-seconds 3600 \
  --maximum-retry-attempts 0
```

`put-function-event-invoke-config` コマンドは、関数、バージョン、またはエイリアスの既存の設定を上書きします。あるオプションだけを設定し、他のものはリセットしないようにするには、[update-function-event-invoke-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-event-invoke-config.html) コマンドを使用します。以下の例では、イベントを処理できない場合に、`destination` という名前の標準 SQS キューにレコードを送信するように Lambda を設定します。

```
aws lambda update-function-event-invoke-config \
  --function-name my-function \
  --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-1:123456789012:destination"}}'
```

------

以下の出力が表示されます。

```
{
    "LastModified": 1573686021.479,
    "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
    "MaximumRetryAttempts": 0,
    "MaximumEventAgeInSeconds": 3600,
    "DestinationConfig": {
        "OnSuccess": {},
        "OnFailure": {}
    }
}
```

呼び出しイベントが最大有効期間を超えるか、すべての再試行に失敗すると、Lambda はそのイベントを破棄します。破棄されたイベントのコピーを保持するには、失敗イベントの[送信先](invocation-async-retain-records.md#invocation-async-destinations)を設定します。

# Lambda 非同期呼び出しのレコードのキャプチャ
<a name="invocation-async-retain-records"></a>

Lambda 関数は、非同期呼び出しのレコードを以下のいずれかの AWS のサービス に送信できます。
+ **Amazon SQS** — 標準 SQS キュー
+ **Amazon SNS** – 標準 SNS トピック
+ **Amazon S3** – Amazon S3 バケット (障害発生時のみ)
+ **AWS Lambda** — Lambda 関数
+ **Amazon EventBridge** － Amazon EventBridge イベントバス

呼び出しレコードには、JSON 形式のリクエストとレスポンスに関する詳細が含まれます。処理に成功したイベント用とすべての処理試行に失敗したイベント用に別々の送信先を設定できます。または、破棄されたイベント用に標準 Amazon SQS キューまたは標準 Amazon SNS トピックをデッドレターキューとして設定することもできます。デッドレターキューの場合、Lambda はイベントのコンテンツのみを送信し、レスポンスの詳細は送信しません。

設定した送信先に Lambda がレコードを送信できない場合、Lambda は Amazon CloudWatch に `DestinationDeliveryFailures` メトリクスを送信します。これは、設定に Amazon SQS FIFO キューや Amazon SNS FIFO トピックなど、サポートされていない送信先タイプが含まれている場合に発生する可能性があります。また、配信エラーはアクセス許可エラーが原因で発生する可能性があります。Lambda 呼び出しメトリクスの詳細については、「[呼び出しメトリクス](monitoring-metrics-types.md#invocation-metrics)」を参照してください。

**注記**  
関数がトリガーされないようにするには、その関数の予約済同時実行数をゼロに設定します。非同期で呼び出された関数の予約された同時実行数をゼロに設定すると、Lambda は設定した[デッドレターキュー](#invocation-dlq)または障害発生時の[イベント送信先](#invocation-async-destinations)に再試行なしで新しいイベントの送信を開始します。予約された同時実行数をゼロに設定している間に送信されたイベントを処理するには、デッドレターキューまたは障害発生時のイベント送信先からイベントを消費する必要があります。

## 送信先の追加
<a name="invocation-async-destinations"></a>

非同期呼び出しのレコードを保持するには、関数に送信先を追加します。成功した呼び出しと失敗した呼び出しのいずれかを送信先に送るように選択できます。各関数に複数の送信先を設定できるため、成功したイベントと失敗したイベントの送信先を別々に設定できます。送信先に送られる各レコードは、呼び出しに関する詳細を含む JSON ドキュメントです。エラー処理の設定と同様に、関数、関数のバージョン、またはエイリアスに対して送信先を設定できます。

**ヒント**  
次のイベントソースマッピングのタイプについて、失敗した呼び出しのレコードを保持することもできます。[Amazon Kinesis](kinesis-on-failure-destination.md#kinesis-on-failure-destination-console)、[Amazon DynamoDB](services-dynamodb-errors.md)、[Apache Kafka (Amazon MSK と セルフマネージド Apache Kafka)](kafka-on-failure.md#kafka-onfailure-destination)。<a name="destinations-permissions"></a>

以下の表は、非同期呼び出しレコードでサポートされている送信先の一覧です。Lambda が選択した送信先にレコードを正常に送信するには、関数の[実行ロール](lambda-intro-execution-role.md)にも関連するアクセス権限が含まれていることを確認してください。この表では、各送信先タイプで JSON 呼び出しレコードを受け取る方法についても説明しています。


| 送信先タイプ | 必要なアクセス許可 | 宛先固有の JSON 形式 | 
| --- | --- | --- | 
|  Amazon SQS キュー  |  [sqs:SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)  |  Lambda は呼び出しレコードを `Message` として宛先に渡します。  | 
|  Amazon SNS トピック  |  [sns:Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)  |  Lambda は呼び出しレコードを `Message` として宛先に渡します。  | 
|  Amazon S3 バケット (障害発生時のみ)  |  [s3:PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) [s3:ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-async-retain-records.html)  | 
|  Lambda function  |  [lambda:InvokeFunction](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Lambda は呼び出しレコードをペイロードとして関数に渡します。  | 
|  EventBridge  |  [events:PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-async-retain-records.html)  | 

**注記**  
Amazon S3 の送信先では、KMS キーを使用してバケットの暗号化を有効にしている場合、関数には [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) アクセス許可も必要です。

**重要**  
Amazon SNS を送信先として使用する場合、Amazon SNS の最大メッセージサイズ制限は 256 KB であることに注意してください。非同期呼び出しペイロードが 1 MB に近づくと、呼び出しレコード (元のペイロードと追加のメタデータを含む) が Amazon SNS の制限を超え、配信が失敗する可能性があります。より大きなペイロードには Amazon SQS または Amazon S3 の送信先を使用することを検討してください。

次のステップでは、Lambda コンソールと AWS CLI を使用して関数の送信先を設定する方法について説明します。

------
#### [ Console ]

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

1. 関数を選択します。

1. [**機能の概要 **] で、[**送信先を追加 **] を選択します。

1. [**Source (送信元)**] で、[**Asynchronous invocation (非同期呼び出し)**] を選択します。

1. [**条件**] で、以下のオプションから選択します。
   + [**On failure**] (失敗時) － イベントがすべての処理試行に失敗した場合、または最大有効期間を超えた場合に、レコードを送信します。
   + [**On success**] (正常) － 関数が非同期呼び出しを正常に処理したときに、レコードを送信します。

1. [**送信先タイプ**] で、呼び出しレコードを受信するリソースのタイプを選択します。

1. [**送信先**] で、リソースを選択します。

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

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

AWS CLI を使用して送信先を設定するには、[update-function-event-invoke-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-event-invoke-config.html) コマンドを実行します。以下の例では、イベントを処理できない場合に、`destination` という名前の標準 SQS キューにレコードを送信するように Lambda を設定します。

```
aws lambda update-function-event-invoke-config \
  --function-name my-function \
  --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-1:123456789012:destination"}}'
```

------

### Amazon S3 送信先のセキュリティのベストプラクティス
<a name="s3-destination-security"></a>

関数の設定から送信先を削除せずに、送信先として設定された S3 バケットを削除すると、セキュリティリスクが発生する可能性があります。別のユーザーが送信先バケットの名前を知っている場合は、その AWS アカウントでバケットを再作成できます。失敗した呼び出しのレコードがそのバケットに送信され、関数からのデータが公開される可能性があります。

**警告**  
関数からの呼び出しレコードを別の AWS アカウントの S3 バケットに送信できないようにするには、`s3:PutObject` アクセス許可を自分アカウントのバケットに制限する条件を関数の実行ロールに追加します。

次の例は、関数の `s3:PutObject` アクセス許可を自分のアカウントのバケットに制限する IAM ポリシーを示しています。このポリシーは、送信先として S3 バケットを使用するために必要な `s3:ListBucket` アクセス許可も Lambda に付与します。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

AWS マネジメントコンソールまたは AWS CLI を使用して、関数の実行ロールにアクセス許可ポリシーを追加する場合は、次の手順を参照してください。

------
#### [ Console ]

**関数の実行ロールにアクセス許可ポリシーを追加するには (コンソール)**

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

1. 実行ロールを変更する Lambda 関数を選択します。

1. **[構成]** タブで、**[アクセス許可]** を選択します。

1. **[実行ロール]** タブで、関数の **[ロール名]** を選択して、ロールの IAM コンソールページを開きます。

1. 次の手順を実行してアクセス許可ポリシーをロールに追加します。

   1. **[アクセス許可ポリシー]** ペインで、**[アクセス許可の追加]**、**[インラインポリシーを作成]** を選択します。

   1. **ポリシーエディタ**で、**[JSON]** を選択します。

   1. 追加するポリシーをエディタに貼り付け (既存の JSON を置き換える)、**[次へ]** を選択します。

   1. **[ポリシーの詳細]** で **[ポリシー名]** を入力します。

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

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

**関数の実行ロールにアクセス許可ポリシーを追加するには (CLI)**

1. 必要なアクセス許可を持つ JSON ポリシードキュメントを作成し、ローカルディレクトリに保存します。

1. IAM `put-role-policy` CLI コマンドを使用して、関数の実行ロールにアクセス許可を追加します。JSON ポリシードキュメントを保存したディレクトリから次のコマンドを実行して、ロール名、ポリシー名、ポリシードキュメントを独自の値に置き換えます。

   ```
   aws iam put-role-policy \
   --role-name my_lambda_role \
   --policy-name LambdaS3DestinationPolicy \
   --policy-document file://my_policy.json
   ```

------

### 呼び出しレコードの例
<a name="destination-example-record"></a>

呼び出しが条件に一致すると、Lambda は呼び出しに関する詳細を含む [JSON ドキュメント](#destinations-permissions)を送信先に送ります。次の例は、関数エラーが原因で 3 つの処理試行に失敗したイベントの呼び出しレコードを示しています。

**Example**  

```
{
    "version": "1.0",
    "timestamp": "2019-11-14T18:16:05.568Z",
    "requestContext": {
        "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e",
        "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
        "condition": "RetriesExhausted",
        "approximateInvokeCount": 3
    },
    "requestPayload": {
        "ORDER_IDS": [
            "9e07af03-ce31-4ff3-xmpl-36dce652cb4f",
            "637de236-e7b2-464e-xmpl-baf57f86bb53",
            "a81ddca6-2c35-45c7-xmpl-c3a03a31ed15"
        ]
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "responsePayload": {
        "errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request"
    }
}
```

呼び出しレコードには、イベント、レスポンス、レコードが送信された理由に関する詳細が含まれます。

### 送信先へのリクエストのトレース
<a name="destinations-tracing"></a>

AWS X-Ray を使用すると、各リクエストがキューに入れられ、Lambda 関数によって処理され、送信先サービスに渡される過程の接続されたビューを確認できます。関数または関数を呼び出すサービスの X-Ray トレーシングを有効にすると、Lambda は X-Ray ヘッダーをリクエストに追加し、ヘッダーを送信先サービスに渡します。アップストリームサービスからのトレースは、ダウンストリーム Lambda 関数および宛先サービスからのトレースに自動的にリンクされ、アプリケーション全体のエンドツーエンドビューを作成します。トレースの詳細については、「[AWS X-Ray を使用した Lambda 関数呼び出しの視覚化](services-xray.md)」を参照してください。

## デッドレターキューの追加
<a name="invocation-dlq"></a>

[障害発生時の送信先](#invocation-async-destinations)に代わる方法として、配信不能キューを使用して関数を設定し、破棄されたイベントを保存してさらに処理できます。配信不能キューは、イベントがすべての処理試行に失敗した場合や処理されずに期限切れになった場合に使用されるという点で、障害発生時の送信先と同じように動作します。ただし、デッドレターキューを追加または削除できるのは、関数レベルでのみです。関数バージョンでは、未公開バージョン (\$1LATEST) と同じデッドレターキュー設定が使用されます。また、障害発生時の送信先は、追加のターゲットをサポートし、関数のレスポンスに関する詳細を呼び出しレコードに含めます。

デッドレターキュー内のイベントを再処理するには、デッドレターキューを Lambda 関数の[イベントソース](invocation-eventsourcemapping.md)として設定します。または、イベントを手動で取得することもできます。

デッドレターキューには標準 Amazon SQS キューまたは標準 Amazon SNS トピックを選択できます。FIFO キューと Amazon SNS FIFO トピックはサポートされていません。
+ [Amazon SQS キュー](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html) － キューは、失敗したイベントが取得されるまでそれらを保持します。Lambda 関数や CloudWatch アラームなどの単一のエンティティが失敗したイベントを処理することが予想される場合は、Amazon SQS 標準キューを選択します。詳細については、「[Amazon SQS での Lambda の使用](with-sqs.md)」を参照してください。
+ [Amazon SNS トピック](https://docs.aws.amazon.com/sns/latest/gsg/CreateTopic.html) － トピックは、失敗したイベントを 1 つまたは複数の送信先に中継します。複数のエンティティが失敗したイベントに対して動作することが予想される場合は、Amazon SNS 標準トピックを選択します。例えば、E メールアドレス、Lambda 関数、および/または HTTP エンドポイントにイベントを送信するようにトピックを設定できます。詳細については、「[Amazon SNS 通知を使用した Lambda 関数の呼び出し](with-sns.md)」を参照してください。

キューまたはトピックにイベントを送信するには、関数に追加のアクセス権限が必要です。[必要なアクセス許可](#destinations-permissions)を定義したポリシーを関数の[実行ロール](lambda-intro-execution-role.md)に追加します。ターゲットキューまたはトピックがカスタマーマネージド AWS KMS キーで暗号化されている場合は、関数の実行ロールとキーの[リソースベースのポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)の両方に関連するアクセス許可が含まれていることを確認してください。

ターゲットを作成し、関数の実行ロールを更新した後、デッドレターキューを関数に追加します。同じターゲットにイベントを送信するように複数の関数を設定できます。

------
#### [ Console ]

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

1. 関数を選択します。

1. [**設定**]、[**Asynchronous invocation (非同期呼び出し)**] の順に選択します。

1. [**Asynchronous invocation (非同期呼び出し)**] で、[**Edit (編集)**] を選択します。

1. **デッドレターキューサービス**を **Amazon SQS** または **Amazon SNS** に設定します。

1. ターゲットとなるキューまたはトピックを選択します。

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

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

AWS CLI を使用してデッドレターキューを設定するには、[update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) コマンドを使用します。

```
aws lambda update-function-configuration \
  --function-name my-function \
  --dead-letter-config TargetArn=arn:aws:sns:us-east-1:123456789012:my-topic
```

------

Lambda は、イベントをそのまま属性の追加情報と共にデッドレターキューに送信します。この情報を使用して、関数が返したエラーを特定するか、イベントをログまたは AWS X-Ray トレースと関連付けることができます。

**デッドレターキューメッセージの属性**
+ **RequestID** (文字列) － 呼び出しリクエストの ID。リクエスト ID は関数ログに表示されます。また、X-Ray SDK を使用して、トレース内の属性のリクエスト ID を記録することもできます。その後、X-Ray コンソールで、リクエスト ID によってトレースを検索できます。
+ **ErrorCode** (数値) － HTTP ステータスコード。
+ **ErrorMessage** (文字列) － エラーメッセージの最初の 1 KB。

Lambda がデッドレターキューにメッセージを送信できない場合、イベントは削除され、[DeadLetterErrors](monitoring-metrics-types.md) メトリクスが発行されます。このような状況は、アクセス権限がない、またはメッセージの合計サイズがターゲットとなるキューやトピックの制限を超えてしまった場合に発生します。例えば、本文のサイズが 1 MB に近い Amazon SNS 通知が、エラーとなる関数をトリガーしたとします。その場合、Amazon SNS によって追加されたイベントデータと Lambda によって追加された属性の組み合わせによって、メッセージがデッドレターキューで許可されている最大サイズを超過することがあります。

Amazon SQS をイベントソースとして使用する場合、Amazon SQS キューでは Lambda 関数ではなくデッドレターキューを設定します。詳細については、「[Amazon SQS での Lambda の使用](with-sqs.md)」を参照してください。

# 耐久性のある Lambda 関数の呼び出し
<a name="durable-invocation"></a>

耐久性のある Lambda 関数は、デフォルトの Lambda 関数と同じ方法を使用して呼び出すことができますが、長時間の実行には重要な考慮事項があります。このセクションでは、耐久性のある関数の呼び出しパターン、実行管理、ベストプラクティスについて説明します。

## 同期呼び出しの制限
<a name="synchronous-invocation-limits"></a>

耐久性のある Lambda 関数の同期呼び出しは、デフォルトの Lambda 関数と同様に 15 分に制限されます。耐久性のある関数を 15 分以上実行する必要がある場合、非同期的に呼び出す必要があります。

**同期呼び出しを使用するタイミング:** 15 分以内に完了する耐久性のある関数、ならびに結果 (迅速な承認ワークフローや短いデータ処理タスクなど) が即時に必要なときに使用します。

## 長時間のワークフローの非同期呼び出し
<a name="asynchronous-invocation"></a>

15 分以上実行される可能性がある耐久性のある関数の場合、非同期呼び出しを使用します。クライアントがすぐに確認を取る間、関数の実行を継続できます。

------
#### [ TypeScript ]

```
import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";

const client = new LambdaClient({});

// Asynchronous invocation
const command = new InvokeCommand({
  FunctionName: "my-durable-function",
  InvocationType: "Event", // Asynchronous
  Payload: JSON.stringify({ orderId: "12345" })
});

await client.send(command);
```

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

```
import boto3
import json

client = boto3.client('lambda')

# Asynchronous invocation
response = client.invoke(
    FunctionName='my-durable-function',
    InvocationType='Event',  # Asynchronous
    Payload=json.dumps({'order_id': '12345'})
)
```

------

## 実行管理 API
<a name="execution-management-apis"></a>

Lambda では API が提供され、耐久性のある関数実行 (実行の一覧表示、実行ステータスの取得、実行の停止など) を管理およびモニタリングがされます。

------
#### [ TypeScript ]

```
// Get execution status
const statusCommand = new InvokeCommand({
  FunctionName: "my-durable-function",
  InvocationType: "RequestResponse",
  Payload: JSON.stringify({ 
    action: "getStatus", 
    executionId: "exec-123" 
  })
});

const result = await client.send(statusCommand);
```

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

```
# Get execution status
response = client.invoke(
    FunctionName='my-durable-function',
    InvocationType='RequestResponse',
    Payload=json.dumps({
        'action': 'get_status',
        'execution_id': 'exec-123'
    })
)
```

------

# Lambda がストリームおよびキューベースのイベントソースからのレコードを処理する方法
<a name="invocation-eventsourcemapping"></a>

*イベントソースマッピング*は、ストリームおよびキューベースのサービスからアイテムを読み取り、レコードのバッチを使用して関数を呼び出す Lambda リソースです。イベントソースマッピング内では、*イベントポーラー*と呼ばれるリソースが新しいメッセージをアクティブにポーリングし、関数を呼び出します。デフォルトでは、Lambda はイベントポーラーを自動的にスケーリングしますが、特定のイベントソースタイプでは、[プロビジョニングモード](#invocation-eventsourcemapping-provisioned-mode)を使用して、イベントソースマッピング専用のイベントポーラーの最小数と最大数を制御できます。

以下のサービスは、イベントソースマッピングを使用して Lambda 関数を呼び出します。
+ [Amazon DocumentDB (MongoDB 互換) (Amazon DocumentDB)](with-documentdb.md)
+ [Amazon DynamoDB](with-ddb.md)
+ [Amazon Kinesis](with-kinesis.md)
+ [Amazon MQ](with-mq.md)
+ [Amazon Managed Streaming for Apache Kafka (Amazon MSK)](with-msk.md)
+ [セルフマネージド Apache Kafka](with-kafka.md)
+ [Amazon Simple Queue Service](with-sqs.md) (Amazon SQS)

**警告**  
Lambda イベントソースマッピングは各イベントを少なくとも 1 回処理し、レコードの重複処理が発生する可能性があります。重複するイベントに関連する潜在的な問題を避けるため、関数コードを冪等にすることを強くお勧めします。詳細については、AWS ナレッジセンターの「[Lambda 関数を冪等にするにはどうすればよいですか?](https://repost.aws/knowledge-center/lambda-function-idempotent)」を参照してください。

## イベントソースマッピングと直接トリガーの違い
<a name="eventsourcemapping-trigger-difference"></a>

一部の AWS のサービスは、*トリガー*を使用して Lambda 関数を直接呼び出すことができます。これらのサービスはイベントを Lambda にプッシュし、指定されたイベントが発生すると即時に関数が呼び出されます。トリガーは、個別のイベントやリアルタイム処理に適しています。[Lambda コンソールを使用してトリガーを作成する](lambda-services.md#lambda-invocation-trigger)と、コンソールは対応する AWS サービスと連携して、そのサービスでイベント通知を設定します。実際には、トリガーは Lambda ではなく、イベントを生成するサービスによって保存および管理されます。トリガーを使用して Lambda 関数を呼び出すサービスの例をいくつか示します。
+ **Amazon Simple Storage Service (Amazon S3):** オブジェクトがバケット内で作成、削除、または変更されたときに関数を呼び出します。詳細については、「[チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す](with-s3-example.md)」を参照してください。
+ **Amazon Simple Notification Service (Amazon SNS):** メッセージが SNS トピックに発行されたときに関数を呼び出します。詳細については、「[チュートリアル: Amazon Simple Notification Service での AWS Lambda の使用](with-sns-example.md)」を参照してください。
+ **Amazon API Gateway:** API リクエストが特定のエンドポイントに対して行われたときに関数を呼び出します。詳細については、「[Amazon API Gateway エンドポイントを使用した Lambda 関数の呼び出し](services-apigateway.md)」を参照してください。

イベントソースマッピングは、Lambda サービス内で作成および管理される Lambda リソースです。イベントソースマッピングは、大量のストリーミングデータやキューからのメッセージを処理できるように設計されています。ストリームまたはキューからのレコードをバッチで処理すると、レコードを個別に処理するよりも効率的です。

## バッチ処理動作
<a name="invocation-eventsourcemapping-batching"></a>

デフォルトで、イベントソースマッピングは、Lambda が関数に送信する単一のペイロードにレコードをまとめてバッチ処理します。バッチ処理の動作を微調整するには、バッチ処理ウィンドウ ([MaximumBatchingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumBatchingWindowInSeconds)) とバッチサイズ ([BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-response-BatchSize)) を設定します。バッチ処理ウィンドウとは、レコードを単一のペイロードにまとめるための最大時間です。バッチサイズとは、単一のバッチ内にあるレコードの最大数です。Lambda は、以下の 3 つの条件のいずれかが満たされたときに関数を呼び出します。
+ **バッチ処理ウィンドウが最大値に到達した。**デフォルトのバッチ処理ウィンドウの動作は、特定のイベントソースによって異なります。
  + **Kinesis、DynamoDB、および Amazon SQS イベントソースの場合:** デフォルトのバッチ処理ウィンドウは 0 秒です。つまり、Lambda はレコードが使用可能になると同時に関数を呼び出します。バッチ処理ウィンドウを設定するには、`MaximumBatchingWindowInSeconds` を設定します。このパラメータは、秒単位で 0 秒から 300 秒までの任意の値に設定できます。バッチ処理ウィンドウを設定する場合、前の関数の呼び出しが完了するとすぐに次のウィンドウが開始されます。
  + **Amazon MSK、セルフマネージド Apache Kafka、Amazon MQ、および Amazon DocumentDB イベントソースの場合:** バッチ処理ウィンドウはデフォルトで 500 ミリ秒に設定されます。`MaximumBatchingWindowInSeconds` は、秒単位で 0 秒から 300 秒までの任意の値に設定できます。Kafka イベントソースマッピングのプロビジョンドモードでバッチウィンドウを設定すると、前のバッチが完了すると同時に次のウィンドウが開始されます。プロビジョニングされていない Kafka イベントソースマッピングでバッチウィンドウを設定すると、前の関数呼び出しが完了すると同時に次のウィンドウが開始されます。プロビジョンドモードで Kafka イベントソースマッピングを使用するときのレイテンシーを最小限に抑えるには、`MaximumBatchingWindowInSeconds` を 0 に設定します。この設定は、現在の関数呼び出しの完了後、Lambda が直ちに次のバッチの処理を開始することを確実にします。低レイテンシー処理の詳細については、「[低レイテンシー Apache Kafka](with-kafka-low-latency.md)」を参照してください。
  + **Amazon MQ と Amazon DocumentDB のイベントソースの場合:** デフォルトのバッチウィンドウは 500 ミリ秒です。`MaximumBatchingWindowInSeconds` は、秒単位で 0 秒から 300 秒までの任意の値に設定できます。バッチ処理ウィンドウは、最初のレコードが到着するとすぐに開始されます。
**注記**  
`MaximumBatchingWindowInSeconds` は秒単位の増分でしか変更できないため、いったん変更すると、デフォルトのバッチ処理ウィンドウである 500 ミリ秒に戻すことはできません。デフォルトのバッチ処理ウィンドウを復元するには、新しいイベントソースマッピングを作成する必要があります。
+ **バッチサイズに適合した。**最小バッチサイズは 1 です。デフォルトのバッチサイズと最大バッチサイズは、イベントソースに応じて異なります。これらの値の詳細については、`CreateEventSourceMapping` API オペレーションの [BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-BatchSize) の仕様を参照してください。
+ **ペイロードサイズが [6 MB](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html) に到達した。**この上限を変更することはできません。

以下の図は、これら 3 つの条件を説明するものです。バッチ処理ウィンドウが `t = 7` 秒で開始されるとします。最初のシナリオでは、バッチ処理ウィンドウが 5 個のレコードを蓄積した後、`t = 47` 秒の時点で最大値の 40 秒に到達します。2 番目のシナリオでは、バッチ処理ウィンドウの期限が切れる前にバッチサイズが 10 個になるため、バッチ処理ウィンドウが早く終了します。3 番目のシナリオでは、バッチ処理ウィンドウの期限が切れる前に最大ペイロードサイズに到達するため、バッチ処理ウィンドウが早く終了します。

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/batching-window.png)


バッチおよびレコードの各種サイズのテストにより、関数がタスクを完了できるスピードに合わせて各イベントソースのポーリング間隔を調整することをおすすめします。[CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) `BatchSize` パラメータにより、各呼び出しで関数に送信できるレコードの最大数を制御します。通常、バッチサイズが大きいほど、大きなレコードセット全体での呼び出しのオーバーヘッドをより効率的に吸収し、スループットを増大できます。

Lambda は、設定された[拡張機能](lambda-extensions.md)の完了を待たずに、次のバッチを処理のために送信します。つまり、Lambda がレコードの次のバッチを処理する間も拡張機能を実行し続けることができます。アカウントの[同時実行](lambda-concurrency.md)設定または制限に違反すると、スロットリングの問題が発生する可能性があります。これが潜在的な問題であるかどうかを検出するには、関数を監視し、イベントソースマッピングで予想よりも高い[同時実行メトリクス](monitoring-concurrency.md#general-concurrency-metrics)が表示されているかどうかを確認します。呼び出しの間隔が短いため、Lambda はシャードの数よりも高い同時実行使用量を一時的に報告する場合があります。これは、拡張機能のない Lambda 関数にも当てはまります。

関数がエラーを返す場合は、デフォルトで、イベントソースマッピングは関数が成功するまで、またはバッチ内の項目の期限が切れるまでバッチ全体を再処理します。処理が順序正しく行われることを確実にするため、イベントソースマッピングは、エラーが解決されるまで影響を受けたシャードの処理を一時停止します。ストリームソース (DynamoDB と Kinesis) については、関数がエラーを返すときに Lambda が再試行する最大回数を設定できます。バッチが関数に到達しないサービスエラーまたはスロットルは、再試行としてカウントされません。イベントバッチを破棄したときに呼び出しレコードを[送信先](invocation-async-retain-records.md#invocation-async-destinations)に送信するように、イベントソースマッピングを設定することもできます。

## プロビジョンドモード
<a name="invocation-eventsourcemapping-provisioned-mode"></a>

Lambda イベントソースマッピングは、イベントポーラーを使用して、新しいメッセージのイベントソースをポーリングします。デフォルトでは、Lambda はメッセージ量に基づいてこれらのポーラーの自動スケーリングを管理します。メッセージトラフィックが増加すると、Lambda は負荷に対応するためにイベントポーラーの数を自動的に増やし、トラフィックが減少すると減らします。

プロビジョニングモードでは、引き続き予想されるトラフィックパターンを処理する準備ができている専用ポーリングリソースの最小制限と最大制限を定義することで、イベントソースマッピングのスループットをファインチューニングできます。これらのリソースは、イベントトラフィックの急増を処理するために 3 倍速く自動スケーリングされ、数百万のイベントを処理を可能にする 16 倍の処理容量を提供します。これにより、厳格なパフォーマンス要件を持つ、応答性の高いイベント駆動型ワークロードを構築できます。

Lambda では、イベントポーラーは、イベントソースタイプによって異なるスループット機能を備えたコンピューティングユニットです。Amazon MSK およびセルフマネージド Apache Kafka の場合、各イベントポーラーは最大 5 MB/秒のスループットまたは最大 5 個の同時呼び出しを処理できます。例えば、イベントソースが 1 MB の平均ペイロードを生成し、関数の平均時間が 1 秒の場合、単一の Kafka イベントポーラーは 5 MB/秒のスループットと 5 個の同時 Lambda 呼び出しをサポートできます (ペイロード変換がないと仮定)。Amazon SQS の場合、各イベントポーラーは最大 1 MB/秒のスループットまたは最大 10 個の同時呼び出しを処理できます。プロビジョンドモードを使用すると、イベントポーラーの使用状況に基づいて追加コストが発生します。料金の詳細については、「[AWS Lambda の料金](https://aws.amazon.com/lambda/pricing/)」を参照してください。

プロビジョンドモードは、Amazon MSK、セルフマネージド Apache Kafka、および Amazon SQS のイベントソースで利用可能です。同時実行設定では関数のスケーリングを制御できますが、プロビジョニングモードではイベントソースマッピングのスループットを制御できます。最大のパフォーマンスを確保するには、両方の設定を個別に調整する必要がある場合があります。

プロビジョンドモードは、マーケットデータフィードを処理する金融サービス会社、リアルタイムでパーソナライズされたお薦め情報を提供する e コマースプラットフォーム、ライブプレイヤーインタラクションを管理するゲーム会社など、安定したイベント処理レイテンシーが求められるリアルタイムアプリケーションに最適です。

イベントポーラーごとに異なるスループットキャパシティがサポートされます。
+ Amazon MSK およびセルフマネージド Apache Kafka の場合: 最大 5 MB/秒のスループット、または最大 5 回の同時呼び出し
+ Amazon SQS の場合: 最大 1 MB/秒のスループット、最大 10 回の同時呼び出し、または 1 秒あたり最大 10 回の SQS ポーリング API コール。

Amazon SQS イベントソースマッピングでは、ポーラーの最小数は 2〜200 の範囲で設定でき、デフォルトは 2、最大数は 2～2,000 の範囲で設定でき、デフォルトは 200 になります。Lambda は、設定された最小値と最大値の間でイベントポーラーの数をスケーリングし、1 分あたり最大 1,000 個の同時実行数をすばやく追加して、一貫した低レイテンシーのイベント処理を実現します。

Kafka イベントソースマッピングでは、ポーラーの最小数を 1～200 の範囲で設定でき、デフォルトは 1、最大数を 1～2,000 の範囲で設定でき、デフォルトは 200 になります。Lambda は、トピック内のイベントバックログに基づいて、設定された最小値と最大値の間でイベントポーラーの数をスケーリングし、低レイテンシーのイベントの処理を実現します。

Amazon SQS イベントソースの場合、最大同時実行数の設定をプロビジョニングモードで使用することはできないことにご留意ください。プロビジョンドモードを使用する場合、最大イベントポーラー設定を使用して同時実行を制御します。

プロビジョニングモードの設定の詳細については、以下のセクションを参照してください。
+ [Configuring provisioned mode for Amazon MSK event source mappings](kafka-scaling-modes.md)
+ [Configuring provisioned mode for self-managed Apache Kafka event source mappings](kafka-scaling-modes.md#kafka-provisioned-mode)
+ [Amazon SQS イベントソースマッピングでのプロビジョンドモードの使用](with-sqs.md#sqs-provisioned-mode)

プロビジョンドモードでレイテンシーを最小限に抑えるには、`MaximumBatchingWindowInSeconds` を 0 に設定します。この設定は、現在の関数呼び出しの完了後、Lambda が直ちに次のバッチの処理を開始することを確実にします。低レイテンシー処理の詳細については、「[低レイテンシー Apache Kafka](with-kafka-low-latency.md)」を参照してください。

プロビジョニングモードを設定すると、`ProvisionedPollers` メトリクスをモニタリングすることで、ワークロードのイベントポーラーの使用状況を確認できます。詳細については、「[イベントソースマッピングメトリクス](monitoring-metrics-types.md#event-source-mapping-metrics)」を参照してください。

## イベントソースマッピング API
<a name="event-source-mapping-api"></a>

[AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) または [AWS SDK](https://aws.amazon.com/getting-started/tools-sdks/) を使用してイベントソースを管理するには、以下の API 操作を使用できます。
+ [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)
+ [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html)
+ [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html)
+ [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)
+ [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html)

# イベントソースマッピングでのタグの使用
<a name="tags-esm"></a>

イベントソースマッピングにタグを付けて、リソースを整理および管理できます。タグは、AWS のサービス間でサポートされているリソースに関連付けられた自由形式のキーと値のペアです。タグのユースケースの詳細については、「*タグ付け AWS リソースとタグエディタガイド*」の「[一般的なタグ付け戦略](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#tag-strategies)」を参照してください。

イベントソースマッピングは、独自のタグを持つことができる関数に関連付けられています。イベントソースマッピングは、関数からタグを自動的に継承しません。AWS Lambda API を使用して、タグを表示および更新できます。Lambda コンソールで特定のイベントソースマッピングを管理しながら、Amazon SQS のプロビジョンドモードを使用しているものを含め、タグの表示と更新を行うこともできます。

## タグの操作に必要なアクセス許可
<a name="esm-tags-required-permissions"></a>

AWS Identity and Access Management (IAM) ID (ユーザー、グループ、ロール) がリソースのタグを読み取るまたは設定できるようにするには、以下の対応するアクセス許可を付与します。
+ **lambda:ListTags** – リソースがタグ付けされている場合は、そのリソースで `ListTags` を呼び出す必要があるすべてのユーザーに対し、このアクセス許可を付与します。タグ付き関数の場合、このアクセス許可は `GetFunction` にも必要です。
+ **lambda:TagResource** – 作成時に `TagResource` を呼び出すかタグを実行する必要があるすべてのユーザーにこのアクセス許可を付与します。

必要に応じて、**Lambda:UntagResource** アクセス許可も付与して、リソースへの `UntagResource` 呼び出しを許可することを検討してください。

詳細については、「[Lambda のアイデンティティベースの IAM ポリシー](access-control-identity-based.md)」を参照してください。

## Lambda コンソールでのタグの使用
<a name="tags-esm-console"></a>

Lambda コンソールを使用して、Amazon SQS のプロビジョンドモードで設定されているものを含め、タグを持つイベントソースマッピングを作成し、既存のイベントソースマッピングにタグを追加して、イベントソースマッピングをタグでフィルタリングできます。

Lambda コンソールを使用してサポートされているストリームおよびキューベースのサービスのトリガーを追加すると、Lambda は自動的にイベントソースマッピングを作成します。これらのイベントソースの詳細については、「[Lambda がストリームおよびキューベースのイベントソースからのレコードを処理する方法](invocation-eventsourcemapping.md)」を参照してください。コンソールでイベントソースマッピングを作成するには、次の前提条件が必要です。
+  関数。
+ 影響を受けるサービスのイベントソース。

タグは、トリガーの作成や更新に使用するのと同じユーザーインターフェイスの一部として追加できます。

**イベントソースマッピングの作成時にタグを追加するには**

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

1. 関数の名前を選択します。

1. **[関数の概要]** で **[トリガーを追加]** をクリックします。

1. **[トリガーの設定]** のドロップダウンリストで、イベントソースの取得元となるサービスの名前を選択します。

1. イベントソースのコア設定を指定します。イベントソースの設定の詳細については、「[他の AWS サービスからのイベントを使用した Lambda の呼び出し](lambda-services.md)」の関連サービスのセクションを参照してください。

1. **[イベントソースマッピング設定]** で、**[追加設定]** を選択します。

1. **[タグ]** で **[新しいタグを追加]** を選択します。

1. **[キー]** フィールドにタグキーを入力します。タグ付け制限の詳細については、「*タグ付け AWS リソースとタグエディタユーザーガイド*」の「[タグの命名制限と要件](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices)」を参照してください。

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

**既存のイベントソースマッピングにタグを追加するには**

1. Lambda コンソールの [[イベントソースマッピング]](https://console.aws.amazon.com/lambda/home#/event-source-mappings) を開きます。

1. リソースリストから、**[関数]** と **[イベントソース ARN]** に対応するイベントソースマッピングの **UUID** を選択します。

1. **[一般設定]** ペインの下のタブリストから、**[タグ]** を選択します。

1. [**Manage tags (タグの管理)**] を選択します。

1. **新しいタグを追加**を選択します。

1. **[キー]** フィールドにタグキーを入力します。タグ付け制限の詳細については、「*タグ付け AWS リソースとタグエディタユーザーガイド*」の「[タグの命名制限と要件](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices)」を参照してください。

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

**タグでイベントソースマッピングをフィルタリングするには**

1. Lambda コンソールの [[イベントソースマッピング]](https://console.aws.amazon.com/lambda/home#/event-source-mappings) を開きます。

1. 検索ボックスを選択します。

1. ドロップダウンリストで、**[タグ]** の小見出しの下からタグキーを選択します。

1. **[使用: "tag-name"]** を選択して、このキーでタグ付けされたすべてのイベントソースマッピングを表示するか、**[演算子]** を選択して、値でさらにフィルタリングします。

1. タグキーと値の組み合わせでフィルタリングするタグ値を選択します。

検索ボックスは、タグキーの検索もサポートしています。キーの名前を入力し、リスト内で見つけます。

## AWS CLIでのタグの使用
<a name="tags-esm-cli"></a>

Lambda API を使用して、イベントソースマッピングを含む既存の Lambda リソースにタグを追加および削除できます。イベントソースマッピングの作成時にタグを追加することもできます。これにより、ライフサイクル全体を通じてリソースにタグを付けることができます。

### Lambda タグ API を使用したタグの更新
<a name="tags-esm-api-config"></a>

サポートされている Lambda リソースのタグを追加または削除するには、[TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html) および [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html) API オペレーションを使用します。

これらの操作は AWS CLI を使用して呼び出すことができます。既存のリソースにタグを追加するには、`tag-resource` コマンドを使用します。この例では、2 つのタグを追加します。1 つはキー *Department* を持つタグで、もう 1 つはキー *CostCenter* を持つタグです。

```
aws lambda tag-resource \
--resource arn:aws:lambda:us-east-2:123456789012:resource-type:my-resource \
--tags Department=Marketing,CostCenter=1234ABCD
```

タグを削除するには、`untag-resource` コマンドを使用します。この例では、キー *Department* を持つタグを削除します。

```
aws lambda untag-resource --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier \
--tag-keys Department
```

### イベントソースマッピング作成時のタグの追加
<a name="tags-esm-on-create"></a>

タグを使用して新しい Lambda イベントソースマッピングを作成するには、[CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) API オペレーションを使用します。`Tags` パラメータを指定します。このオペレーションは、`create-event-source-mapping` AWS CLI コマンドと `--tags` オプションを使用して呼び出すことができます。CLI コマンドの詳細については、「*AWS CLI コマンドリファレンス*」の「[create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)」を参照してください。

`CreateEventSourceMapping` で `Tags` パラメータを使用する前に、このオペレーションに必要な通常のアクセス許可と共に、リソースにタグを付けるアクセス許可をロールが有していることを確認してください。タグ付けのアクセス許可の詳細については、「[タグの操作に必要なアクセス許可](#esm-tags-required-permissions)」を参照してください。

### Lambda タグ API を使用したタグの表示
<a name="tags-esm-api-view"></a>

特定の Lambda リソースに適用されるタグを表示するには、`ListTags` API オペレーションを使用します。詳細については、「[ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html)」を参照してください。

このオペレーションは、ARN (Amazon リソースネーム) を指定することで `list-tags` AWS CLI コマンドで呼び出すことができます。

```
aws lambda list-tags --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier
```

### タグによるリソースのフィルタリング
<a name="tags-esm-filtering"></a>

AWS Resource Groups Tagging API [GetResources](https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html) API オペレーションを使用すると、リソースをタグでフィルタリングできます。この `GetResources` オペレーションは、それぞれにタグキーと最大 10 個のタグ値が含まれているフィルタを、最大 10 個まで受け取ります。特定のリソースタイプでフィルタリングするには、`GetResources` で `ResourceType` を指定します。

このオペレーションは、`get-resources` AWS CLI コマンドを使用して呼び出すことができます。`get-resources` の使用例については、「*AWS CLI コマンドリファレンス*」の「[get-resources](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/resourcegroupstaggingapi/get-resources.html#examples)」を参照してください。

# Lambda が関数に送信するイベントを制御する
<a name="invocation-eventfiltering"></a>

イベントフィルタリングを使用して、Lambda が関数に送信するストリームまたはキューからのレコードを制御することができます。たとえば、フィルターを追加して、関数が特定のデータパラメータを含む Amazon SQS メッセージのみを処理するようにできます。イベントフィルタリングは特定のイベントソースマッピングとだけ連動します。次の AWS のサービスのイベントソースマッピングにフィルターを追加できます。
+ Amazon DynamoDB
+ Amazon Kinesis Data Streams
+ Amazon MQ
+ Amazon Managed Streaming for Apache Kafka (Amazon MSK)
+ セルフマネージド Apache Kafka
+ Amazon Simple Queue Service (Amazon SQS)

特定のイベントソースによるフィルタリングの詳細については、「[異なる AWS のサービス を持つフィルターの使用](#filtering-by-service)」を参照してください。Lambda は Amazon DocumentDB のイベントフィルタリングをサポートしていません。

デフォルトでは、単一のイベントソースマッピングに最大 5 つの異なるフィルターを定義することができます。フィルターは論理 OR で結合されています。イベントソースのレコードが 1 つ以上のフィルター条件を満たす場合、Lambda は関数に送信する次のイベントにそのレコードを含めます。どのフィルターも条件を満たさない場合、Lambda はレコードを破棄します。

**注記**  
イベントソースに 5 つを超えるフィルターを定義する必要がある場合、イベントソースごとに最大 10 フィルターまでクォータ引き上げをリクエストできます。現在のクォータで許可されている数よりも多くのフィルターを追加しようとすると、イベントソースの作成時に Lambda はエラーを返します。

**Topics**
+ [

## イベントフィルタリングの基本を理解する
](#filtering-basics)
+ [

## フィルター条件を満たさないレコードの処理
](#filtering-criteria-not-met)
+ [

## フィルタールールの構文
](#filtering-syntax)
+ [

## イベントソースマッピングへのフィルター条件のアタッチ (コンソール)
](#filtering-console)
+ [

## イベントソースマッピングへのフィルター条件のアタッチ (AWS CLI)
](#filtering-cli)
+ [

## イベントソースマッピングへのフィルター条件のアタッチ (AWS SAM)
](#filtering-sam)
+ [

## フィルター条件の暗号化
](#filter-criteria-encryption)
+ [

## 異なる AWS のサービス を持つフィルターの使用
](#filtering-by-service)

## イベントフィルタリングの基本を理解する
<a name="filtering-basics"></a>

フィルター条件 (`FilterCriteria`) オブジェクトは、フィルターのリスト (`Filters`) で構成される構造です。各フィルターは、イベントのフィルタリングパターン (`Pattern`) を定義する構造です。パターンは、JSON フィルタールールを文字列で表したものです。`FilterCriteria` オブジェクトの構造は次の通りです。

```
{
   "Filters": [
        {
            "Pattern": "{ \"Metadata1\": [ rule1 ], \"data\": { \"Data1\": [ rule2 ] }}"
        }
    ]
}
```

以下は、わかりやすくするためにプレーン JSON で展開したフィルターの `Pattern` の値を記載しています。

```
{
    "Metadata1": [ rule1 ],
    "data": {
        "Data1": [ rule2 ]
    }
}
```

フィルターパターンには、メタデータプロパティ、データプロパティ、またはその両方を含めることができます。使用可能なメタデータパラメータおよびデータパラメータの形式は、イベントソースとして機能している AWS のサービス によって異なります。たとえば、イベントソースマッピングが Amazon SQS キューから次のレコードを受け取ったとします。

```
{
    "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
    "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
    "body": "{\\n \"City\": \"Seattle\",\\n \"State\": \"WA\",\\n \"Temperature\": \"46\"\\n}",
    "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1545082649183",
        "SenderId": "AIDAIENQZJOLO23YVJ4VO",
        "ApproximateFirstReceiveTimestamp": "1545082649185"
    },
    "messageAttributes": {},
    "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
    "eventSource": "aws:sqs",
    "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
    "awsRegion": "us-east-2"
}
```
+ **メタデータプロパティ**は、レコードを作成したイベントに関する情報を含むフィールドです。Amazon SQS レコードの例では、メタデータプロパティには `messageID`、`eventSourceArn`、`awsRegion` などのフィールドが含まれます。
+ **データプロパティ**は、ストリームまたはキューからのデータを含むレコードのフィールドです。Amazon SQS イベントの例では、データフィールドのキーは `body` であり、データプロパティはフィールド `City`、`State`、`Temperature` です。

イベントソースの種類が異なれば、データフィールドに使用するキー値も異なります。データプロパティをフィルタリングするには、フィルターのパターンに正しいキーが使われていることを確認してください。データフィルタリングキーのリストおよびサポートされている各 AWS のサービス のフィルターパターンの例については、[異なる AWS のサービス を持つフィルターの使用](#filtering-by-service) を参照してください。

イベントフィルタリングは、マルチレベル JSON のフィルタリングを処理できます。たとえば、DynamoDB ストリームのレコードに次のフラグメントがあるとします。

```
"dynamodb": {
    "Keys": {
        "ID": {
            "S": "ABCD"
        }
        "Number": {
            "N": "1234"
    },
    ...
}
```

ソートキー `Number` の値が 4567 のレコードのみを処理するとします。この場合、`FilterCriteria` オブジェクトは以下のようになります。

```
{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\": { \"Keys\": { \"Number\": { \"N\": [ "4567" ] } } } }"
        }
    ]
}
```

以下は、わかりやすくするためにプレーン JSON で展開したフィルターの `Pattern` の値を記載しています。

```
{
    "dynamodb": {
        "Keys": {
            "Number": {
                "N": [ "4567" ]
                }
            }
        }
}
```

## フィルター条件を満たさないレコードの処理
<a name="filtering-criteria-not-met"></a>

Lambda がフィルター条件を満たさないレコードを処理する方法は、イベントソースによって異なります。
+ **Amazon SQS** では、メッセージがフィルター条件を満たさない場合、Lambda はそのメッセージをキューから自動的に削除します。Amazon SQS でこれらのメッセージを手動で削除する必要はありません。
+ **Kinesis** および **DynamoDB** では、フィルター条件によってレコードが評価された後、ストリームイテレータはこのレコードを通り越して先に進みます。レコードがフィルター条件を満たさない場合に、そのレコードをイベントソースから手動で削除する必要はありません。保持期間が過ぎると、Kinesis と DynamoDB はこれらの古いレコードを自動的に削除します。それより早くレコードを削除したい場合は、「[データ保持期間の変更](https://docs.aws.amazon.com/streams/latest/dev/kinesis-extended-retention.html)」を参照してください。
+ **Amazon MSK**、**セルフマネージド Apache Kafka**、**Amazon MQ** メッセージの場合、Lambda はフィルターに含まれるすべてのフィールドに一致しないメッセージを削除します。Amazon MSK およびセルフマネージド Apache Kafka では、Lambda は関数を正常に呼び出した後、一致するメッセージと一致しないメッセージのオフセットをコミットします。Amazon MQ では、Lambda は関数を正常に呼び出した後で一致するメッセージを認識し、一致しないメッセージはフィルタリング時に認識します。

## フィルタールールの構文
<a name="filtering-syntax"></a>

フィルタールールの場合、Lambda は Amazon EventBridge ルールをサポートしており、EventBridge と同じ構文を使用します。詳細については、「*Amazon EventBridge のユーザーガイド*」の「[Amazon EventBridge のイベントパターン](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)」を参照してください。

以下は、Lambda のイベントフィルタリングで使用できるすべての比較演算子の概要です。


| Comparison operator (比較演算子) | 例 | ルール構文 | 
| --- | --- | --- | 
|  Null  |  UserId が Null  |  "UserID": [ null ]  | 
|  空  |  LastName が空白  |  "LastName": [""]  | 
|  等しい  |  Name が「Alice」  |  "Name": [ "Alice" ]  | 
|  等しい (大文字と小文字を区別しない)  |  Name が「Alice」  |  "Name": [ \$1 "equals-ignore-case": "alice" \$1 ]  | 
|  And  |  Location が「New York」、および Day が「Monday」  |  "Location": [ "New York" ], "Day": ["Monday"]  | 
|  または  |  PaymentType が「Credit」または「Debit」  |  "PaymentType": [ "Credit", "Debit"]  | 
|  Or (複数フィールド)  |  Location が「New York」、または Day が「Monday」  |  "\$1or": [ \$1 "Location": [ "New York" ] \$1, \$1 "Day": [ "Monday" ] \$1 ]   | 
|  以外  |  Weather が「Raining」以外  |  "Weather": [ \$1 "anything-but": [ "Raining" ] \$1 ]  | 
|  数値 (等しい)  |  Price が 100  |  "Price": [ \$1 "numeric": [ "=", 100 ] \$1 ]  | 
|  数値 (範囲)  |  Price が 10 より大きく 20 以下  |  "Price": [ \$1 "numeric": [ ">", 10, "<=", 20 ] \$1 ]  | 
|  存在する  |  ProductName が存在  |  "ProductName": [ \$1 "exists": true \$1 ]  | 
|  存在しない  |  ProductName が存在しない  |  "ProductName": [ \$1 "exists": false \$1 ]  | 
|  で始まる  |  Region が US にある  |  "Region": [ \$1"prefix": "us-" \$1 ]  | 
|  Ends with  |  FileName は.png 拡張子で終わります。  |  "FileName": [ \$1 "suffix": ".png" \$1 ]   | 

**注記**  
EventBridge と同様に、Lambda は文字列に対して文字単位の厳密な一致を使用し、大文字変換やその他の文字列の正規化は行いません。数値の場合、Lambda は文字列表現も使用します。たとえば、300、300.0、3.0e2 は等しいとはみなされません。

EXISTS 演算子は、イベントソース JSON のリーフノードでのみ機能することに注意してください。中間ノードとは一致しません。例えば、次の JSON では `"address"` は中間ノードであるため、`{ "person": { "address": [ { "exists": true } ] } }"` のフィルターパターンで一致するものが見つかりません。

```
{
  "person": {
    "name": "John Doe",
    "age": 30,
    "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "country": "USA"
    }
  }
}
```

## イベントソースマッピングへのフィルター条件のアタッチ (コンソール)
<a name="filtering-console"></a>

Lambda コンソールを使用してフィルター条件を持つ新しいイベントソースマッピングを作成するには、以下の手順を実行します。

**フィルター条件が設定された新しいイベントソースマッピングを作成する (コンソール)**

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

1. イベントソースマッピングを作成する関数の名前を選択します。

1. **[Function overview]** (関数の概要) で **[Add trigger]** (トリガーを追加) をクリックします。

1. **[トリガーの設定]** で、イベントフィルタリングをサポートするトリガータイプを選択します。サポートされているサービスのリストについては、このページの冒頭にあるリストを参照してください。

1. **[追加の設定]** を展開します。

1. **[フィルター条件]** で **[追加]** を選択してから、フィルターを定義して入力します。たとえば、次の内容を入力できます。

   ```
   { "Metadata" : [ 1, 2 ] }
   ```

   これは、フィールド `Metadata` が 1 または 2 に等しいレコードのみを処理するように Lambda に指示します。引き続き **[追加]** を選択し、最大許容数量までフィルターを追加できます。

1. フィルターの追加を完了したら、**[保存]** を選択します。

コンソールを使用してフィルター条件を入力するとき、フィルターパターンのみを入力し、`Pattern` キーまたはエスケープの引用符を入力する必要はありません。上記の手順のステップ 6 では、`{ "Metadata" : [ 1, 2 ] }` は次の `FilterCriteria` に対応します。

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

コンソールでイベントソースマッピングを作成すると、トリガーの詳細にフォーマットされた `FilterCriteria` が表示されます。コンソールを使用してイベントフィルターを作成するその他の例については、[異なる AWS のサービス を持つフィルターの使用](#filtering-by-service) を参照してください。

## イベントソースマッピングへのフィルター条件のアタッチ (AWS CLI)
<a name="filtering-cli"></a>

イベントソースマッピングに以下の `FilterCriteria` を設定するとします。

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

AWS Command Line Interface (AWS CLI) を使用してこれらのフィルター条件を持つ新しいイベントソースマッピングを作成するには、以下のコマンドを実行します。

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'
```

この [create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html) コマンドは、指定された `FilterCriteria` を持つ関数 `my-function` の新しい Amazon SQS イベントソースマッピングを作成します。

これらのフィルター条件を既存のイベントソースマッピングに追加するには、次のコマンドを実行します。

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'
```

イベントソースマッピングを更新するには、その UUID が必要であることに注意してください。UUID は [list-event-source-mappings](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html) 呼び出しから取得できます。Lambda は、[create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html) CLI 応答でも UUID を返します。

イベントソースからフィルター条件を削除するには、空の `FilterCriteria` オブジェクトを持つ次の [update-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/update-event-source-mapping.html) コマンドを実行します。

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria "{}"
```

AWS CLI を使用してイベントフィルターを作成するその他の例については、[異なる AWS のサービス を持つフィルターの使用](#filtering-by-service) を参照してください。

## イベントソースマッピングへのフィルター条件のアタッチ (AWS SAM)
<a name="filtering-sam"></a>

 以下のフィルタ条件を使用するように AWS SAM 内のイベントソースを設定したいとします。

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

 これらのフィルタ条件をイベントソースマッピングに追加するには、イベントソースの YAML テンプレートに以下のスニペットを挿入します。

```
FilterCriteria: 
  Filters: 
    - Pattern: '{"Metadata": [1, 2]}'
```

 イベントソースマッピング用の AWS SAM テンプレートの作成と設定に関する詳細については、「AWS SAM デベロッパーガイド」の「[EventSource](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-eventsource.html)」セクションを参照してください。AWS SAM テンプレートを使用してイベントフィルターを作成するその他の例については、[異なる AWS のサービス を持つフィルターの使用](#filtering-by-service) を参照してください。

## フィルター条件の暗号化
<a name="filter-criteria-encryption"></a>

Lambda は、デフォルトではフィルター条件オブジェクトを暗号化しません。フィルター条件オブジェクトに機密情報を含める可能性があるユースケースでは、自分の [KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)を使用してそのオブジェクトを暗号化できます。

フィルター条件オブジェクトを暗号化した後でも、[GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) API コールを使用すれば、そのオブジェクトをプレーンテキストで表示できます。フィルター条件をプレーンテキストで正しく表示するためには、`kms:Decrypt` アクセス許可が必要です。

**注記**  
フィルター条件オブジェクトが暗号化されている場合、Lambda は [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html) 呼び出しに応答する際に `FilterCriteria` フィールドの値をマスキングします。そのため、このフィールドには `null` が表示されます。`FilterCriteria` の実際の値を表示するには、[GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) API を使用します。  
`FilterCriteria` を復号化した値をコンソールに表示するには、自身に付与された IAM ロールに [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) へのアクセス許可が含まれている必要があります。

コンソール、API/CLI、または CloudFormation から自分の KMS キーを指定できます。

**顧客所有の KMS キーでフィルター条件を暗号化するには (コンソール)**

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

1. **[トリガーを追加]** を選択します。既にトリガーが存在する場合は、**[設定]** タブ、**[トリガー]** の順に選択します。その既存のトリガーを選択し、**[編集]** を選択します。

1. **[カスタマー管理 KMS キーで暗号化]** の隣にあるチェックボックスをオンにします。

1. **[カスタマー管理 KMS 暗号化キーの選択]** で、既存の有効なキーを選択するか、新たにキーを作成します。実行する操作によっては、`kms:DescribeKey`、`kms:GenerateDataKey`、`kms:Decrypt` のアクセス許可の一部または全部が必要になります。これらのアクセス許可を付与するには、KMS キーポリシーを使用します。

自分の KMS キーを使用する場合は、[キーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)で次の API オペレーションを許可する必要があります。
+ `kms:Decrypt` – リージョンの Lambda サービスプリンシパル (`lambda.AWS_region.amazonaws.com`) に付与する必要があります。これにより、Lambda がこの KMS キーでデータを復号できるようになります。
  + [サービス間の混乱による代理問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)の発生を防ぐため、キーポリシーでは [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) グローバル条件キーを使用します。`aws:SourceArn` キーの正しい値はイベントソースマッピングリソースの ARN であるため、その ARN がわからなければポリシーに追加することはできません。また、Lambda は復号のリクエストを KMS に送るときに、`aws:lambda:FunctionArn` キーと `aws:lambda:EventSourceArn` キーのほか、それぞれの値を[暗号化コンテキスト](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)に含めて転送します。復号のリクエストを正常に処理するためには、これらの値がキーポリシーに指定された条件に一致する必要があります。セルフマネージドの Kafka イベントソースの場合、EventSourceArn がないため、EventSourceArn を含める必要はありません。
+ `kms:Decrypt` – プリンシパルがキーを使用して [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) または [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) の API コールにフィルター条件をプレーンテキストで表示する場合は、そのプリンシパルにも付与する必要があります。
+ `kms:DescribeKey` — カスタマー管理キーの詳細を定義して、指定されたプリンシパルがキーを使用できるようにします。
+ `kms:GenerateDataKey` – フィルター条件を暗号化するためのデータキーを、指定されたプリンシパルに代わって Lambda が生成できるように、必要なアクセス許可を指定します ([エンベロープ暗号化](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping))。

AWS CloudTrail を使用して、Lambda がユーザーに代わって行う AWS KMS リクエストを追跡できます。サンプルの CloudTrail イベントについては、「[Lambda の暗号化キーのモニタリング](security-encryption-at-rest.md#encryption-key-monitoring)」を参照してください。

また、[https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service) 条件キーを使用して、Lambda からのリクエストに対してのみ KMS キーを使用できるように制限することをお勧めします。このキーの値は、リージョンの Lambda サービスプリンシパル (`lambda.AWS_region.amazonaws.com`) です。次に、関連するすべてのアクセス許可を付与するキーポリシーの例を示します。

**Example AWS KMS キーポリシー**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "example-key-policy-1",
    "Statement": [
        {
            "Sid": "Allow Lambda to decrypt using the key",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.us-east-1.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals" : {
                    "aws:SourceArn": [
                        "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:<esm_uuid>"
                    ]
                },
                "StringEquals": {
                    "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:test-function",
                    "kms:EncryptionContext:aws:lambda:EventSourceArn": "arn:aws:sqs:us-east-1:123456789012:test-queue"
                }
            }
        },
        {
            "Sid": "Allow actions by an AWS account on the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key to specific roles",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/ExampleRole"
            },
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals" : {
                    "kms:ViaService": "lambda.us-east-1.amazonaws.com"
                }
            }
        }
    ]
}
```

自分の KMS キーを使用してフィルター条件を暗号化する場合は、次の [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) AWS CLI コマンドを使用することもできます。`--kms-key-arn` フラグを使用して、KMS キー ARN を指定します。

```
aws lambda create-event-source-mapping --function-name my-function \
    --maximum-batching-window-in-seconds 60 \
    --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
    --filter-criteria "{\"filters\": [{\"pattern\": \"{\"a\": [\"1\", \"2\"]}\" }]}" \
    --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

イベントソースマッピングが既にある場合は、代わりに [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) AWS CLI コマンドを使用します。`--kms-key-arn` フラグを使用して、KMS キー ARN を指定します。

```
aws lambda update-event-source-mapping --function-name my-function \
    --maximum-batching-window-in-seconds 60 \
    --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
    --filter-criteria "{\"filters\": [{\"pattern\": \"{\"a\": [\"1\", \"2\"]}\" }]}" \
    --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

この操作では、以前に指定された KMS キーがあれば上書きされます。`--kms-key-arn` フラグと共に空の引数を指定すると、Lambda はフィルター条件を暗号化する際に KMS キーを使用しなくなります。代わりに、Lambda はデフォルトの設定に戻って Amazon 所有のキーを使用します。

CloudFormation テンプレートに自分の KMS キーを指定するには、`AWS::Lambda::EventSourceMapping` リソースタイプの `KMSKeyArn` プロパティを使用します。例えば、次のスニペットをイベントソースの YAML テンプレートに挿入できます。

```
MyEventSourceMapping:
  Type: AWS::Lambda::EventSourceMapping
  Properties:
    ...
    FilterCriteria:
      Filters:
        - Pattern: '{"a": [1, 2]}'
    KMSKeyArn: "arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599"
    ...
```

[GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) または [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) API コールに暗号化されたフィルター条件をプレーンテキストで表示できるようにするには、`kms:Decrypt` アクセス許可が必要です。

2024 年 8 月 6 日以降、関数でイベントフィルタリングが使用されていない場合、[CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)、[UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)、[DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) の API コールの AWS CloudTrail ログには、`FilterCriteria` フィールドが表示されなくなります。関数でイベントフィルタリングが使用されていれば、`FilterCriteria` フィールドは空 (`{}`) になります。適切な KMS キーに対して `kms:Decrypt` アクセス許可が付与されていれば、これまで通り [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) API コールに応答する際にフィルター条件をプレーンテキストで表示できます。

### Create/Update/DeleteEventSourceMapping 呼び出しを行った場合の CloudTrail ログエントリの例
<a name="filter-criteria-encryption-cloudtrail"></a>

次に示した CreateEventSourceMapping 呼び出しの AWS CloudTrail ログエントリの例では、関数でイベントフィルタリングが使用されているため、`FilterCriteria` が空 (`{}`) になっています。これは、`FilterCriteria` オブジェクトに含まれている有効なフィルター条件が関数でアクティブに使用されている場合でも当てはまります。関数でイベントフィルタリングが使用されていない場合、`FilterCriteria` フィールドは CloudTrail のログエントリのどこにも表示されません。

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROA123456789EXAMPLE:userid1",
        "arn": "arn:aws:sts::123456789012:assumed-role/Example/example-role",
        "accountId": "123456789012",
        "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROA987654321EXAMPLE",
                "arn": "arn:aws:iam::123456789012:role/User1",
                "accountId": "123456789012",
                "userName": "User1"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-05-09T20:35:01Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2024-05-09T21:05:41Z",
    "eventSource": "lambda.amazonaws.com",
    "eventName": "CreateEventSourceMapping20150331",
    "awsRegion": "us-east-2",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "eventSourceArn": "arn:aws:sqs:us-east-2:123456789012:example-queue",
        "functionName": "example-function",
        "enabled": true,
        "batchSize": 10,
        "filterCriteria": {},
        "kMSKeyArn": "arn:aws:kms:us-east-2:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "scalingConfig": {},
        "maximumBatchingWindowInSeconds": 0,
        "sourceAccessConfigurations": []
    },
    "responseElements": {
        "uUID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
        "batchSize": 10,
        "maximumBatchingWindowInSeconds": 0,
        "eventSourceArn": "arn:aws:sqs:us-east-2:123456789012:example-queue",
        "filterCriteria": {},
        "kMSKeyArn": "arn:aws:kms:us-east-2:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:example-function",
        "lastModified": "May 9, 2024, 9:05:41 PM",
        "state": "Creating",
        "stateTransitionReason": "USER_INITIATED",
        "functionResponseTypes": [],
        "eventSourceMappingArn": "arn:aws:lambda:us-east-2:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLEbbbbb"
    },
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management",
    "sessionCredentialFromConsole": "true"
}
```

## 異なる AWS のサービス を持つフィルターの使用
<a name="filtering-by-service"></a>

イベントソースの種類が異なれば、データフィールドに使用するキー値も異なります。データプロパティをフィルタリングするには、フィルターのパターンに正しいキーが使われていることを確認してください。次の表では、サポートされている各 AWS のサービス のフィルタリングキーが示されます。


| AWS のサービス | フィルタリングキー | 
| --- | --- | 
| DynamoDB | dynamodb | 
| Kinesis | data | 
| Amazon MQ | data | 
| Amazon MSK | value | 
| セルフマネージド Apache Kafka | value | 
| Amazon SQS | body | 

次のセクションでは、さまざまなタイプのイベントソースのフィルターパターンの例を示します。サポートされている受信データ形式の定義およびサポートされている各サービスのフィルターパターン本体形式も提供します。
+ [DynamoDB イベントソースでのイベントフィルタリングの使用](with-ddb-filtering.md)
+ [Kinesis イベントソースでのイベントフィルタリングの使用](with-kinesis-filtering.md)
+ [Amazon MQ イベントソースからのイベントをフィルタリングする](with-mq-filtering.md)
+ [Amazon MSK およびセルフマネージド Apache Kafka イベントソースからのイベントのフィルタリング](kafka-filtering.md)
+ [Amazon SQS イベントソースでのイベントフィルタリングの使用](with-sqs-filtering.md)

# コンソールでの Lambda 関数のテスト
<a name="testing-functions"></a>

コンソールで Lambda 関数をテストするには、テストイベントを使用して関数を呼び出します。*テストイベント*とは、関数への JSON 入力です。関数が入力を必要としない場合、イベントは空のドキュメント `({})` にすることができます。

コンソールでテストを実行すると、Lambda はテストイベントと同期して関数を呼び出します。関数ランタイムは イベント JSON をオブジェクトに変換し、コードのハンドラーメソッドに渡して処理します。

**テストイベントを作成する**  
コンソールでテストする前に、プライベートまたは共有可能なテストイベントを作成する必要があります。

## テストイベントで関数を呼び出す
<a name="invoke-with-event"></a>

**関数をテストするには**

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

1. テストする関数の名前を選択します。

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

1. **[テストイベント]** で、**[新しいイベントを作成]** または **[保存されたイベント]** を選択し、使用する保存済みのイベントを選択します。

1. 必要に応じて、イベント JSON の **[テンプレート]** を選択します。

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

1. テスト結果を確認するには、**[Execution result]** (実行結果) で、**[Details]** (詳細) を展開します。

テストイベントを保存せずに関数を呼び出すには、保存する前に **[Test]** (テスト) を選択します。これにより、Lambda がセッション期間中だけ保持し、保存されないテストイベントが作成されます。

Node.js、Python、Ruby ランタイムの場合、**[コード]** タブで既存の保存済みおよび未保存のテストイベントにアクセスすることもできます。**[テストイベント]** セクションを使用して、テストを作成、編集、実行します。

## プライベートテストイベントを作成する
<a name="creating-private-events"></a>

プライベートテストイベントは、イベント作成者のみが使用でき、追加のアクセス許可は必要ありません。関数ごとに、最大 10 個のプライベートテストイベントを作成し保存できます。

**プライベートテストイベントを作成するには**

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

1. テストする関数の名前を選択します。

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

1. **[Test event]** (テストイベント) で、次の作業を行います。

   1. **[Template]** (テンプレート) を選択します。

   1. テストの **[Name]** (名前) を入力します。

   1. テキスト入力ボックスに、JSON テストイベントを入力します。

   1. **[Event sharing settings]** (イベント共有設定) で、**[Private]** (プライベート) を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

Node.js、Python、Ruby ランタイムの場合、**[コード]** タブでテストイベントを作成することもできます。**[テストイベント]** セクションを使用して、テストを作成、編集、実行します。

## 共有可能なテストイベントを作成する
<a name="creating-shareable-events"></a>

共有可能なテストイベントは、同じ AWS アカウント内の他のユーザーと共有できるテストイベントです。他のユーザーの共有可能なテストイベントを編集し、それを使用して関数を呼び出すことができます。

Lambda は、共有可能なテストイベントをスキーマとして `lambda-testevent-schemas` という名前の [Amazon EventBridge (CloudWatch Events) スキーマレジストリ](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-schema-registry.html)に保存します。Lambda はこのレジストリを使用して、作成した共有可能なテストイベントを保存したり呼び出したりするので、このレジストリの編集や `lambda-testevent-schemas` 名を使用したレジストリの作成はしないようにお勧めします。

共有可能なテストイベントを表示、共有、編集するには、次の [EventBridge (CloudWatch Events) スキーマレジストリ API オペレーション](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/operations.html)のすべてについてアクセス許可が付与されている必要があります。
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#CreateRegistry](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#CreateRegistry)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#CreateSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#CreateSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DeleteSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DeleteSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-version-schemaversion.html#DeleteSchemaVersion](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-version-schemaversion.html#DeleteSchemaVersion)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#DescribeRegistry](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#DescribeRegistry)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DescribeSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DescribeSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-discover.html#GetDiscoveredSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-discover.html#GetDiscoveredSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-versions.html#ListSchemaVersions](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-versions.html#ListSchemaVersions)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#UpdateSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#UpdateSchema)

共有可能なテストイベントに加えた編集を保存すると、そのイベントが上書きされることに注意してください。

共有可能なテストイベントを作成、編集、または表示できない場合は、アカウントにこれらのオペレーションに必要なアクセス許可があることを確認してください。必要なアクセス許可を持っていても、共有可能なテストイベントにアクセスできない場合は、EventBridge (CloudWatch Events) レジストリへのアクセスを制限している可能性がある[リソースベースのポリシー](access-control-resource-based.md)がないか確認します。

**共有可能なテストイベントを作成するには**

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

1. テストする関数の名前を選択します。

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

1. **[Test event]** (テストイベント) で、次の作業を行います。

   1. **[Template]** (テンプレート) を選択します。

   1. テストの **[Name]** (名前) を入力します。

   1. テキスト入力ボックスに、JSON テストイベントを入力します。

   1. **[Event sharing settings]** (イベント共有設定) で、**[Shareable]** (共有可能) を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

**AWS Serverless Application Model で共有可能なテストイベントを使用する。**  
AWS SAM を使用して共有可能なテストイベントを呼び出すことができます。「[AWS Serverless Application Model デベロッパーガイド](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html)」の「[https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html)」を参照してください。

## 共有可能なテストイベントスキーマの削除
<a name="deleting-test-schemas"></a>

共有可能なテストイベントを削除すると、Lambda はそれらを `lambda-testevent-schemas` レジストリから削除します。レジストリから最後の共有可能なテストイベントを削除すると、Lambda はレジストリを削除します。

関数を削除しても、Lambda は関連付けられた共有可能なテストイベントスキーマを削除しません。これらのリソースは、[EventBridge (CloudWatch Events) コンソール](https://console.aws.amazon.com/events) から手動でクリーンアップする必要があります。

# Lambda 関数の状態
<a name="functions-states"></a>

関数を呼び出す準備ができたことを示すために、Lambda はすべての関数の関数設定に [[状態]](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) フィールドを含めます。`State` は、関数の現在の関数のステータスに関する情報 (関数を正常に呼び出すことができるかどうかなど) を提供します。関数の状態は、関数呼び出しの動作や関数によるコードの実行方法を変更するものではありません。

**注記**  
関数の状態定義は、[SnapStart](snapstart.md) 関数では若干異なります。詳細については、「[Lambda SnapStart と関数の状態](snapstart-activate.md#snapstart-function-states)」を参照してください。

多くの場合、DynamoDB テーブルは呼び出し間で状態を保持する理想的な方法です。DynamoDB テーブルは低レイテンシーのデータアクセスを提供し、Lambda サービスに合わせてスケールできるためです。このサービスを使用している場合、[Amazon EFS for Lambda](https://aws.amazon.com/blogs/compute/using-amazon-efs-for-aws-lambda-in-your-serverless-applications/) にデータを保存することもできます。これにより、ファイルシステムストレージへの低レイテンシーアクセスが可能になります。

関数の状態は以下のとおりです。
+ `Pending` — Lambda は関数を作成した後、関数の状態を保留に設定します。保留状態の場合、Lambda は関数のリソース (VPC や EFS リソースなど) の作成または設定を試みます。Lambda は、保留状態の関数を呼び出しません。関数に対する呼び出しやその他の API アクションは、すべて失敗します。
+ `Active` — Lambda がリソース設定とプロビジョニングを完了した後、関数はアクティブ状態に移行します。関数は、アクティブな間のみ正常に呼び出すことができます。
+ `Failed` — リソース設定またはプロビジョニングでエラーが発生したことを示します。関数の作成が失敗すると、Lambda は関数の状態を失敗に設定し、関数の削除と再作成が必要になります。
+ `Inactive` — Lambda 用に設定された外部リソースを再利用するのに十分な時間アイドル状態を維持した関数は非アクティブになります。非アクティブな関数を呼び出そうとすると、呼び出しは失敗し、関数リソースが再作成されるまで、Lambda は関数を保留状態に設定します。Lambda がリソースの再作成に失敗した場合、関数は非アクティブ状態に戻ります。エラーを解決し、関数を再デプロイしてアクティブ状態に復元する必要がある場合があります。

SDK ベースのオートメーションワークフローを使用している場合、または Lambda のサービス API を直接呼び出す場合は、呼び出し前に関数の状態をチェックして、関数がアクティブであることを確認します。この操作は、Lambda API アクションの [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) を使用するか、[AWS SDK for Java 2.0](https://github.com/aws/aws-sdk-java-v2) を使用してウェーターを設定することによって実行することができます。

```
aws lambda get-function --function-name my-function --query 'Configuration.[State, LastUpdateStatus]'
```

以下の出力が表示されます。

```
[
 "Active",
 "Successful" 
]
```

関数の作成が保留中の場合、以下のオペレーションは失敗します。
+ [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)

## 更新中の関数の状態
<a name="functions-states-updating"></a>

Lambda には、関数を更新するための 2 つのオペレーションがあります。
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html): 関数のデプロイパッケージを更新します。
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html): 関数の設定を更新します。

Lambda は [LastUpdateStatus](https://docs.aws.amazon.com/lambda/latest/api/API_FunctionConfiguration.html#lambda-Type-FunctionConfiguration-LastUpdateStatus) 属性を使用して、これらの更新オペレーションの進行状況を追跡します。更新の進行中 (`"LastUpdateStatus": "InProgress"` の場合):
+ 関数の[状態](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State)は `Active` のままです。
+ 呼び出しは、更新が完了するまで、関数の以前のコードと設定を引き続き使用します。
+ 以下のオペレーションは失敗します。
  + [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
  + [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
  + [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)
  + [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html)

更新が失敗した場合 (`"LastUpdateStatus": "Failed"` の場合):
+ 関数の[状態](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State)は `Active` のままです。
+ 呼び出しは、関数の以前のコードと設定を引き続き使用します。

**Example GetFunctionConfiguration レスポンス**  
次の例は、更新中の関数に対する [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html) リクエストの結果を示しています。  

```
{
    "FunctionName": "my-function",
    "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
    "Runtime": "nodejs24.x",
    "VpcConfig": {
        "SubnetIds": [
            "subnet-071f712345678e7c8",
            "subnet-07fd123456788a036",
            "subnet-0804f77612345cacf"
        ],
        "SecurityGroupIds": [
            "sg-085912345678492fb"
        ],
        "VpcId": "vpc-08e1234569e011e83"
    },
    "State": "Active",
    "LastUpdateStatus": "InProgress",
    ...
}
```

# Lambda での再試行動作について
<a name="invocation-retries"></a>

関数を直接呼び出すときは、関数コードに関連するエラーを処理する方法を決定します。Lambda は、ユーザーに代わってこれらのタイプのエラーを自動的に再試行しません。再試行するには、関数を手動で再呼び出しするか、失敗したイベントをデバッグのためにキューに送信するか、エラーを無視します。関数コードが部分的にまたは完全に実行されている可能性もあれば、まったく実行されない可能性もあります。再試行する場合は、関数コードが重複したトランザクションや望ましくない副作用を引き起こすことなく同じイベントを複数回処理できるようにしてください。

関数を間接的に呼び出す際、呼び出し元やリクエストが遭遇するすべてのサービスの再試行動作について把握する必要があります。これには、以下のシナリオが含まれます。
+ **非同期呼び出し** － Lambda は、関数エラーを 2 回再試行します。関数にすべての受信リクエストを処理するのに十分な容量がない場合、イベントはキュー内で数時間待機して関数に送信される可能性があります。正常に処理できなかったイベントを把握するために、デッドレターキューを設定できます。詳細については、「[デッドレターキューの追加](invocation-async-retain-records.md#invocation-dlq)」を参照してください。
+ **イベントソースマッピング** － ストリームから読み取るイベントソースマッピングは、項目のバッチ全てに対して再試行を実施します。繰り返されるエラーは、そのエラーが解決されるか、項目が期限切れになるまで、影響を受けるシャードの処理を妨げます。停止しているシャードを検出するには、[Iterator Age](monitoring-metrics.md) メトリクスをモニタすることができます。

  キューから読み取るイベントソースマッピングについては、ソースキューの再試行ポリシーおよび可視性タイムアウトを設定することで、失敗したイベントの送信先と再試行の間の時間の長さを決定します。詳細については、[Lambda がストリームおよびキューベースのイベントソースからのレコードを処理する方法](invocation-eventsourcemapping.md) および [他の AWS サービスからのイベントを使用した Lambda の呼び出し](lambda-services.md) のサービス固有のドキュメントを参照してください。
+ **AWS のサービス** － AWS のサービスでは、[同期的](invocation-sync.md)または非同期的に関数を呼び出す場合があります。同期呼び出しの場合、サービスは再試行するかどうかを決定します。例えば、Amazon S3 バッチオペレーションは、Lambda 関数が `TemporaryFailure` 応答コードを返す場合、オペレーションを再試行します。プロキシがアップストリームユーザーまたはクライアントからリクエストするサービスは、再試行戦略を持っているか、またはリクエスタにエラー応答をリレーする場合があります。例えば、API Gateway は常にエラー応答をリレーしてリクエスタに返します。

  非同期呼び出しの場合、再試行ロジックは呼び出しソースに関係なく同じです。デフォルトでは、Lambda は失敗した非同期呼び出しを最大 2 回再試行します。詳細については、「[Lambda がエラーを処理し、非同期呼び出しで再試行する方法](invocation-async-error-handling.md)」を参照してください。
+ **他のアカウントやクライアント** － 他のアカウントへのアクセス権限を付与する場合、関数を呼び出すために設定できるサービスやリソースの制限に[リソースベースのポリシー](access-control-resource-based.md)を使用することができます。関数を過負荷から守るためには、[Amazon API Gateway](services-apigateway.md) を使用して、関数の前に API レイヤーを設定することを考慮してください。

Lambda アプリケーションのエラーに対応できるよう、Lambda では、Amazon CloudWatch や AWS X-Ray などのサービスを統合しています。ログやメトリクス、アラーム、関数コード内の問題を迅速に検出および特定するトレーシング、API またはアプリケーションをサポートするその他のリソースを組み合わせて使用することができます。詳細については、「[Lambda 関数のモニタリング、デバッグ、トラブルシューティング](lambda-monitoring.md)」を参照してください。

# Lambda 再帰ループ検出を使用した無限ループの防止
<a name="invocation-recursion"></a>

関数を呼び出すのと同じサービスまたはリソースに出力するように Lambda 関数を設定すると、無限再帰ループが作成される可能性があります。例えば、Lambda 関数が Amazon Simple Queue Service (Amazon SQS) キューにメッセージを書き込み、その書き込まれたキューによって同じ関数が呼び出される場合があります。この呼び出しにより、関数はキューに別のメッセージを書き込み、キューによって関数が再び呼び出されます。

意図しない再帰ループが発生すると、AWS アカウント に予期しない料金が請求される可能性があります。ループが原因で Lambda が[スケール](lambda-concurrency.md)し、アカウントで利用可能なすべての同時実行性が使用されることもあります。意図しないループの影響を減らすために、Lambda は特定のタイプの再帰ループを発生後すぐに検出します。デフォルトでは、Lambda が再帰ループを検出すると、関数の呼び出しを停止し、ユーザーに通知します。再帰パターンを意図的に使用する仕様になっている場合は、再帰的に呼び出せるように関数のデフォルト設定を変更できます。詳細については「[Lambda 関数が再帰ループで動作するようにする](#invocation-recursion-disable)」を参照してください。

**Topics**
+ [

## 再帰ループ検出を理解する
](#invocation-recursion-concepts)
+ [

## サポートされている AWS のサービス および SDK
](#invocation-recursion-supported)
+ [

## 再帰ループ通知
](#invocation-recursion-monitoring)
+ [

## 再帰ループ検出通知への対応
](#invocation-recursion-responding)
+ [

## Lambda 関数が再帰ループで動作するようにする
](#invocation-recursion-disable)
+ [

## Lambda 再帰ループ検出に対応しているリージョン
](#invocation-recursion-regions)

## 再帰ループ検出を理解する
<a name="invocation-recursion-concepts"></a>

Lambda の再帰ループ検出は、イベントを追跡することで動作します。Lambda はイベント駆動型のコンピューティングサービスで、特定のイベントが発生すると関数コードを実行します。例えば、アイテムが Amazon SQS キューまたは Amazon Simple Notiﬁcation Service (Amazon SNS) トピックに追加された場合などが挙げられます。Lambda は、システム状態の変化に関する情報を含んだイベントを JSON オブジェクトとして関数に渡します。イベントによって関数が実行されるとき、これを*呼び出し*と呼びます。

再帰ループを検出するために、Lambda は [AWS X-Ray](https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html) トレースヘッダーを使用します。[再帰ループ検出をサポートしている AWS のサービス](#invocation-recursion-supportedservices) が Lambda にイベントを送信すると、それらのイベントには自動的にメタデータの注釈が付けられます。Lambda 関数がこれらのイベントの 1 つを、サポートされている別の AWS のサービス に対して[サポートされているバージョンの AWS SDK](#invocation-recursion-supportedsdks) を使用して書き込むと、このメタデータが更新されます。更新されたメタデータには、イベントによって関数が呼び出された回数が含まれます。

**注記**  
この機能を動作させるのに、X-Ray アクティブトレーシングを有効にする必要はありません。再帰ループ検出は、AWS をお使いのすべてのお客様に対してデフォルトでオンになっています。この機能は無料で使用できます。

リクエストチェーンとは、同じトリガーイベントによって発生する Lambda 呼び出しのシーケンスです。例えば、ある Amazon SQS キューが Lambda 関数を呼び出すとします。呼び出された Lambda 関数は、次に、処理されたイベントを同じ Amazon SQS キューに送り返し、そこで関数が再度呼び出されます。この例では、それぞれの関数呼び出しは同じリクエストチェーンに分類されます。

同じリクエストチェーンで関数が 16 回ほど呼び出された場合、Lambda はそのリクエストチェーン内の次の関数呼び出しを自動的に停止し、ユーザーに通知します。関数が複数のトリガーで構成されている場合、他のトリガーからの呼び出しには影響しません。

**注記**  
ソースキューの再処理ポリシーの `maxReceiveCount` 設定が 16 より大きい場合でも、Lambda 再帰保護は、再帰ループが検出され終了された後に Amazon SQS がメッセージを再試行することを防止しません。Lambda は、再帰ループを検出し、それ以降の呼び出しを中止すると、イベントソースマッピングに `RecursiveInvocationException` を返します。メッセージの `receiveCount` 値を増加します。Amazon SQS が `maxReceiveCount` の超過を判定して設定されたデッドレターキューにメッセージを送信するまで、Lambda はメッセージを再試行し続け、関数の呼び出しをブロックし続けます。

[障害発生時の宛先](invocation-async-retain-records.md#invocation-async-destinations)または[デッドレターキュー](invocation-async-retain-records.md#invocation-dlq)が関数に設定されている場合、Lambda はその停止した呼び出しからのイベントを指定された宛先またはデッドレターキューにも送信します。関数に宛先またはデッドレターキューを設定する場合は、関数でも使用されているイベントトリガーまたはイベントソースマッピングを使用しないようにしてください。関数を呼び出すのと同じリソースにイベントを送信すると、別の再帰ループが作成されることがあり、このループも終了します。再帰ループ検出をオプトアウトすると、このループは終了しません。

## サポートされている AWS のサービス および SDK
<a name="invocation-recursion-supported"></a>

Lambda が検出できるのは、サポートされている特定の AWS のサービス を含む再帰ループのみです。再帰ループを検出するには、関数はサポートされている AWS SDK のいずれかを使用する必要もあります。

### サポートされる AWS のサービス
<a name="invocation-recursion-supportedservices"></a>

Lambda は現在、関数、Amazon SQS、Amazon S3、Amazon SNS の間の再帰ループを検出します。Lambda は、Lambda 関数のみで構成されるループも検出します。これらの関数は、同期的に、または非同期的にお互いを呼び出す可能性があります。次の図に、Lambda が検出できるループの例を示します。

![\[Lambda 関数、Amazon SNS、Amazon S3、Amazon SQS キュー間の再帰ループの図。\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/RunawayWorkloadDetected_v3.png)


Amazon DynamoDB などの別の AWS のサービス がループの一部を形成してる場合、現時点では Lambda はそのループを検出して停止することはできません。

現時点では、Lambda は Amazon SQS、Amazon S3、および Amazon SNS に関連する再帰ループのみを検出するため、他の AWS のサービス が関与するループによって Lambda 関数が意図しない形で使用される可能性があります。

ユーザーの AWS アカウント に予期しない料金が請求されるのを防ぐため、[Amazon CloudWatch アラーム](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)を設定して、通常とは異なる使用パターンが警告されるようにすることをお勧めします。例えば、Lambda 関数の同時実行数や呼び出し回数の急増が検知された場合に、CloudWatch を設定しておくとユーザーに通知が送信されます。また、[請求アラーム](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html)を設定しておくことで、アカウントでの支出が指定したしきい値を超えたときにも通知を受け取ることができます。[AWS Cost Anomaly Detection](https://docs.aws.amazon.com/cost-management/latest/userguide/manage-ad.html) を使用すると、通常とは異なる請求パターンがあった場合に警告を受け取ることができます。

### サポートされている AWS SDK
<a name="invocation-recursion-supportedsdks"></a>

Lambda が再帰ループを検出するには、関数で次のバージョンまたはそれ以降の SDK を使用する必要があります。


| ランタイム | 最低限必要な AWS SDK バージョン | 
| --- | --- | 
|  Node.js  |  2.1147.0 (SDK バージョン 2) 3.105.0 (SDK バージョン 3)  | 
|  Python  |  1.24.46 (boto3) 1.27.46 (botocore)  | 
|  Java 8 および Java 11  |  2.17.135  | 
|  Java 17  |  2.20.81  | 
|  Java 21  |  2.21.24  | 
|  .NET  |  3.7.293.0  | 
|  Ruby  |  3.134.0  | 
|  PHP  |  3.232.0  | 
|  Go  |  V2 SDK 1.57.0  | 

Python や Node.js などの一部の Lambda ランタイムには、あるバージョンの AWS SDK が含まれています。関数のランタイムに含まれている SDK のバージョンが必要最低限よりも低い場合は、サポートされているバージョンの SDK を関数のデプロイパッケージに追加することができます。[Lambda レイヤー](chapter-layers.md)を使用して、サポートされている SDK バージョンを関数に追加することもできます。各 Lambda ランタイムに含まれている SDK のリストについては、[Lambda ランタイム](lambda-runtimes.md) を参照してください。

## 再帰ループ通知
<a name="invocation-recursion-monitoring"></a>

Lambda が再帰ループを停止すると、[Health Dashboard](https://aws.amazon.com/premiumsupport/technology/aws-health-dashboard/) やメールで通知が届きます。CloudWatch メトリクスを使用して、Lambda が停止した再帰呼び出しの数をモニタリングすることもできます。

### Health Dashboard の通知
<a name="invocation-recursion-phd"></a>

Lambda が再帰呼び出しを停止すると、Health Dashboard は、**[アカウントヘルス] **ページの [[未解決の問題と最近の問題]](https://health.aws.amazon.com/health/home#/account/dashboard/open-issues) に通知を表示します。Lambda が再帰呼び出しを停止してからこの通知が表示されるまでに、最大 3.5 時間かかる場合があることに注意してください。Health Dashboard でのアカウントイベントの表示に関する詳細については、「*AWS Health ユーザーガイド*」の「[Getting started with your AWS Health Dashboard – Your account health](https://docs.aws.amazon.com/health/latest/ug/getting-started-health-dashboard.html)」を参照してください。

### E メールアラート
<a name="invocation-recursion-email"></a>

Lambda が関数の再帰呼び出しを初めて停止すると、E メールアラートが送信されます。Lambda は、AWS アカウント の各関数につき 24 時間ごとに最大 1 通のメールを送信します。Lambda から E メール通知が送信された後の 24 時間は、Lambda によって関数の再帰呼び出しが再度停止された場合でも、その関数に関するメールが届きません。Lambda が再帰呼び出しを停止してからこの E メールアラートを受信するまでに、最大 3.5 時間かかる場合があることに注意してください。

再帰的なループに関する E メールアラートは、Lambda からお客様の AWS アカウント のプライマリアカウント連絡先と代替オペレーション連絡先に送信されます。アカウントのメールアドレスの表示または更新については、AWS 全般のリファレンスの「[連絡先情報の更新](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact.html)」を参照してください。

### Amazon CloudWatch メトリクス
<a name="invocation-recursion-cloudwatch"></a>

[CloudWatch メトリクス](monitoring-metrics-types.md)の `RecursiveInvocationsDropped` には、1 回のリクエストチェーンで関数が約 16 回を超えて呼び出されたために Lambda が停止した関数の呼び出し回数が記録されます。Lambda は再帰呼び出しを停止するとすぐにこのメトリクスを出力します。このメトリクスを表示するには、「[CloudWatch コンソールでメトリクスを表示する](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics.html#monitoring-metrics-console)」に記載の指示に従い、メトリクス `RecursiveInvocationsDropped` を選択します。

## 再帰ループ検出通知への対応
<a name="invocation-recursion-responding"></a>

同じトリガーイベントによって関数が約 16 回を超えて呼び出された場合、Lambda はそのイベントの次の関数呼び出しを停止して再帰ループを中断します。Lambda が中断した再帰ループの再発を防ぐには、以下を実行してください。
+ [関数が同時に実行できる回数](lambda-concurrency.md)を 0 に減らすと、以降の呼び出しがすべてスロットリングされます。
+ 関数を呼び出すトリガーやイベントソースマッピングを削除または無効にします。
+ 関数を呼び出している AWS リソースにイベントを書き戻すコードを特定し、欠陥を修正します。よくある不具合の原因として、変数を使用して関数のイベントソースとターゲットを定義している場合が挙げられます。両方の変数に同じ値が使用されていないことを確認してください。

さらに、Lambda 関数のイベントソースが Amazon SQS キューの場合は、ソースキューに[デッドレターキューを設定する](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue.html)ことを検討してください。

**注記**  
Lambda 関数ではなく、ソースキューのデッドレターキューを設定するようにしてください。関数で設定したデッドレターキューは、イベントソースキューではなく、関数の[非同期呼び出しキュー](invocation-async.md)に使用されます。

イベントソースが Amazon SNS トピックの場合は、関数に[障害発生時の宛先](invocation-async-retain-records.md#invocation-async-destinations)を追加することを検討してください。

**関数で利用できる同時実行数をゼロにするには (コンソール)**

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

1. 関数の名前を選択します。

1. [**スロットル**] を選択します。

1. [**関数のスロットル**] ダイアログボックスで、[**確認**] を選択します。

**関数のトリガーまたはイベントソースマッピングを削除するには (コンソール)**

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

1. 関数の名前を選択します。

1. **[Configuration]** タブを選択し、**[Triggers]** を選択します。

1. **[Triggers]** で、削除するトリガーまたはイベントソースマッピングを選択し、**[Delete]** を選択します。

1. [**トリガーの削除**] ダイアログボックスで、[**削除**] を選択します。

**関数のイベントソースマッピングを無効にするには (AWS CLI)**

1. 無効にするイベントソースマッピングの UUID を見つけるには、AWS Command Line Interface (AWS CLI) の [list-event-source-mappings](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/list-event-source-mappings.html) コマンドを実行します。

   ```
   aws lambda list-event-source-mappings
   ```

1. イベントソースマッピングを無効にするには、次の AWS CLI [update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html) コマンドを実行します。

   ```
   aws lambda update-event-source-mapping --function-name MyFunction \
   --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 --no-enabled
   ```

## Lambda 関数が再帰ループで動作するようにする
<a name="invocation-recursion-disable"></a>

再帰ループを意図的に使用する仕様になっている場合は、再帰的に呼び出せるように Lambda 関数を設定できます。再帰ループを使用する仕様にはしないことをお勧めします。実装エラーが発生すると、自分の AWS アカウントで利用可能なすべての同時実行を使用して再帰呼び出しが行われ、想定外の料金がアカウントに請求される可能性があります。

**重要**  
再帰ループを使用する場合は、その扱いに十分に注意してください。実装エラーのリスクを最小限に抑えるベストプラクティスガードレールを実装します。再帰パターンを使用する際のベストプラクティスの詳細については、Serverless Land の「[Lambda 関数が暴走する原因となる再帰パターン](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway)」を参照してください。

Lambda コンソール、AWS Command Line Interface (AWS CLI)、および [PutFunctionRecursionConfig](https://docs.aws.amazon.com//lambda/latest/api/API_PutFunctionRecursionConfig.html) API を使用して再帰ループを許可できるように関数を設定できます。また、AWS SAM と CloudFormation で関数の再帰ループを検出するように設定することもできます。

デフォルトでは、Lambda は再帰ループを検出すると強制的に終了します。再帰ループを意図的に使用する仕様になっている場合を除き、関数のデフォルト設定を変更しないことをお勧めします。

再帰ループを許可するように関数を設定すると、[CloudWatch メトリクス](monitoring-metrics-types.md#invocation-metrics) `RecursiveInvocationsDropped` が出力されないことに注意してください。

------
#### [ Console ]

**関数が再帰ループで動作するようにするには (コンソール)**

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

1. 関数の名前を選択して、関数詳細ページを開きます。

1. **[設定]** タブを選択し、**[同時実行と再帰の検出]** を選択します。

1. **[再帰ループ検出]** の横にある **[編集]** を選択します。

1. **[再帰ループを許可]** を選択します。

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

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

[PutFunctionRecursionConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionRecursionConfig.html) API を使用して、再帰ループで関数を呼び出せるようになります。再帰ループパラメータに対して [`Allow`] を指定します。例えば、`put-function-recursion-config` AWS CLI コマンドでこの API を呼び出すことができます。

```
aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Allow
```

------

Lambda が再帰ループを検出したら強制終了するように、関数の設定をデフォルト設定に戻すことができます。関数の設定を編集するには、Lambda コンソールまたは AWS CLI を使用します。

------
#### [ Console ]

**再帰ループが強制終了されるように関数を設定するには (コンソール)**

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

1. 関数の名前を選択して、関数詳細ページを開きます。

1. **[設定]** タブを選択し、**[同時実行と再帰の検出]** を選択します。

1. **[再帰ループ検出]** の横にある **[編集]** を選択します。

1. **[再帰ループを強制終了]** を選択します。

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

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

[PutFunctionRecursionConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionRecursionConfig.html) API を使用すると、Lambda が再帰ループを検出したら強制終了するように関数を設定できます。再帰ループパラメータに対して [`Terminate`] を指定します。例えば、`put-function-recursion-config` AWS CLI コマンドでこの API を呼び出すことができます。

```
aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Terminate
```

------

## Lambda 再帰ループ検出に対応しているリージョン
<a name="invocation-recursion-regions"></a>

Lambda 再帰ループ検出は、メキシコ (中部) とアジアパシフィック (ニュージーランド) を除くすべての[商用リージョン](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#region)でサポートされています。

# Lambda 関数 URL の作成と管理
<a name="urls-configuration"></a>

関数 URL は、Lambda 関数のための専用 HTTP エンドポイントです。関数 URL の作成と設定には、Lambda コンソールまたは Lambda API を使用します。

**ヒント**  
Lambda には、HTTP エンドポイントを介して関数を呼び出す 2 つの方法として、関数 URL および Amazon API Gateway が用意されています。ユースケースに最適な方法がわからない場合、「[HTTP リクエストを使用して Lambda 関数を呼び出す方法を選択する](furls-http-invoke-decision.md)」を参照してください。

関数 URL を作成すると、一意の URL エンドポイントが Lambda により自動的に生成されます。関数 URL を作成した後に、その URL エンドポイントが変更されることはありません。関数 URL のエンドポイントでは、次の形式を使用します。

```
https://<url-id>.lambda-url.<region>.on.aws
```

**注記**  
関数 URL がサポートされていない AWS リージョン は、アジアパシフィック (ハイデラバード) (`ap-south-2`)、アジアパシフィック (メルボルン) (`ap-southeast-4`)、アジアパシフィック (マレーシア) (`ap-southeast-5`)、アジアパシフィック (ニュージーランド) (`ap-southeast-6`)、アジアパシフィック (タイ) (`ap-southeast-7`)、アジアパシフィック (台北) (`ap-east-2`)、カナダ西部 (カルガリー) (`ca-west-1`)、欧州 (スペイン) (`eu-south-2`)、欧州 (チューリッヒ) (`eu-central-2`)、イスラエル (テルアビブ) (`il-central-1`)、および中東 (UAE) (`me-central-1`) です。

関数 URL はデュアルスタックに対応しており、IPv4 と IPv6 をサポートしています。関数のために URL を設定した後は、ウェブブラウザ、curl、Postman、または任意の HTTP クライアントから HTTP エンドポイントを介して、その関数を呼び出せるようになります。

**注記**  
関数 URL には、パブリックインターネット経由でしかアクセスできません。Lambda 関数は AWS PrivateLink をサポートしていますが、関数 URL ではサポートされません。

Lambda 関数 URL では、セキュリティとアクセスコントロールのために、[リソースベースのポリシー](access-control-resource-based.md)を使用します。また、Cross-Origin Resource Sharing (CORS) 設定オプションを、関数 URL に設定することも可能です。

関数 URL は、任意の関数エイリアス、もしくは `$LATEST` の未公開な関数バージョンに対して適用できます。関数 URL は、他の関数バージョンに追加することはできません。

次のセクションでは、Lambda コンソール、AWS CLI、および CloudFormation テンプレートを使用して関数 URL を作成し、管理する方法を説明します。

**Topics**
+ [

## 関数 URL の作成 (コンソール)
](#create-url-console)
+ [

## 関数 URL の作成 (AWS CLI)
](#create-url-cli)
+ [

## CloudFormation テンプレートへの関数 URL の追加
](#urls-cfn)
+ [

## クロスオリジンリソース共有 (CORS)
](#urls-cors)
+ [

## 関数 URL のスロットリング
](#urls-throttling)
+ [

## 関数 URL の非アクティブ化
](#urls-deactivating)
+ [

## 関数 URL の削除
](#w2aac39c81c53)
+ [

# Lambda 関数 URL へのアクセスの制御
](urls-auth.md)
+ [

# Lambda 関数 URL の呼び出し
](urls-invocation.md)
+ [

# Lambda 関数 URL のモニタリング
](urls-monitoring.md)
+ [

# HTTP リクエストを使用して Lambda 関数を呼び出す方法を選択する
](furls-http-invoke-decision.md)
+ [

# チュートリアル: Lambda 関数 URL を使用したウェブフックエンドポイントの作成
](urls-webhook-tutorial.md)

## 関数 URL の作成 (コンソール)
<a name="create-url-console"></a>

コンソールを使用して関数 URL を作成するには、以下の手順に従います。

### 既存の関数のために関数 URL を作成するには
<a name="create-url-existing-function"></a>

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

1. 関数 URL を作成する関数の名前を選択します。

1. **[Configuration]** (設定) タブを開き、次に **[Function URL]** (関数 URL) をクリックします。

1. **[Create function URL]** (関数 URL を作成) をクリックします。

1. **[Auth Type]** (認証タイプ) で、**[AWS\$1IAM]** または **[NONE]** (無し) を選択します。関数 URL での認証の詳細については、「[アクセスコントロール](urls-auth.md)」を参照してください。

1. (オプション) **[Cross-Origin Resource Sharing (CORS)]** をクリックした後に、関数 URL の CORS 設定を作成します。CORS の詳細については、[クロスオリジンリソース共有 (CORS)](#urls-cors) を参照してください。

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

これにより、未公開関数の `$LATEST` バージョン用として関数 URL が作成されます。関数 URL は、コンソールの [**Function overview**] (関数の概要) セクションに表示されます。

### 既存のエイリアスのために関数 URL を作成するには
<a name="create-url-existing-alias"></a>

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

1. 関数 URL を作成するエイリアスを持つ関数の名前を選択します。

1. **[Aliases]** (エイリアス) タブを開き、関数 URL を作成するエイリアスの名前を選択します。

1. **[Configuration]** (設定) タブを開き、次に **[Function URL]** (関数 URL) をクリックします。

1. **[Create function URL]** (関数 URL を作成) をクリックします。

1. **[Auth Type]** (認証タイプ) で、**[AWS\$1IAM]** または **[NONE]** (無し) を選択します。関数 URL での認証の詳細については、「[アクセスコントロール](urls-auth.md)」を参照してください。

1. (オプション) **[Cross-Origin Resource Sharing (CORS)]** をクリックした後に、関数 URL の CORS 設定を作成します。CORS の詳細については、[クロスオリジンリソース共有 (CORS)](#urls-cors) を参照してください。

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

これにより、関数エイリアス用に関数 URL が作成されます。関数 URL は、コンソール上で、エイリアスの **[Function overview]** (関数の概要) セクションに表示されます。

### 関数 URL を使用して新しい関数を作成するには
<a name="create-url-new-function"></a>

**関数 URL を使用して新しい関数を作成するには (コンソール)**

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

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

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

   1. **[Function name]** (関数名) に関数の名前を入力します (例: **my-function**)。

   1. **[ランタイム]** で、希望する言語のランタイム (**Node.js 24** など) を選択します。

   1. **[Architecture]** (アーキテクチャ) では、「**x86\$164**」または「**arm64**」のいずれかを選択します。

   1. **[Permissions]** (アクセス許可) を展開し、新しい実行ロールを作成するか、既存のロールを使用するかを選択します。

1. **[Advanced settings]** (詳細設定) を展開し、**[Function URL]** (関数 URL) を選択します。

1. **[Auth Type]** (認証タイプ) で、**[AWS\$1IAM]** または **[NONE]** (無し) を選択します。関数 URL での認証の詳細については、「[アクセスコントロール](urls-auth.md)」を参照してください。

1. (オプション) **[Configure cross-origin resource sharing (CORS)]** (Cross-Origin Resource Sharing (CORS) の設定) をクリックします。関数の作成時にこのオプションを選択すると、関数 URL はデフォルトで、すべてのオリジンからのリクエストを許可します。関数 URL の CORS 設定は、関数の作成が完了した後に編集できます。CORS の詳細については、[クロスオリジンリソース共有 (CORS)](#urls-cors) を参照してください。

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

これにより、未公開の関数バージョン `$LATEST` で、関数 URL を持つ新しい関数が作成されます。関数 URL は、コンソールの [**Function overview**] (関数の概要) セクションに表示されます。

## 関数 URL の作成 (AWS CLI)
<a name="create-url-cli"></a>

AWS Command Line Interface (AWS CLI) を使用して、既存の Lambda 関数の関数 URL を作成するには、次のコマンドを実行します。

```
aws lambda create-function-url-config \
    --function-name my-function \
    --qualifier prod \ // optional
    --auth-type AWS_IAM
    --cors-config {AllowOrigins="https://example.com"} // optional
```

これにより、**my-function** 関数の **prod** 修飾子に関数 URL が追加されます。これらの構成パラメータの詳細については、API リファレンスの「[CreateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html)」を参照してください。

**注記**  
AWS CLI を介して関数 URL を作成するには、対象の関数が既に存在している必要があります。

## CloudFormation テンプレートへの関数 URL の追加
<a name="urls-cfn"></a>

`AWS::Lambda::Url` リソースを CloudFormation テンプレートに追加するには、次の構文を使用します。

### JSON
<a name="urls-cfn-json"></a>

```
{
  "Type" : "AWS::Lambda::Url",
  "Properties" : {
      "AuthType" : String,
      "Cors" : Cors,
      "Qualifier" : String,
      "TargetFunctionArn" : String
    }
}
```

### YAML
<a name="urls-cfn-yaml"></a>

```
Type: AWS::Lambda::Url
Properties: 
  AuthType: String
  Cors: 
    Cors
  Qualifier: String
  TargetFunctionArn: String
```

### パラメータ
<a name="urls-cfn-params"></a>
+ (必須) `AuthType` – 関数 URL で使用する認証のタイプを定義します。これに使用できる値は、`AWS_IAM` または `NONE` です。アクセスを認証されたユーザーのみに制限するには、`AWS_IAM` に設定します。IAM 認証をバイパスし、任意のユーザーが関数にリクエストを送信できるようにするには、`NONE` をセットします。
+ (オプション) `Cors` – 関数 URL のための [CORS 設定](#urls-cors)を定義します。CloudFormation 内の `AWS::Lambda::Url` リソースに `Cors` を追加するには、次の構文を使用します。

    
**Example AWS::Lambda::Url.Cors (JSON)**  

  ```
  {
    "AllowCredentials" : Boolean,
    "AllowHeaders" : [ String, ... ],
    "AllowMethods" : [ String, ... ],
    "AllowOrigins" : [ String, ... ],
    "ExposeHeaders" : [ String, ... ],
    "MaxAge" : Integer
  }
  ```  
**Example AWS::Lambda::Url.Cors (YAML)**  

  ```
    AllowCredentials: Boolean
    AllowHeaders: 
      - String
    AllowMethods: 
      - String
    AllowOrigins: 
      - String
    ExposeHeaders: 
      - String
    MaxAge: Integer
  ```
+ (オプション) `Qualifier` – エイリアス名。
+ (必須) `TargetFunctionArn` – Lambda 関数の名前、または Amazon リソースネーム (ARN)。名前として使用できる値には次のようなものがあります。
  + **関数名** – `my-function`
  + **関数 ARN** – `arn:aws:lambda:us-west-2:123456789012:function:my-function`
  + **部分的な ARN** – `123456789012:function:my-function`

## クロスオリジンリソース共有 (CORS)
<a name="urls-cors"></a>

さまざまなオリジンによる、関数 URL へのアクセス方法を定義するには、[Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) を使用します。異なるドメインから関数 URL を呼び出す場合は、CORS を設定することをお勧めします。Lambda では、関数 URL 用として、以下の CORS ヘッダーをサポートしています。


| CORS ヘッダー | CORS 設定プロパティ | 値の例 | 
| --- | --- | --- | 
|  [ Access-Control-Allow-Origin](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin)  |  `AllowOrigins`  |  `*` (すべてのオリジンを許可する) `https://www.example.com` `http://localhost:60905`  | 
|  [ Access-Control-Allow-Methods](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods)  |  `AllowMethods`  |  `GET`, `POST`, `DELETE`, `*`  | 
|  [ Access-Control-Allow-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)  |  `AllowHeaders`  |  `Date`, `Keep-Alive`, `X-Custom-Header`  | 
|  [ Access-Control-Expose-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers)  |  `ExposeHeaders`  |  `Date`, `Keep-Alive`, `X-Custom-Header`  | 
|  [ Access-Control-Allow-Credentials](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials)  |  `AllowCredentials`  |  `TRUE`  | 
|  [ Access-Control-Max-Age](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age)  |  `MaxAge`  |  `5` (デフォルト)`300`  | 

Lambda コンソールまたは AWS CLI を使用して、関数 URL のために CORS を設定すると、Lambda は関数 URL を介して、すべてのレスポンスに CORS ヘッダーを自動的に追加するようになります。あるいは、手動で CORS ヘッダーを関数レスポンスに追加することも可能です。ヘッダーが競合している場合、期待される動作はリクエストのタイプによって異なります。
+ OPTIONS リクエストなどのプリフライトリクエストでは、関数 URL に設定されている CORS ヘッダーが優先されます。Lambda は、レスポンスでこれらの CORS ヘッダーのみを返します。
+ GET または POST リクエストなどの非プリフライトリクエストでは、Lambda は関数 URL に設定されている CORS ヘッダーと、関数によって返される CORS ヘッダーの両方を返します。これにより、レスポンスで CORS ヘッダーが重複する可能性があります。「`The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed`」のようなエラーが表示されることがあります。

一般に、関数のレスポンスで CORS ヘッダーを手動で送信するのではなく、関数 URL ですべての CORS 設定を構成することをお勧めします。

## 関数 URL のスロットリング
<a name="urls-throttling"></a>

スロットリングは、関数がリクエストを処理するレートを制限します。これは、関数からダウンストリームリソースに過剰な負荷がかからないようにしたり、リクエストの急増に対応するなど、多くの状況で役立ちます。

予約済み同時実行数を設定することで、関数 URL を介して Lambda 関数が処理するリクエストのレートをスロットリングできます。予約済み同時実行数は、関数を同時に呼び出せる最大数を制限します。関数に対する 1 秒あたりの最大リクエストレート (RPS) は、設定された予約済み同時実行数の 10 倍に相当します。例えば、関数の予約済み同時実行数を 100 に設定すると、最大 RPS は 1,000 になります。

関数の同時実行数が、予約済み同時実行数を超えるたびに、関数 URL は HTTP ステータスコードの `429` を返します。設定された予約済み同時実行数を基に、それを 10 倍した最大の RPS 値を超えるリクエストを関数が受信した場合は、ユーザーに対しても HTTP の `429` エラーが表示されます。予約済み同時実行数の詳細については、「[関数に対する予約済み同時実行数の設定](configuration-concurrency.md)」を参照してください。

## 関数 URL の非アクティブ化
<a name="urls-deactivating"></a>

緊急時には、関数 URL へのすべてのトラフィックを拒否する必要が生じることがあります。関数 URL を非アクティブ化するには、予約済み同時実行数を 0 に設定します。これにより、関数 URL へのすべてのリクエストがスロットリングされ、HTTP ステータスレスポンスには `429` が返されます。関数 URL を再アクティブ化するには、予約済み同時実行数を 1 以上の値に設定するか、この設定全体を削除します。

## 関数 URL の削除
<a name="w2aac39c81c53"></a>

関数の URL を削除すると、元に戻すことはできません。新しい関数 URL を作成すると、異なる URL アドレスになります。

**注記**  
認証タイプ `NONE` で関数 URL を削除した場合、Lambda では、関連するリソースベースのポリシーが自動的に削除されません。このポリシーを削除する場合は、手動で削除する必要があります。

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

1. 関数の名前を選択します。

1. **[設定]** タブを開き、次に **[関数 URL]** をクリックします。

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

1. フィールドに「delete」と入力して、削除を確認します。**

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

**注記**  
関数 URL を持つ関数を削除すると、Lambda により関数 URL が非同期的に削除されます。同じアカウントで同じ名前の新しい関数をすぐに作成した場合、元の関数 URL は削除されず、新しい関数にマッピングされる可能性があります。

# Lambda 関数 URL へのアクセスの制御
<a name="urls-auth"></a>

**注記**  
2025 年 10 月以降、新しい関数 URL には `lambda:InvokeFunctionUrl` と `lambda:InvokeFunction` の両方のアクセス許可が必要です。

特定の関数にアタッチされた[リソースベースのポリシー](access-control-resource-based.md)に、[AuthType](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html#lambda-CreateFunctionUrlConfig-request-AuthType) パラメータを組み合わせて使用することで、Lambda 関数 URL へのアクセスを制御できます。これら 2 つのコンポーネントの設定によって、関数 URL のために他の管理アクションを呼び出したり実行できるユーザーを指定します。

`AuthType` パラメーターは、関数 URL へのリクエストを Lambda が認証または承認する方法を決定します。関数 URL を設定する場合は、以下の `AuthType` オプションのいずれかを指定する必要があります。
+ `AWS_IAM`– Lambda では、AWS Identity and Access Management (IAM) を使用して、IAM プリンシパルの ID ポリシーと関数のリソースベースのポリシーに基づいて、リクエストを認証および認可します。関数 URL を使用する関数呼び出しを、認証済みユーザーとロールのみに制限する場合は、このオプションを選択します。
+ `NONE` – Lambda では、関数を呼び出す前の認証を実行しません。ただし、関数のリソースベースのポリシーは常に有効であり、関数 URL がリクエストを受信できるようにするには、パブリックアクセスを許可する必要があります。関数 URL への、未認証でパブリックなアクセスを許可するには、このオプションを選択します。

セキュリティに関するさらなるインサイトを得るには、AWS Identity and Access Management Access Analyzer 使用して、関数 URL への外部アクセスの包括的な分析を取得します。IAM Access Analyzer は、Lambda 関数における新規または更新済みのアクセス許可を監視し、パブリックおよびクロスアカウントのアクセスのために付与する許可を特定するのに役立ちます。IAM Access Analyzer は無料で使用できます。IAM Access Analyzer の使用開始方法については、「[AWS IAM Access Analyzer を使用する](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)」を参照してください。

このページでは、両方の認証タイプによるリソースベースのポリシーの例と、これらのポリシーの作成に、[AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html) API オペレーションまたは Lambda コンソールを使用する方法について説明します。アクセス許可の設定後に関数 URL を呼び出す方法については、「[Lambda 関数 URL の呼び出し](urls-invocation.md)」を参照してください。

**Topics**
+ [

## `AWS_IAM` 認証タイプの使用
](#urls-auth-iam)
+ [

## `NONE` 認証タイプの使用
](#urls-auth-none)
+ [

## ガバナンスとアクセスコントロール
](#urls-governance)

## `AWS_IAM` 認証タイプの使用
<a name="urls-auth-iam"></a>

`AWS_IAM` 認証タイプが選択されている場合は、Lambda 関数 URL を呼び出す必要のあるユーザーには、`lambda:InvokeFunctionUrl` と `lambda:InvokeFunction` のアクセス許可が付与されている必要があります。呼び出しリクエストを実行するユーザーによっては、このアクセス許可を付与するために、[リソースベースのポリシー](access-control-resource-based.md)を使用することが必要になる場合があります。

リクエストを実行するプリンシパルが関数 URL と同じ AWS アカウント 内にある場合、このプリンシパルには、[アイデンティティベース](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)のポリシー内に `lambda:InvokeFunctionUrl` および `lambda:InvokeFunction` のアクセス許可があるか、**または**、関数のリソースベースのポリシー内でアクセス許可が付与されているか、その**どちらか**が必要です。つまり、既にユーザーがアイデンティティベースのポリシー内に `lambda:InvokeFunctionUrl` および `lambda:InvokeFunction` のアクセス許可を持っている場合は、リソースベースのポリシーはオプションです。ポリシー評価は、[ポリシー評価ロジック](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)で説明されているルールに沿って行われます。

リクエストを行うプリンシパルが別のアカウントにある場合、そのプリンシパルには、`lambda:InvokeFunctionUrl` と `lambda:InvokeFunction` のアクセス許可を付与する ID ベースのポリシーがあること、**および**、呼び出そうとしている関数のためのリソースベースのポリシー内でアクセス許可が付与されていること、その**両方**が必要となります。ポリシー評価は、「[クロスアカウントリクエストが許可されているかどうかを確認](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html#policy-eval-cross-account)」で説明されているルールに従います。

次に示す、リソースベースのポリシー例では、AWS アカウント `444455556666` 内で、`example` ロールに対し関数 `my-function` に関連付けられた関数 URL を呼び出すことを許可しています。[lambda:InvokedViaFunctionUrl](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-InvokedViaFunctionUrl) コンテキストキーは、 `lambda:InvokeFunction` アクションを関数 URL 呼び出しに制限します。つまり、プリンシパルは関数 URL を使用して関数を呼び出す必要があります。`lambda:InvokedViaFunctionUrl` を含めない場合、プリンシパルは関数 URL に加えて、他の呼び出し方法を通じて関数を呼び出すことができます。

**Example — クロスアカウントリソースベースのポリシー**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/example"
      },
      "Action": "lambda:InvokeFunctionUrl",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionUrlAuthType": "AWS_IAM"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/example"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
      "Condition": {
        "Bool": {
          "lambda:InvokedViaFunctionUrl": "true"
        }
      }
    }
  ]
}
```

このリソースベースのポリシーは、以下の手順に従いコンソールから作成できます。

**別のアカウントに URL の呼び出し許可を付与するには (コンソール)**

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

1. URL での呼び出し許可を付与する関数の名前を選択します。

1. **[Configuration]** (設定) タブを開き、次に **[Permissions]** (アクセス許可) をクリックします。

1. **[Resource-based policy]** (リソースベースのポリシー) で、**[Add permissions]** (アクセス許可を追加) をクリックします。

1. **[Function URL]** (関数 URL) をクリックします。

1. **[Auth Type]** (認証タイプ) で **[AWS\$1IAM]** を選択します。

1. ポリシーステートメントの**ステートメント ID** を入力します。

1. **[プリンシパル]** には、アカウント ID または許可の付与先となるユーザーまたはロールの Amazon リソースネーム (ARN) を入力します。例: **444455556666**。

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

または、次の [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) AWS Command Line Interface (AWS CLI) コマンド 使用して、このポリシーを作成することもできます。AWS CLI を使用する場合は、`lambda:InvokeFunctionUrl` と `lambda:InvokeFunction` のステートメントを個別に追加する必要があります。例えば、次のようになります。

```
aws lambda add-permission --function-name my-function \
  --statement-id UrlPolicyInvokeURL \
  --action lambda:InvokeFunctionUrl \
  --principal 444455556666 \
  --function-url-auth-type AWS_IAM
```

```
aws lambda add-permission --function-name my-function \
  --statement-id UrlPolicyInvokeFunction \
  --action lambda:InvokeFunction \
  --principal 444455556666 \
  --invoked-via-function-url
```

## `NONE` 認証タイプの使用
<a name="urls-auth-none"></a>

**重要**  
関数 URL の認証タイプが `NONE` で、[リソースベースのポリシー](access-control-resource-based.md)でパブリックアクセスを許可している場合には、認証されていないすべてのユーザーが、関数 URL を使用して関数を呼び出すことができます。

一部のケースでは、関数 URL の公開が必要な場合もあります。例えば、ウェブブラウザから直接行われたリクエストを処理する場合などです。関数 URL へのパブリックアクセスを許可するには、認証タイプに `NONE` を選択します

`NONE` の認証タイプを選択すると、Lambda は関数 URL へのリクエストに対して IAM による認証を行いません。ただし、関数には、`lambda:InvokeFunctionUrl` と `lambda:InvokeFunction` を許可するリソースベースのポリシーが必要です。コンソールまたは AWS Serverless Application Model (AWS SAM) を使用し、認証タイプ `NONE` の関数 URL を作成すると、Lambda はリソースベースのポリシーを自動的に作成します。AWS CLI、AWS CloudFormation、または Lambda API を直接使用している場合には、[ポリシーを手作業で追加する](#policy-cli)必要があります。

`NONE` 認証タイプを使用する場合は、リソースベースのポリシーに [lambda:InvokedViaFunctionUrl](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-InvokedViaFunctionUrl) コンテキストキーを含めることをお勧めします。このコンテキストキーは、関数 URL を介してのみ、関数を呼び出すことができるようにします。他の呼び出し方法を介して呼び出すことはできません。

このポリシーに関する以下の情報に注意してください。
+ すべてのエンティティは `lambda:InvokeFunctionUrl` と `lambda:InvokeFunction` を呼び出すことができます。つまり、関数 URL を持つすべてのユーザーが関数を呼び出すことができます。
+ `lambda:FunctionUrlAuthType` 条件キーの値は `NONE` です。これは、このポリシーステートメントが、関数 URL の認証タイプも `NONE` である場合にのみアクセスを許可することを意味します。
+ `lambda:InvokedViaFunctionUrl` 条件は、関数 URL を介してのみ、関数を呼び出すことができるようにします。他の呼び出し方法を介して呼び出すことはできません。

**Example — NONE 認証タイプのデフォルトのリソースベースのポリシー**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "FunctionURLAllowPublicAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "lambda:InvokeFunctionUrl",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionUrlAuthType": "NONE"
        }
      }
    },
    {
      "Sid": "FunctionURLInvokeAllowPublicAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "Bool": {
          "lambda:InvokedViaFunctionUrl": "true"
        }
      }
    }
  ]
}
```

**AWS CLI を使用してリソースベースのポリシーを作成する**  
コンソールまたは AWS SAM を使用して認証タイプ `NONE` の関数 URL を作成しない限り、リソースベースのポリシーを自分で追加する必要があります。`lambda:InvokeFunctionUrl` と `lambda:InvokeFunction` のアクセス許可にステートメントを作成するための次のコマンドを使用します。各ステートメントは、個別のコマンドで追加する必要があります。

```
aws lambda add-permission \
  --function-name UrlTestFunction \
  --statement-id UrlPolicyInvokeURL \
  --action lambda:InvokeFunctionUrl \
  --principal * \
  --function-url-auth-type NONE
```

```
aws lambda add-permission \
  --function-name UrlTestFunction \
  --statement-id UrlPolicyInvokeFunction \
  --action lambda:InvokeFunction \
  --principal * \
  --invoked-via-function-url
```

**注記**  
認証タイプ `NONE` で関数 URL を削除した場合、Lambda では、関連するリソースベースのポリシーが自動的に削除されません。このポリシーを削除する場合は、手動で削除する必要があります。

関数のリソースベースのポリシーが `lambda:invokeFunctionUrl` と `lambda:InvokeFunction` のアクセス許可を付与していない場合、ユーザーが関数 URL の呼び出しを試みたときに、「403 Forbidden」エラーコードが表示されます。これは、関数 URL が `NONE` 認証タイプを使用している場合でも発生します。

## ガバナンスとアクセスコントロール
<a name="urls-governance"></a>

関数 URL の呼び出しに関するアクセス許可に加えて、関数 URL の設定に使用するアクションによってもアクセス制御が可能です。Lambda では、関数 URL に対して次の IAM ポリシーアクションがサポートされます。
+ `lambda:InvokeFunctionUrl` – 関数 URL を使用して Lambda 関数を呼び出します。
+ `lambda:CreateFunctionUrlConfig` – 関数 URL を作成し、その `AuthType` を設定します。
+ `lambda:UpdateFunctionUrlConfig` – 関数 URL 設定とその `AuthType` を更新します。
+ `lambda:GetFunctionUrlConfig` – 関数 URL の詳細を表示します。
+ `lambda:ListFunctionUrlConfigs` – 関数 URL 設定内容を一覧表示します。
+ `lambda:DeleteFunctionUrlConfig` – 関数 URL を削除します。

他の AWS エンティティに対し、関数 URL によるアクセスを許可または拒否するには、IAM ポリシーにこれらのアクションを含めます。例えば、次のポリシーでは、AWS アカウント `444455556666` 内にある `example` ロールに対し、アカウント `123456789012` にある関数 **my-function** の関数 URL を更新するためのアクセス許可を付与しています

**Example クロスアカウント関数 URL のポリシー**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::444455556666:role/example"
            },
            "Action": "lambda:UpdateFunctionUrlConfig",
            "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function"
        }
    ]
}
```

### 条件キー
<a name="urls-condition-keys"></a>

関数 URL に対しきめ細かなアクセス制御を行うには、条件コンテキストキーを使用します。Lambda では、関数 URL 用として、以下のコンテキストをサポートしています。
+ `lambda:FunctionUrlAuthType` - 関数 URL が使用する認証タイプを記述するための列挙値を定義します。この値は `AWS_IAM` または `NONE` となります。
+ `lambda:InvokedViaFunctionUrl` – 関数 URL を介して行われた呼び出しに `lambda:InvokeFunction` アクションを制限します。これにより、関数 URL を介してのみ、関数を呼び出すことができるようにします。他の呼び出し方法を介して呼び出すことはできません。`lambda:InvokedViaFunctionUrl` コンテキストキーを使用するリソースベースのポリシーの例については、「[`AWS_IAM` 認証タイプの使用](#urls-auth-iam)」および「[`NONE` 認証タイプの使用](#urls-auth-none)」の例を参照してください。

これらのコンテキストキーは、関数に関連付けられたポリシーの中で使用できます。例えば、関数 URL の構成を変更できるユーザーを制限したい場合があります。URL 認証タイプに `NONE` を使用する任意の関数に対して、すべての `UpdateFunctionUrlConfig` リクエストを拒否するには、次のポリシーを定義します。

**Example 明示的な拒否を行う関数 URL ポリシー**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action":[
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "NONE"
                }
            }
        }
    ]
}
```

AWS アカウント `444455556666` の `example` ロールに、URL 認証タイプ `AWS_IAM` を使用する関数に対して `CreateFunctionUrlConfig` および `UpdateFunctionUrlConfig` リクエストを許可するには、次のポリシーを定義できます。

**Example 明示的な許可を行う関数 URL ポリシー**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::444455556666:role/example"
            },
            "Action":[
                "lambda:CreateFunctionUrlConfig",
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "AWS_IAM"
                }
            }
        }
    ]
}
```

また、この条件キーを[サービスコントロールポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) (SCP) で使用することもできます。SCP は、AWS Organizations にある組織全体でアクセス許可を管理する際に使用します。例えば、認証タイプに `AWS_IAM` を使用していない関数 URL を作成または更新することを、ユーザーに対し拒否するには、次のサービスコントロールポリシーを使用します。

**Example 明示的な拒否を行う関数 URL SCP**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action":[
                "lambda:CreateFunctionUrlConfig",
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:*",
            "Condition": {
                "StringNotEquals": {
                    "lambda:FunctionUrlAuthType": "AWS_IAM"
                }
            }
        }
    ]
}
```

# Lambda 関数 URL の呼び出し
<a name="urls-invocation"></a>

関数 URL は、Lambda 関数のための専用 HTTP エンドポイントです。関数 URL の作成と設定には、Lambda コンソールまたは Lambda API を使用します。

**ヒント**  
Lambda には、HTTP エンドポイントを介して関数を呼び出す 2 つの方法として、関数 URL および Amazon API Gateway が用意されています。ユースケースに最適な方法がわからない場合、「[HTTP リクエストを使用して Lambda 関数を呼び出す方法を選択する](furls-http-invoke-decision.md)」を参照してください。

関数 URL を作成すると、一意の URL エンドポイントが Lambda により自動的に生成されます。関数 URL を作成した後に、その URL エンドポイントが変更されることはありません。関数 URL のエンドポイントでは、次の形式を使用します。

```
https://<url-id>.lambda-url.<region>.on.aws
```

**注記**  
関数 URL がサポートされていない AWS リージョン は、アジアパシフィック (ハイデラバード) (`ap-south-2`)、アジアパシフィック (メルボルン) (`ap-southeast-4`)、アジアパシフィック (マレーシア) (`ap-southeast-5`)、アジアパシフィック (ニュージーランド) (`ap-southeast-6`)、アジアパシフィック (タイ) (`ap-southeast-7`)、アジアパシフィック (台北) (`ap-east-2`)、カナダ西部 (カルガリー) (`ca-west-1`)、欧州 (スペイン) (`eu-south-2`)、欧州 (チューリッヒ) (`eu-central-2`)、イスラエル (テルアビブ) (`il-central-1`)、および中東 (UAE) (`me-central-1`) です。

関数 URL はデュアルスタックに対応しており、IPv4 と IPv6 をサポートしています。関数 URL の設定が完了すると、ウェブブラウザ、curl、Postman、または任意の HTTP クライアントからの、HTTP エンドポイントを介した関数の呼び出しが可能になります。関数 URL を呼び出すには、`lambda:InvokeFunctionUrl` と `lambda:InvokeFunction` のアクセス許可が必要です。詳細については、「[アクセスコントロール](urls-auth.md)」を参照してください。

**Topics**
+ [

## 関数 URL 呼び出しの基本
](#urls-invocation-basics)
+ [

## リクエストとレスポンスのペイロード
](#urls-payloads)

## 関数 URL 呼び出しの基本
<a name="urls-invocation-basics"></a>

関数 URL が認証タイプに `AWS_IAM` を使用している場合、各 HTTP リクエストには、[AWS Signature Version 4 (SigV4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) による署名が必要です。[Postman](https://quickstarts.postman.com/guide/aws/index.html?index=..%2F..index#2) などのツールには、SigV4 でリクエストに署名するための方法が既に組み込まれています。

関数 URL への HTTP リクエストの署名にツールを使用しない場合は、各リクエストには、SigV4 を使用して手動で署名する必要があります。関数 URL がリクエストを受信すると、Lambda が Sigv4 署名の処理を行います。署名が一致した場合のみ、Lambda によりリクエストが処理されます。SigV4 を使用してリクエストに手動で署名する方法については、「* Guide」(Amazon Web Services 全般のリファレンス ガイド) の「[Signing AWS requests with Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)」(署名バージョン 4 を使用した * リクエストへの署名) を参照してください。

関数 URL が認証タイプに `NONE` を使用している場合は、リクエストには Sigv4 を使用した署名の必要はありません。ウェブブラウザ、curl、Postman、または任意の HTTP クライアントを使用して関数を呼び出すことができます。

関数へのシンプルな `GET` リクエストをテストするには、ウェブブラウザを使用します。例えば、関数 URL が `https://abcdefg.lambda-url.us-east-1.on.aws` で文字列パラメータ `message` を取り込む関数の場合、リクエストする URL は次のようになります。

```
https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld
```

`POST` リクエストなど、他の HTTP リクエストをテストする場合は、curl などのツールが利用できます。例えば、関数 URL への `POST` リクエストに一定の JSON データを含めたい場合には、次の curl コマンドを使用します。

```
curl -v 'https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld' \
-H 'content-type: application/json' \
-d '{ "example": "test" }'
```

## リクエストとレスポンスのペイロード
<a name="urls-payloads"></a>

クライアントが関数の URL を呼び出すと、Lambda は、まずこのリクエストをイベントオブジェクトにマップしてから、関数に受け渡します その関数の応答は、Lambda が関数 URL を介してクライアントに返信する HTTP レスポンスにマッピングされます。

このリクエストとレスポンスのイベント形式は、[Amazon API Gateway ペイロード形式バージョン 2.0](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format) と同じスキーマに従います。

### リクエストペイロードの形式
<a name="urls-request-payload"></a>

リクエストペイロードは次の構造を持ちます。

```
{
  "version": "2.0",
  "routeKey": "$default",
  "rawPath": "/my/path",
  "rawQueryString": "parameter1=value1&parameter1=value2&parameter2=value",
  "cookies": [
    "cookie1",
    "cookie2"
  ],
  "headers": {
    "header1": "value1",
    "header2": "value1,value2"
  },
  "queryStringParameters": {
    "parameter1": "value1,value2",
    "parameter2": "value"
  },
  "requestContext": {
    "accountId": "123456789012",
    "apiId": "<urlid>",
    "authentication": null,
    "authorizer": {
        "iam": {
                "accessKey": "AKIA...",
                "accountId": "111122223333",
                "callerId": "AIDA...",
                "cognitoIdentity": null,
                "principalOrgId": null,
                "userArn": "arn:aws:iam::111122223333:user/example-user",
                "userId": "AIDA..."
        }
    },
    "domainName": "<url-id>.lambda-url.us-west-2.on.aws",
    "domainPrefix": "<url-id>",
    "http": {
      "method": "POST",
      "path": "/my/path",
      "protocol": "HTTP/1.1",
      "sourceIp": "123.123.123.123",
      "userAgent": "agent"
    },
    "requestId": "id",
    "routeKey": "$default",
    "stage": "$default",
    "time": "12/Mar/2020:19:03:58 +0000",
    "timeEpoch": 1583348638390
  },
  "body": "Hello from client!",
  "pathParameters": null,
  "isBase64Encoded": false,
  "stageVariables": null
}
```


| パラメータ | 説明 | 例 | 
| --- | --- | --- | 
|  `version`  |  このイベントでのペイロード形式のバージョン。現在 Lambda 関数 URL では、[ペイロード形式バージョン 2.0](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format) をサポートしています。  |  `2.0`  | 
|  `routeKey`  |  関数 URL ではこのパラメーターを使用しません。Lambda は、プレースホルダーとしてこの値に `$default` を設定します。  |  `$default`  | 
|  `rawPath`  |  リクエストパス。例えば、リクエスト URL が `https://{url-id}.lambda-url.{region}.on.aws/example/test/demo` の場合は、raw パス値は `/example/test/demo` となります。  |  `/example/test/demo`  | 
|  `rawQueryString`  |  リクエストのクエリ文字列パラメータを含む raw 文字列。サポートされている文字は、`a-z`、`A-Z`、`0-9`、`.`、`_`、`-`、`%`、`&`、`=`、`+` などです。  |  `"?parameter1=value1&parameter2=value2"`  | 
|  `cookies`  |  リクエストの一部として送信されたすべての Cookie を含む配列。  |  `["Cookie_1=Value_1", "Cookie_2=Value_2"]`  | 
|  `headers`  |  キーと値のペアで表されるリクエストヘッダーのリスト。  |  `{"header1": "value1", "header2": "value2"}`  | 
|  `queryStringParameters`  |  リクエストに対するクエリパラメータです。例えば、リクエスト URL が `https://{url-id}.lambda-url.{region}.on.aws/example?name=Jane` である場合の `queryStringParameters` の値は、キーに `name` を、値に `Jane` を持つ、JSON オブジェクトとなります  |  `{"name": "Jane"}`  | 
|  `requestContext`  |  リクエストに関する追加的な情報 (`requestId`、リクエストの発行時刻、および AWS Identity and Access Management (IAM) 経由で承認された場合は発信者の身元、その他) を含むオブジェクト。  |   | 
|  `requestContext.accountId`  |  関数所有者の AWS アカウント ID。  |  `"123456789012"`  | 
|  `requestContext.apiId`  |  関数 URL ID。  |  `"33anwqw8fj"`  | 
|  `requestContext.authentication`  |  関数 URL ではこのパラメーターを使用しません。Lambda では `null` がセットされます。  |  `null`  | 
|  `requestContext.authorizer`  |  関数 URL で `AWS_IAM` の認証タイプが使用されている場合の、発信者の ID に関する情報を含むオブジェクト。それ以外の場合、Lambda はこれに `null` をセットします。  |   | 
|  `requestContext.authorizer.iam.accessKey`  |  発信者 ID のアクセスキー。  |  `"AKIAIOSFODNN7EXAMPLE"`  | 
|  `requestContext.authorizer.iam.accountId`  |  発信者アイデンティティの AWS アカウント ID。  |  `"111122223333"`  | 
|  `requestContext.authorizer.iam.callerId`  |  発信者の ID (ユーザー ID)。  |  `"AIDACKCEVSQ6C2EXAMPLE"`  | 
|  `requestContext.authorizer.iam.cognitoIdentity`  |  関数 URL ではこのパラメータを使用しません。Lambda は、この値に `null` を設定するか、JSON からこれを除外します。  |  `null`  | 
|  `requestContext.authorizer.iam.principalOrgId`  |  発信者の身元に関連付けられているプリンシパル組織 ID。  |  `"AIDACKCEVSQORGEXAMPLE"`  | 
|  `requestContext.authorizer.iam.userArn`  |  発信者の身元のユーザー Amazon リソースネーム (ARN)。  |  `"arn:aws:iam::111122223333:user/example-user"`  | 
|  `requestContext.authorizer.iam.userId`  |  発信者の身元のユーザー ID。  |  `"AIDACOSFODNN7EXAMPLE2"`  | 
|  `requestContext.domainName`  |  関数 URL のドメイン名。  |  `"<url-id>.lambda-url.us-west-2.on.aws"`  | 
|  `requestContext.domainPrefix`  |  関数 URL のドメインプレフィックス。  |  `"<url-id>"`  | 
|  `requestContext.http`  |  HTTP リクエストの詳細を含むオブジェクト。  |   | 
|  `requestContext.http.method`  |  リクエストで使用されている HTTP メソッド。有効な値には、`GET`、`POST`、`PUT`、`HEAD`、`OPTIONS`、`PATCH` および `DELETE` があります。  |  `GET`  | 
|  `requestContext.http.path`  |  リクエストパス。例えば、リクエスト URL が `https://{url-id}.lambda-url.{region}.on.aws/example/test/demo` であれば、パス値は `/example/test/demo` となります。  |  `/example/test/demo`  | 
|  `requestContext.http.protocol`  |  リクエストのプロトコル。  |  `HTTP/1.1`  | 
|  `requestContext.http.sourceIp`  |  リクエストを発行した即時 TCP 接続のソース IP アドレス。  |  `123.123.123.123`  | 
|  `requestContext.http.userAgent`  |  User-Agent リクエストヘッダー値。  |  `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Gecko/20100101 Firefox/42.0`  | 
|  `requestContext.requestId`  |  呼び出しリクエストの ID。この ID は、関数に関連する呼び出しログをトレースするために使用できます。  |  `e1506fd5-9e7b-434f-bd42-4f8fa224b599`  | 
|  `requestContext.routeKey`  |  関数 URL ではこのパラメーターを使用しません。Lambda は、プレースホルダーとしてこの値に `$default` を設定します。  |  `$default`  | 
|  `requestContext.stage`  |  関数 URL ではこのパラメーターを使用しません。Lambda は、プレースホルダーとしてこの値に `$default` を設定します。  |  `$default`  | 
|  `requestContext.time`  |  リクエストのタイムスタンプです。  |  `"07/Sep/2021:22:50:22 +0000"`  | 
|  `requestContext.timeEpoch`  |  リクエストのタイムスタンプ (Unix エポック秒)。  |  `"1631055022677"`  | 
|  `body`  |  リクエスト本文。リクエストのコンテンツタイプがバイナリの場合、本文は base64 でエンコードされます。  |  `{"key1": "value1", "key2": "value2"}`  | 
|  `pathParameters`  |  関数 URL ではこのパラメーターを使用しません。Lambda は、この値に `null` を設定するか、JSON からこれを除外します。  |  `null`  | 
|  `isBase64Encoded`  |  ボディがバイナリペイロードで base64 でエンコードされている場合は `TRUE`、それ以外の場合は `FALSE` です。  |  `FALSE`  | 
|  `stageVariables`  |  関数 URL ではこのパラメーターを使用しません。Lambda は、この値に `null` を設定するか、JSON からこれを除外します。  |  `null`  | 

### レスポンスペイロードの形式
<a name="urls-response-payload"></a>

関数からレスポンスが返されると、Lambda はそのレスポンスを解析し HTTP の形式に変換します。関数レスポンスペイロードの形式は以下のとおりです。

```
{
   "statusCode": 201,
    "headers": {
        "Content-Type": "application/json",
        "My-Custom-Header": "Custom Value"
    },
    "body": "{ \"message\": \"Hello, world!\" }",
    "cookies": [
        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",
        "Cookie_2=Value2; Max-Age=78000"
    ],
    "isBase64Encoded": false
}
```

Lambda は自動的にレスポンス形式を推定します。関数が有効な JSON を返し、かつ `statusCode` を返さない場合、Lambda は以下のような想定を立てます。
+ `statusCode`is(`200` )
**注記**  
有効な `statusCode` は 100～599 の範囲内です。
+ `content-type`is(`application/json` )
+ `body` は関数のレスポンス。
+ `isBase64Encoded`is(`false` )

次の例は、Lambda 関数の出力がレスポンスペイロードにどのようにマッピングされるか、また、レスポンスペイロードが最終的な HTTP レスポンスにどのようにマッピングされるかを示しています。関数の URL を呼び出したクライアントには、HTTP 応答が表示されます。

**文字列によるレスポンスの出力例**


| Lambda 関数出力 | インタプリティングされたレスポンス出力 | HTTP レスポンス (クライアントに表示されるもの) | 
| --- | --- | --- | 
|  <pre>"Hello, world!"</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": "Hello, world!",<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 15<br /><br />"Hello, world!"</pre>  | 

**JSON によるレスポンスの出力例**


| Lambda 関数出力 | インタプリティングされたレスポンス出力 | HTTP レスポンス (クライアントに表示されるもの) | 
| --- | --- | --- | 
|  <pre>{<br />  "message": "Hello, world!"<br />}</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": {<br />    "message": "Hello, world!"<br />  },<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 34<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

**カスタムレスポンスの出力例**


| Lambda 関数出力 | インタプリティングされたレスポンス出力 | HTTP レスポンス (クライアントに表示されるもの) | 
| --- | --- | --- | 
|  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 201<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 27<br />my-custom-header: Custom Value<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

### Cookie
<a name="urls-cookies"></a>

関数から Cookie を返す場合、手動で `set-cookie` ヘッダーを追加しないでください。代わりに、レスポンスペイロードオブジェクトに Cookie を含めます。Lambda はこれを自動的に解釈し、次の例のように HTTP レスポンスの `set-cookie` ヘッダーとして追加します。


| Lambda 関数出力 | HTTP レスポンス (クライアントに表示されるもの) | 
| --- | --- | 
|  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "cookies": [<br />        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",<br />        "Cookie_2=Value2; Max-Age=78000"<br />    ],<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 201<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 27<br />my-custom-header: Custom Value<br />set-cookie: Cookie_1=Value2; Expires=21 Oct 2021 07:48 GMT<br />set-cookie: Cookie_2=Value2; Max-Age=78000<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

# Lambda 関数 URL のモニタリング
<a name="urls-monitoring"></a>

関数 URL のモニタリングには、AWS CloudTrail および Amazon CloudWatch が使用できます。

**Topics**
+ [

## CloudTrail による関数 URL のモニタリング
](#urls-cloudtrail)
+ [

## 関数 URL 用の CloudWatch メトリクス
](#urls-cloudwatch)

## CloudTrail による関数 URL のモニタリング
<a name="urls-cloudtrail"></a>

Lambda は、以下の関数 URL 用 API オペレーションのログを、CloudTrail ログファイル内のイベントとして自動的に記録します。
+ [CreateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html)
+ [UpdateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionUrlConfig.html)
+ [DeleteFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionUrlConfig.html)
+ [GetFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionUrlConfig.html)
+ [ListFunctionUrlConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListFunctionUrlConfigs.html)

各ログエントリには、発信者 ID、リクエストが発行された日時、およびその他の詳細に関する情報が含まれます。CloudTrail で **[Event history]** (イベント履歴) を表示することで、過去 90 日以内のすべてのイベントを確認できます。90 日より前のレコードを保持するには、追跡を作成します。

CloudTrail のデフォルトでは、データイベントと見なされる `InvokeFunctionUrl` リクエストのログ記録は行われません。ただし、CloudTrail でデータイベントのログ記録を有効化することは可能です 詳細については、**「AWS CloudTrail ユーザーガイド」の「[証跡のデータイベントの記録](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)」を参照してください。

## 関数 URL 用の CloudWatch メトリクス
<a name="urls-cloudwatch"></a>

Lambda は、関数 URL リクエストに関して集計されたメトリクスを、CloudWatch に送信します。CloudWatch コンソールでは、これらのメトリクスを使用して、関数 URL のモニタリング、ダッシュボードの作成、アラームの設定を行うことができます。

関数 URL では、呼び出しに関する以下のメトリクスをサポートしています。これらのメトリクスの表示には、`Sum` 統計を使用することをお勧めします。
+ `UrlRequestCount` – この関数 URL に対し発行されたリクエストの数。
+ `Url4xxCount` – 4xx HTTP ステータスコードを返したリクエストの数。4xx シリーズのコードは、不正なリクエストなど、クライアント側で発生したエラーを表します。
+ `Url5xxCount` – 5xx HTTP ステータスコードを返したリクエストの数。5xx シリーズのコードは、機能エラーやタイムアウトなど、サーバー側で発生したエラーを表します。

関数 URL では、パフォーマンスに関する以下のメトリクスもサポートしています。このメトリクスの表示には、`Average` または `Max` 統計を使用することをお勧めします。
+ `UrlRequestLatency` – 関数 URL がリクエストを受信してから関数 URL がレスポンスを返すまでの時間。

呼び出しとパフォーマンスに関するこれらのメトリクスは、それぞれ以下のディメンションをサポートしています。
+ `FunctionName` – 未公開な関数の `$LATEST` バージョン (あるいは関数の任意のエイリアス) に割り当てられている、関数 URL の集計メトリクスを表示します。例えば、`hello-world-function` と指定します。
+ `Resource` – 特定の関数 URL のメトリクスを表示します。この値は、未公開な関数の `$LATEST` バージョン (または関数のいずれかエイリアス) とならんで、関数の名前により定義されます 例えば、`hello-world-function:$LATEST` と指定します。
+ `ExecutedVersion` – 特定の関数 URL のメトリクスを、実行されたバージョンに基づいて表示します。このディメンションは、主に、未公開な `$LATEST` バージョンに割り当てられた関数 URL を追跡するために使用します。

# HTTP リクエストを使用して Lambda 関数を呼び出す方法を選択する
<a name="furls-http-invoke-decision"></a>

Lambda の一般的なユースケースの多くでは、HTTP リクエストを使用した関数の呼び出しを行います。例えば、ウェブアプリケーションがブラウザリクエストを通じて関数を呼び出すようにしたい場合があります。Lambda 関数を使用して、完全な REST API の作成、モバイルアプリからのユーザーインタラクションの処理、HTTP コールによる外部サービスからのデータの処理、カスタムウェブフックの作成を行うこともできます。

以下のセクションでは、HTTP によって Lambda を呼び出す際の選択について説明し、特定のユースケースに適した意思決定に役立つ情報を提供します。

## HTTP 呼び出し方法を選択する場合、どのような選択肢がありますか
<a name="w2aac39c81c73b9"></a>

Lambda には、HTTP リクエストを使用して関数を呼び出す方法として、主に[関数 URL](urls-configuration.md) と [API Gateway](services-apigateway.md) の 2 つがあります。両者の主な違いは以下のとおりです。
+ **Lambda 関数 URL** は、Lambda 関数のシンプルで直接的な HTTP エンドポイントを提供します。シンプルさとコスト効率のために最適化されており、HTTP 経由で Lambda 関数を公開するための最速のパスを提供します。
+ **API Gateway** は、豊富な機能を備えた API をビルドするためのより高度なサービスです。API Gateway は、本番環境 API を大規模にビルドおよび管理することに最適化されており、セキュリティ、モニタリング、トラフィック管理の包括的なツールを提供します。

## 要件が既にわかっている場合の推奨事項
<a name="w2aac39c81c73c11"></a>

要件が既に明確な場合は、基本的な推奨事項を以下に示します。

基本認証方式とリクエスト/レスポンス処理のみが必要で、コストと複雑さを最小限に抑えたいシンプルなアプリケーションやプロトタイプには、**[関数 URL](urls-configuration.md)** をお勧めします。

**[API Gateway](services-apigateway.md)** は、大規模な本稼働用アプリケーションや、[OpenAPI Description](https://www.openapis.org/) サポート、認証オプションの選択、カスタムドメイン名、またはスロットリング、キャッシュ、リクエスト/レスポンス変換を含む豊富なリクエスト/レスポンス処理など、より高度な機能が必要な場合に適しています。

## Lambda 関数を呼び出す方法を選択する際の考慮事項
<a name="w2aac39c81c73c13"></a>

関数 URL と API Gateway から選択する場合、次の要素を考慮する必要があります。
+ ユーザーの認証に OAuth または Amazon Cognito が必要かどうかなど、認証のニーズ
+ スケーリング要件と実装する API の複雑さ
+ リクエストの検証やリクエスト/レスポンスのフォーマットなどの高度な機能が必要かどうか
+ モニタリング要件
+ コスト目標

これらの要素を理解することで、セキュリティ、複雑さ、コスト要件のバランスを取るのに最適なオプションを選択できます。

次の情報は、2 つのオプションの主な違いをまとめたものです。

### 認証
<a name="w2aac39c81c73c13c11b1"></a>
+ **関数 URL** は AWS Identity and Access Management (IAM) を通じて基本的な認証オプションを提供します。エンドポイントは、パブリック (認証なし) にするか、IAM 認証を要求するように設定できます。IAM 認証では、標準の AWS 認証情報または IAM ロールを使用してアクセスを制御できます。設定は簡単ですが、このアプローチでは、他の認証方式に比べてオプションが限られています。
+ **API Gateway** では、より包括的な認証オプションが使用できます。IAM 認証に加えて、[Lambda オーソライザー](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html) (カスタム認証ロジック)、[Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) ユーザープール、および OAuth2.0 フローを使用できます。この柔軟性により、サードパーティー認証プロバイダー、トークンベースの認証、多要素認証などの複雑な認証スキームを実装できます。

### リクエスト/レスポンス処理
<a name="w2aac39c81c73c13c11b3"></a>
+ **関数 URL** は、基本的な HTTP リクエストとレスポンスの処理を提供します。標準 HTTP メソッドがサポートされており、組み込みの Cross-Origin Resource Sharing (CORS) サポートが含まれています。JSON ペイロードとクエリパラメータは処理できますが、リクエスト変換や検証機能は提供されません。レスポンス処理も同様にシンプルです。クライアントは Lambda が返すのとまったく同じように、Lambda 関数からレスポンスを受け取ります。
+ **API Gateway** では、高度なリクエストおよびレスポンス処理機能が提供されます。リクエスト検証機能の定義、マッピングテンプレートを使用したリクエストとレスポンスの変換、リクエスト/レスポンスヘッダーの設定、およびレスポンスキャッシュの実装ができます。API Gateway はバイナリペイロードとカスタムドメイン名もサポートしており、クライアントに到達する前にレスポンスを変更できます。JSON スキーマを使用して、リクエスト/レスポンスの検証と変換のモデルを設定できます。

### スケーリング
<a name="w2aac39c81c73c13c11b5"></a>
+ **関数 URL** は、Lambda 関数の同時実行数の制限に合わせて直接スケーリングし、設定された同時実行数の上限まで関数をスケールアップすることでトラフィックの急増を処理します。この制限に達すると、Lambda は HTTP 429 レスポンスで追加のリクエストに応答します。組み込みのキューイングメカニズムがないため、スケーリングの処理は Lambda 関数の設定に完全に依存します。デフォルトでは、Lambda 関数の同時実行数は AWS リージョンあたり 1,000 に制限されています。
+ **API Gateway** には、Lambda 独自のスケーリングに加えて追加のスケーリング機能があります。リクエストキューイングとスロットリング制御が組み込まれているため、トラフィックの急増をより適切に管理できます。API Gateway は、デフォルトでリージョンごとに 1 秒あたり最大 10,000 件のリクエストを処理できます。バーストキャパシティは 1 秒あたり 5,000 件のリクエストです。また、バックエンドを保護するために、さまざまなレベル (API、ステージ、またはメソッド) でリクエストを調整するツールも提供します。

### モニタリング
<a name="w2aac39c81c73c13c11b7"></a>
+ **関数 URL** は、リクエスト数、レイテンシー、エラー率など、Amazon CloudWatch メトリクスによる基本的なモニタリングを提供します。標準の Lambda メトリクスとログにアクセスでき、関数に送信される未加工のリクエストが表示されます。これにより運用上の重要な可視性が得られますが、メトリクスは主に関数の実行に関するものになります。
+ **API Gateway** では、詳細なメトリクス、ログ記録、トレースオプションなど、包括的なモニタリング機能が提供されます。CloudWatch を使用して、API コール、レイテンシー、エラー率、キャッシュヒット/ミス率をモニタリングできます。また、API Gateway は AWS X-Ray と統合して分散型トレースを行い、ログ形式のカスタマイズが可能です。

### Cost
<a name="w2aac39c81c73c13c11b9"></a>
+ **関数 URL** は、標準の Lambda 料金モデルに従います。関数の呼び出しと計算時間についてのみ料金が発生します。URL エンドポイント自体には追加料金はかかりません。これにより、API Gateway の追加機能が必要ない場合は、シンプルな API またはトラフィックの少ないアプリケーションに対して費用対効果の高い選択肢になります。
+ **API Gateway** には、REST API で受信される 100 万回の API コールと、HTTP API で受信される 100 万回の API コールを含む[無料利用枠](https://aws.amazon.com/api-gateway/pricing/#Free_Tier)が用意されています。無料利用枠を超えると、API Gateway では API コール、データ転送、キャッシュ (有効になっている場合) に対して料金が発生します。独自のユースケースのコストについては、API Gateway の[料金ページ](https://aws.amazon.com/api-gateway/pricing/)を参照してください。

### その他の機能
<a name="w2aac39c81c73c13c11c11"></a>
+ **関数 URL** は、簡単に利用でき、Lambda と直接統合できるように設計されています。HTTP エンドポイントと HTTPS エンドポイントの両方をサポートし、組み込みの CORS サポートとデュアルスタック (IPv4 および IPv6) エンドポイントを提供します。高度な機能はありませんが、HTTP 経由で Lambda 関数を公開する迅速かつシンプルな方法が必要なシナリオに適しています。
+ **API Gateway** には、API バージョニング、ステージ管理、使用量プランの API キー、Swagger/OpenAPI による API ドキュメント、WebSocket API、VPC 内のプライベート API、セキュリティを強化するための WAF 統合など、さまざまな追加機能が含まれています。また、カナリアデプロイ、テスト用のモック統合、Lambda 以外の他の AWS のサービスとの統合もサポートされています。

## Lambda 関数を呼び出す方法を選択する
<a name="w2aac39c81c73c15"></a>

Lambda 関数 URL と API Gateway の選択基準とその主な違いについて確認した後は、ニーズに最適なオプションを選択し、以下のリソースを使用して利用を開始できます。

------
#### [ Function URLs ]

**以下のリソースを使用して関数 URL の使用を開始する**
+ 「[チュートリアル: 関数 URL を使用する Lambda 関数の作成](urls-webhook-tutorial.md)」に従います。
+ 関数 URL の詳細については、このガイドの「[Lambda 関数 URL の作成と管理](urls-configuration.md)」の章を参照してください。
+ 次の操作を実行して、コンソール内ガイド付きチュートリアル「**シンプルなウェブアプリケーションを作成**」を試します。

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

1. 画面の右上にあるアイコンを選択して、ヘルプパネルを開きます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/console_help_screenshot.png)

1. **[チュートリアル]** を選択します。

1. **[シンプルなウェブアプリケーションを作成]** で、**[チュートリアルを開始]** を選択します。

------
#### [ API Gateway ]

**以下のリソースを使用して Lambda と API Gateway の使用を開始する**
+ 「[チュートリアル: API Gateway で Lambda を使用する](services-apigateway-tutorial.md)」に従って、バックエンド Lambda 関数と統合した REST API を作成します。
+ API Gateway が提供するさまざまな種類の API の詳細については、「*Amazon API Gateway デベロッパーガイド*」の以下のセクションを参照してください。
  + [API Gateway REST API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html)
  + [API Gateway HTTP API](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html)
  + [API Gateway WebSocket API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html)
+ 「*Amazon API Gateway デベロッパーガイド*」の「[Amazon API Gateway のチュートリアルとワークショップ](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-tutorials.html)」セクションで 1 つまたは複数の例を試してください。

------

# チュートリアル: Lambda 関数 URL を使用したウェブフックエンドポイントの作成
<a name="urls-webhook-tutorial"></a>

このチュートリアルでは、ウェブフックエンドポイントを実装するための Lambda 関数 URL を作成します。ウェブフックは、HTTP を使用してアプリケーション間でデータを自動的に送信する、軽量のイベント駆動型通信です。ウェブフックを使用すると、新しい顧客がウェブサイトにサインアップしたとき、支払いが処理されたとき、ファイルのアップロードされたときなど、別のシステムで発生したイベントに関する最新情報をすぐに受け取ることができます。

Lambda では、Lambda 関数 URL または API Gateway を使用してウェブフックを実装できます。関数 URL は、高度な認可やリクエストの検証などの機能を必要としないシンプルなウェブフックに適しています。

**ヒント**  
ユースケースに最適なソリューションがわからない場合、「[HTTP リクエストを使用して Lambda 関数を呼び出す方法を選択する](furls-http-invoke-decision.md)」を参照してください。

## 前提条件
<a name="urls-webhook-tutorial-prereqs"></a>

このチュートリアルを完了するには、ローカルマシンに Python (バージョン 3.8 以降) または Node.js (バージョン 18 以降) がインストールされている必要があります。

HTTP リクエストを使用してエンドポイントをテストするために、チュートリアルでは [curl](https://curl.se/) を使用します。curl は、さまざまなネットワークプロトコルを使用してデータを転送するために使用できるコマンドラインツールです。ツールをまだお持ちでない場合は、[curl ドキュメント](https://curl.se/docs/install.html)を参照してください。

## Lambda 関数を作成する
<a name="urls-webhook-tutorial-function"></a>

まず、HTTP リクエストがウェブフックエンドポイントに送信されたときに実行される Lambda 関数を作成します。この例では、送信側アプリケーションは、支払いが送信されるたびに更新を送信し、支払いが成功したかどうかを HTTP リクエストの本文に表示します。Lambda 関数はリクエストを解析し、支払いのステータスに従ってアクションを実行します。この例では、コードは支払いの注文 ID を出力しますが、実際のアプリケーションでは、注文をデータベースに追加するか、通知を送信できます。

この関数は、ウェブフックに使用される最も一般的な認証方法である、ハッシュベースのメッセージ認証 (HMAC) も実装します。この方法では、送信側アプリケーションと受信側アプリケーションの両方がシークレットキーを共有します。送信アプリケーションは、ハッシュアルゴリズムを使用して、このキーとメッセージコンテンツを使用して一意の署名を生成し、HTTP ヘッダーとしてウェブフックリクエストに署名を含めます。次に、受信側アプリケーションはこのステップを繰り返し、シークレットキーを使用して署名を生成し、結果の値をリクエストヘッダーで送信された署名と比較します。結果が一致すると、リクエストは正当であると見なされます。

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

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

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

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

1. 次の操作を行って、基本的な「Hello world」関数を作成します。

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

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

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

   1. **[ランタイム]** で **[python3.14]** を選択します。

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

1. **[コードソース]** ペインで、以下をコピーして貼り付けて既存のコードを置き換えます。

   ```
   import json
   import hmac
   import hashlib
   import os
   
   def lambda_handler(event, context):
       
       # Get the webhook secret from environment variables
       webhook_secret = os.environ['WEBHOOK_SECRET']
       
       # Verify the webhook signature
       if not verify_signature(event, webhook_secret):
           return {
               'statusCode': 401,
               'body': json.dumps({'error': 'Invalid signature'})
           }
       
       try:
           # Parse the webhook payload
           payload = json.loads(event['body'])
           
           # Handle different event types
           event_type = payload.get('type')
           
           if event_type == 'payment.success':
               # Handle successful payment
               order_id = payload.get('orderId')
               print(f"Processing successful payment for order {order_id}")
               
               # Add your business logic here
               # For example, update database, send notifications, etc.
               
           elif event_type == 'payment.failed':
               # Handle failed payment
               order_id = payload.get('orderId')
               print(f"Processing failed payment for order {order_id}")
               
               # Add your business logic here
               
           else:
               print(f"Received unhandled event type: {event_type}")
           
           # Return success response
           return {
               'statusCode': 200,
               'body': json.dumps({'received': True})
           }
           
       except json.JSONDecodeError:
           return {
               'statusCode': 400,
               'body': json.dumps({'error': 'Invalid JSON payload'})
           }
       except Exception as e:
           print(f"Error processing webhook: {e}")
           return {
               'statusCode': 500,
               'body': json.dumps({'error': 'Internal server error'})
           }
   
   def verify_signature(event, webhook_secret):
       """
       Verify the webhook signature using HMAC
       """
       try:
           # Get the signature from headers
           signature = event['headers'].get('x-webhook-signature')
   
           if not signature:
               print("Error: Missing webhook signature in headers")
               return False
           
           # Get the raw body (return an empty string if the body key doesn't exist)
           body = event.get('body', '')
           
           # Create HMAC using the secret key
           expected_signature = hmac.new(
               webhook_secret.encode('utf-8'),
               body.encode('utf-8'),
               hashlib.sha256
           ).hexdigest()
           
           # Compare the expected signature with the received signature to authenticate the message
           is_valid = hmac.compare_digest(signature, expected_signature)
           if not is_valid:
               print(f"Error: Invalid signature. Received: {signature}, Expected: {expected_signature}")
               return False
               
           return True
       except Exception as e:
           print(f"Error verifying signature: {e}")
           return False
   ```

1. **[DEPLOY]** セクションで **[デプロイ]** を選択して関数のコードを更新します。

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

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

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

1. 次の操作を行って、基本的な「Hello world」関数を作成します。

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

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

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

   1. **[ランタイム]** で、**[nodejs24.x]** を選択します。

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

1. **[コードソース]** ペインで、以下をコピーして貼り付けて既存のコードを置き換えます。

   ```
   import crypto from 'crypto';
   
   export const handler = async (event, context) => {
       // Get the webhook secret from environment variables
       const webhookSecret = process.env.WEBHOOK_SECRET;
   
       // Verify the webhook signature
       if (!verifySignature(event, webhookSecret)) {
           return {
               statusCode: 401,
               body: JSON.stringify({ error: 'Invalid signature' })
           };
       }
   
       try {
           // Parse the webhook payload
           const payload = JSON.parse(event.body);
   
           // Handle different event types
           const eventType = payload.type;
   
           switch (eventType) {
               case 'payment.success': {
                   // Handle successful payment
                   const orderId = payload.orderId;
                   console.log(`Processing successful payment for order ${orderId}`);
   
                   // Add your business logic here
                   // For example, update database, send notifications, etc.
                   break;
               }
   
               case 'payment.failed': {
                   // Handle failed payment
                   const orderId = payload.orderId;
                   console.log(`Processing failed payment for order ${orderId}`);
   
                   // Add your business logic here
                   break;
               }
   
               default:
                   console.log(`Received unhandled event type: ${eventType}`);
           }
   
           // Return success response
           return {
               statusCode: 200,
               body: JSON.stringify({ received: true })
           };
   
       } catch (error) {
           if (error instanceof SyntaxError) {
               // Handle JSON parsing errors
               return {
                   statusCode: 400,
                   body: JSON.stringify({ error: 'Invalid JSON payload' })
               };
           }
   
           // Handle all other errors
           console.error('Error processing webhook:', error);
           return {
               statusCode: 500,
               body: JSON.stringify({ error: 'Internal server error' })
           };
       }
   };
   
   // Verify the webhook signature using HMAC
   
   const verifySignature = (event, webhookSecret) => {
       try {
           // Get the signature from headers
           const signature = event.headers['x-webhook-signature'];
     
           if (!signature) {
               console.log('No signature found in headers:', event.headers);
               return false;
           }
     
           // Get the raw body (return an empty string if the body key doesn't exist)
           const body = event.body || '';
     
           // Create HMAC using the secret key
           const hmac = crypto.createHmac('sha256', webhookSecret);
           const expectedSignature = hmac.update(body).digest('hex');
     
           // Compare expected and received signatures
           const isValid = signature === expectedSignature;
           if (!isValid) {
               console.log(`Invalid signature. Received: ${signature}, Expected: ${expectedSignature}`);
               return false;
           }
           
           return true;
       } catch (error) {
           console.error('Error during signature verification:', error);
           return false;
       }
     };
   ```

1. **[DEPLOY]** セクションで **[デプロイ]** を選択して関数のコードを更新します。

------

## シークレットキーを作成する
<a name="urls-webhook-tutorial-key"></a>

Lambda 関数がウェブフックリクエストを認証するには、呼び出し元のアプリケーションと共有されるシークレットキーを使用します。この例では、キーは環境変数に保存されています。本番環境のアプリケーションでは、関数コードにパスワードなどの機密情報を含めないでください。代わりに、[AWS Secrets Manager シークレットを作成](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)し、[AWS パラメータとシークレット Lambda 拡張機能を使用](with-secrets-manager.md)して Lambda 関数の認証情報を取得します。

**ウェブフックシークレットキーを作成および保存する**

1. 暗号的に安全な乱数ジェネレーターを使用して、長いランダムな文字列を生成します。Python または Node.js で次のコードスニペットを使用して 32 文字のシークレットを生成して出力することも、独自の方法を使用することもできます。

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

**Example シークレットを生成するコード**  

   ```
   import secrets
   webhook_secret = secrets.token_urlsafe(32)
   print(webhook_secret)
   ```

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

**Example シークレットを生成するコード (ES モジュール形式)**  

   ```
   import crypto from 'crypto';
   let webhookSecret = crypto.randomBytes(32).toString('base64');
   console.log(webhookSecret)
   ```

------

1. 次の手順を実行して、生成された文字列を関数の環境変数として保存します。

   1. 関数の **[設定]** タブで、**[環境変数]** を選択します。

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

   1. **[環境変数の追加]** を選択します。

   1. **[キー]** に **WEBHOOK\$1SECRET** を入力し、**[値]** に前のステップで生成したシークレットを入力します。

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

このシークレットは、チュートリアルの後半で関数をテストするためにもう一度使用する必要があるため、ここで書き留めておきます。

## 関数 URL エンドポイントを作成する
<a name="urls-webhook-tutorial-furl"></a>

Lambda 関数 URL を使用して、ウェブフックのエンドポイントを作成します。`NONE` の認証タイプを使用してパブリックアクセスを持つエンドポイントを作成するため、URL を持つすべてのユーザーが関数を呼び出すことができます。関数 URL へのアクセス制御の詳細については、「[Lambda 関数 URL へのアクセスの制御](urls-auth.md)」を参照してください。ウェブフックに高度な認証オプションが必要な場合は、API Gateway の使用を検討してください。

**関数 URL エンドポイントを作成する**

1. 関数の **[設定]** タブで、**[関数 URL]** を選択します。

1. **[関数 URL を作成]** をクリックします。

1. **[認証タイプ]** で、**[なし]** を選択します。

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

先ほど作成した関数 URL のエンドポイントが **[関数 URL]** ペインに表示されます。チュートリアルの後半で使用するエンドポイントをコピーします。

## コンソールで関数をテストする
<a name="urls-webhook-tutorial-test-console"></a>

HTTP リクエストを使用して URL エンドポイントによって関数を呼び出す前に、コンソールでテストしてコードが期待どおりに動作していることを確認します。

コンソールで関数を検証するには、まずチュートリアルの前半で生成したシークレットを使用してウェブフック署名を計算し、次のテスト JSON ペイロードを使用します。

```
{
    "type": "payment.success", 
    "orderId": "1234",
    "amount": "99.99"
}
```

次の Python コードまたは Node.js コードの例のいずれかを使用して、独自のシークレットを使用してウェブフック署名を計算します。

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

**ウェブフック署名を計算する**

1. 次のコードを `calculate_signature.py` という名前のファイルとして保存します。コード内のウェブフックシークレットを独自の値に置き換えます。

   ```
   import secrets
   import hmac
   import json
   import hashlib
   
   webhook_secret = "arlbSDCP86n_1H90s0fL_Qb2NAHBIBQOyGI0X4Zay4M"
   
   body = json.dumps({"type": "payment.success", "orderId": "1234", "amount": "99.99"})
   
   signature = hmac.new(
               webhook_secret.encode('utf-8'),
               body.encode('utf-8'),
               hashlib.sha256
           ).hexdigest()
   
   print(signature)
   ```

1. コードを保存したのと同じディレクトリから次のコマンドを実行して、署名を計算します。コード出力の署名をコピーします。

   ```
   python calculate_signature.py
   ```

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

**ウェブフック署名を計算する**

1. 次のコードを `calculate_signature.mjs` という名前のファイルとして保存します。コード内のウェブフックシークレットを独自の値に置き換えます。

   ```
   import crypto from 'crypto';
   
   const webhookSecret = "arlbSDCP86n_1H90s0fL_Qb2NAHBIBQOyGI0X4Zay4M"
   const body = "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}";
   
   let hmac = crypto.createHmac('sha256', webhookSecret);
   let signature = hmac.update(body).digest('hex');
   
   console.log(signature);
   ```

1. コードを保存したのと同じディレクトリから次のコマンドを実行して、署名を計算します。コード出力の署名をコピーします。

   ```
   node calculate_signature.mjs
   ```

------

コンソールでテスト HTTP リクエストを使用して関数コードをテストできるようになりました。

**コンソールで関数をテストする**

1. 関数の **[コード]** タブを選択します。

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

1. **[イベント名]** で、「**myEvent**」と入力します。

1. 以下をコピーして **[イベント JSON]** ペインに貼り付け、既存の JSON を置き換えます。ウェブフック署名を、前のステップで計算した値に置き換えます。

   ```
   {
     "headers": {
       "Content-Type": "application/json",
       "x-webhook-signature": "2d672e7a0423fab740fbc040e801d1241f2df32d2ffd8989617a599486553e2a"
     },
     "body": "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}"
   }
   ```

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

1. **[呼び出し]** を選択します。

   次のような出力が表示されます:

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

   ```
   Status: Succeeded
   Test Event Name: myEvent
   
   Response:
   {
     "statusCode": 200,
     "body": "{\"received\": true}"
   }
   
   Function Logs:
   START RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6 Version: $LATEST
   Processing successful payment for order 1234
   END RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6
   REPORT RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6	Duration: 1.55 ms	Billed Duration: 2 ms	Memory Size: 128 MB	Max Memory Used: 36 MB	Init Duration: 136.32 ms
   ```

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

   ```
   Status: Succeeded
   Test Event Name: myEvent
   
   Response:
   {
     "statusCode": 200,
     "body": "{\"received\":true}"
   }
   
   Function Logs:
   START RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4 Version: $LATEST
   2025-01-10T18:05:42.062Z	e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4	INFO	Processing successful payment for order 1234
   END RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4
   REPORT RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4	Duration: 60.10 ms	Billed Duration: 61 ms	Memory Size: 128 MB	Max Memory Used: 72 MB	Init Duration: 174.46 ms
   
   Request ID: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4
   ```

------

## HTTP リクエストを使用して関数をテストする
<a name="urls-webhook-tutorial-test-curl"></a>

curl コマンドラインツールを使用して、ウェブフックエンドポイントをテストします。

**HTTP リクエストを使用して関数をテストする**

1. ターミナルまたはシェルプログラムで、次の curl コマンドを実行します。URL を独自の関数 URL エンドポイントの値に置き換え、ウェブフック署名を独自のシークレットキーを使用して計算した署名に置き換えます。

   ```
   curl -X POST https://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/ \
   -H "Content-Type: application/json" \
   -H "x-webhook-signature: d5f52b76ffba65ff60ea73da67bdf1fc5825d4db56b5d3ffa0b64b7cb85ef48b" \
   -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'
   ```

   以下の出力が表示されます。

   ```
   {"received": true}
   ```

1. 次の手順を実行して、関数の CloudWatch ログを検査し、ペイロードが正しく解析されたことを確認します。

   1. Amazon CloudWatch コンソールで、[[ロググループ]](https://console.aws.amazon.com/cloudwatch/home#logsV2:log-groups) ページを開きます。

   1. 関数のロググループ (`/aws/lambda/myLambdaWebhook`) を選択します。

   1. 最新のログストリームを選択します。

      関数のログには、次のような出力が表示されます。

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

      ```
      Processing successful payment for order 1234
      ```

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

      ```
      2025-01-10T18:05:42.062Z e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4 INFO Processing successful payment for order 1234
      ```

------

1. 次の curl コマンドを実行して、コードが無効な署名を検出したことを確認します。URL を独自の関数 URL エンドポイントに置き換えます。

   ```
   curl -X POST https://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/ \
   -H "Content-Type: application/json" \
   -H "x-webhook-signature: abcdefg" \
   -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'
   ```

   以下の出力が表示されます。

   ```
   {"error": "Invalid signature"}
   ```

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

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

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

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

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

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

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

コンソールで Lambda 関数を作成すると、Lambda は関数の[実行ロール](lambda-intro-execution-role.md)も作成します。

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

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

1. Lambda が作成した実行ロールを選択します。ロールの名前の形式は `myLambdaWebhook-role-<random string>` になります。

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

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