

# 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. テキスト入力フィールドにロールの名前を入力し、**[削除]** を選択します。