

# API Gateway Lambda オーソライザーからの出力
<a name="api-gateway-lambda-authorizer-output"></a>

Lambda オーソライザー関数の出力はディクショナリのようなオブジェクトです。プリンシパル ID (`principalId`) と、ポリシーステートメントのリストを含むポリシードキュメント (`policyDocument`) を含む必要があります。出力には、キー/値ペアを含む `context` マップも含まることがあります。API が使用量プランを使用する ([https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apiKeySource](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apiKeySource) が `AUTHORIZER` に設定されている) 場合、Lambda オーソライザー関数は `usageIdentifierKey` プロパティ値として、使用量プランの API キーのいずれかを返す必要があります。

この出力の例を以下に示します。

------
#### [ JSON ]

****  

```
{
  "principalId": "yyyyyyyy", 
  "policyDocument": {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow|Deny",
        "Resource": "arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]"
      }
    ]
  },
  "context": {
    "stringKey": "value",
    "numberKey": "1",
    "booleanKey": "true"
  },
  "usageIdentifierKey": "{api-key}"
}
```

------

 ここで、ポリシーステートメントは、指定された API メソッド (`Effect`) を呼び出す (`Action`) ことを API Gateway 実行サービスに許可するか拒否するか (`Resource`) を指定しています。オーソライザーに基づいて複数のリソースへのアクセスを制御する必要がある場合があります。ワイルドカード (`*`) を使ってリソースタイプ (メソッド) を指定できます。API を呼び出す有効なポリシーの設定の詳細については、「[API Gateway で API を実行するための IAM ポリシーのステートメントの参照](api-gateway-control-access-using-iam-policies-to-invoke-api.md#api-gateway-calling-api-permissions)」を参照してください。

権限付与対応のメソッド ARN (`arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]` など) の場合、最大長は 1600 バイトです。パスパラメータの値 (そのサイズは実行時に決定されます) によっては、ARN の長さが制限を超えることがあります。これが発生した場合、API クライアントは `414 Request URI too long` レスポンスを受け取ります。

さらに、リソース ARN は、承認者によって出力されたポリシーステートメントに示されているように、現在 512 文字に制限されています。このため、JWT トークンが長すぎる URI をリクエスト URI に使用しないでください。代わりに、JWT トークンはリクエストヘッダーで安全に渡すことができます。

 `principalId` 値には、マッピングテンプレートで `$context.authorizer.principalId` 変数を使ってアクセスできます。これはバックエンドに値を渡す場合に便利です。詳細については、「[データ変換のコンテキスト変数](api-gateway-mapping-template-reference.md#context-variable-reference)」を参照してください。

 マッピングテンプレート内の `stringKey` マップの `numberKey`、`booleanKey`、または `"value"` 値 (例: `"1"`、`"true"`、または `context`) には、それぞれ `$context.authorizer.stringKey`、`$context.authorizer.numberKey`、または `$context.authorizer.booleanKey` を呼び出すことによりアクセスできます。返される値は、すべてが文字列化されます。`context` マップでキーの有効な値として JSON オブジェクトまたは配列を設定することはできません。

 オーソライザーからバックエンドに、キャッシュされた認証情報を返すには、`context` マップを使用します。この際、統合リクエストのマッピングテンプレートを使用します。これにより、バックエンドのユーザーエクスペリエンスを強化するには、キャッシュされた認証情報を使用して、シークレットキーにアクセスする必要性を抑え、リクエストごとに認可トークンを開きます。

 Lambda プロキシ統合の場合、API Gateway は、Lambda オーソライザーの `context` オブジェクトを、入力 `event` の一部としてバックエンドの Lambda 関数に直接渡します。`context` のキー/値ペアは、Lambda 関数で `$event.requestContext.authorizer.key` を呼び出して取得できます。

`{api-key}` は、API ステージの使用量プランの API キーを表します。詳細については、「[API Gateway での REST API の使用量プランと API キー](api-gateway-api-usage-plans.md)」を参照してください。

 Lambda オーソライザー例からの出力例を次に示します。この出力例には、AWS アカウント (`123456789012`) の API (`ymy8tbxw7b`) の `dev` ステージの `GET` メソッドに対する呼び出しをブロック (`Deny`) するポリシーステートメントが含まれています。

------
#### [ JSON ]

****  

```
{
  "principalId": "user",
  "policyDocument": {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Deny",
        "Resource": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/dev/GET/"
      }
    ]
  }
}
```

------