

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