API 閘道映射範本和存取日誌變數參考 - Amazon API Gateway

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

API 閘道映射範本和存取日誌變數參考

本節提供 Amazon API Gateway 定義用於資料模型、授權方、映射範本和 CloudWatch 存取日誌的變數和函數參考資訊。如需如何使用這些變數和函數的詳細資訊,請參閱的映射範本 REST APIs。如需 Velocity 範本語言 (VTL) 的詳細資訊,請參閱VTL參考

注意

若為 $method$integration 變數,請參閱 Amazon API Gateway API請求和回應資料映射參考

$context 資料模型、授權方、映射範本和 CloudWatch 存取記錄的變數

下列$context變數可用於資料模型、授權方、映射範本和 CloudWatch 存取日誌。API Gateway 可能會新增其他內容變數。

如需只能在 CloudWatch 存取日誌中使用的$context變數,請參閱 僅適用於存取記錄的 $context 變數

參數 描述
$context.accountId

API 擁有者 AWS 的帳戶 ID。

$context.apiId

識別碼 API Gateway 會指派給您的 API。

$context.authorizer.claims.property

成功驗證方法發起人之後,從 Amazon Cognito 使用者集區傳回之宣告的屬性。如需詳細資訊,請參閱 使用 Amazon Cognito 使用者集區做為授權者來控制對 REST API 的存取

注意

呼叫 $context.authorizer.claims 會傳回 null。

$context.authorizer.principalId

與用戶端傳送並從 API Gateway Lambda 授權方 (先前稱為自訂授權方) 傳回之權杖相關聯的主要使用者身分。如需詳細資訊,請參閱使用 API Gateway Lambda 授權方

$context.authorizer.property

從 API Gateway Lambda 授權方函數傳回的context對應指定鍵值對的字串值。例如,如果授權方傳回下列 context 映射:

"context" : { "key": "value", "numKey": 1, "boolKey": true }

呼叫$context.authorizer.key會傳回"value"字串,呼叫會$context.authorizer.numKey傳回"1"字串,而呼叫會$context.authorizer.boolKey傳回"true"字串。

用於 property,唯一支援的特殊字元是底線(_)字元。

如需詳細資訊,請參閱使用 API Gateway Lambda 授權方

$context.awsEndpointRequestId

AWS 端點的請求 ID。

$context.deploymentId

API 部署的 ID。

$context.domainName

用來叫用 的完整網域名稱API。這應該與傳入的 Host 標頭相同。

$context.domainPrefix

$context.domainName 的第一個標籤。

$context.error.message

包含API閘道錯誤訊息的字串。此變數只能用於GatewayResponse內文映射範本中的簡單變數取代,該範本不會由 Velocity 範本語言引擎和存取日誌中處理。如需詳細資訊,請參閱 使用 CloudWatch 指標監控 WebSocket API執行設定閘道回應以自訂錯誤回應

$context.error.messageString $context.error.message 的引用值,即 "$context.error.message"
$context.error.responseType

一種 類型GatewayResponse。此變數只能用於GatewayResponse內文映射範本中的簡單變數取代,該範本不會由 Velocity 範本語言引擎和存取日誌中處理。如需詳細資訊,請參閱 使用 CloudWatch 指標監控 WebSocket API執行設定閘道回應以自訂錯誤回應

$context.error.validationErrorString

字串,其中包含詳細的驗證錯誤訊息。

$context.extendedRequestId API Gateway 產生並指派給API請求的延伸 ID。延伸請求 ID 包含有助於偵錯和疑難排解的資訊。
$context.httpMethod

使用HTTP的方法。有效值包含:DELETEGETHEADOPTIONSPATCHPOSTPUT

$context.identity.accountId

與請求相關聯的 AWS 帳戶 ID。

$context.identity.apiKey

對於需要API金鑰API的方法,此變數是與方法請求相關聯的API金鑰。對於不需要API金鑰的方法,此變數為 null。如需詳細資訊,請參閱API Gateway RESTAPIs中 的使用計劃和API金鑰

$context.identity.apiKeyId 與需要API金鑰之API請求相關聯的API金鑰 ID。
$context.identity.caller

已簽署請求之發起人的主體識別符。支援使用IAM授權的資源。

$context.identity.cognitoAuthenticationProvider

發出請求的呼叫者使用的所有 Amazon Cognito 身分驗證提供者的逗號分隔清單。僅在使用 Amazon Cognito 登入資料簽署請求時才可使用。

例如,適用於 Amazon Cognito 使用者集區的身分,cognito-idp. region.amazonaws.com/user_pool_id,cognito-idp.region.amazonaws.com/user_pool_id:CognitoSignIn:token subject claim

如需可用 Amazon Cognito 身分驗證提供者的相關資訊,請參閱 Amazon Cognito 開發人員指南 中的使用聯合身分

$context.identity.cognitoAuthenticationType

提出請求的發起人的 Amazon Cognito 身分驗證類型。僅在使用 Amazon Cognito 登入資料簽署請求時才可使用。可能的值包括用於已驗證身分的 authenticated 和未經驗證身分的 unauthenticated

$context.identity.cognitoIdentityId

提出請求的發起人的 Amazon Cognito 身分 ID。僅在使用 Amazon Cognito 登入資料簽署請求時才可使用。

$context.identity.cognitoIdentityPoolId

提出請求的發起人的 Amazon Cognito 身分集區 ID。僅在使用 Amazon Cognito 登入資料簽署請求時才可使用。

$context.identity.principalOrgId

AWS 組織 ID

$context.identity.sourceIp

立即TCP連線的來源 IP 地址,向API閘道端點發出請求。

$context.identity.clientCert.clientCertPem

用戶端在相互TLS身分驗證期間提供的 PEM編碼用戶端憑證。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會出現此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。

$context.identity.clientCert.subjectDN

用戶端提供之憑證主體的辨別名稱。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會顯示此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。

$context.identity.clientCert.issuerDN

用戶端提供之憑證發行者的辨別名稱。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會顯示此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。

$context.identity.clientCert.serialNumber

憑證的序號。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會顯示此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。

$context.identity.clientCert.validity.notBefore

憑證無效之前的日期。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會顯示此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。

$context.identity.clientCert.validity.notAfter

憑證無效之後的日期。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會顯示此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。

$context.identity.vpcId

向API閘道端點VPC提出請求的 VPC ID。

$context.identity.vpceId

向API閘道VPC端點發出請求的VPC端點的端點 ID。僅當您擁有私有 時才會顯示API。

$context.identity.user

將針對資源存取授權之使用者的主體識別符。支援使用IAM授權的資源。

$context.identity.userAgent

API 呼叫者的User-Agent標頭。

$context.identity.userArn

驗證後識別的有效使用者的 Amazon Resource Name (ARN)。如需詳細資訊,請參閱https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html

$context.isCanaryRequest

true 如果請求導向 Canary,且false請求未導向 Canary,則傳回 。只有在啟用 Canary 時才會顯示。

$context.path 請求路徑。例如,對於 的非代理請求URLhttps://{rest-api-id}.execute-api.{region}.amazonaws.com/{stage}/root/child$context.path值為 /{stage}/root/child
$context.protocol 請求通訊協定,例如 HTTP/1.1
注意

API Gateway APIs可接受 HTTP/2 請求,但 API Gateway 會使用 HTTP/1.1 將請求傳送至後端整合。因此,即使用戶端傳送使用 HTTP/2 的請求,請求通訊協定也會記錄為 HTTP/1.1。

$context.requestId

請求的 ID。用戶端可以覆寫此請求 ID。$context.extendedRequestId 用於 API Gateway 產生的唯一請求 ID。

$context.requestOverride.header.header_name

請求標題會覆寫。如果定義了此參數,則它包含要使用的標頭,而不是在整合請求窗格中定義的HTTP標頭。如需詳細資訊,請參閱使用映射範本覆寫 API的請求和回應參數和狀態碼

$context.requestOverride.path.path_name

請求路徑會覆寫。如果定義了此參數,則它包含要使用的請求路徑,而不是整合請求窗格中定義的URL路徑參數。如需詳細資訊,請參閱使用映射範本覆寫 API的請求和回應參數和狀態碼

$context.requestOverride.querystring.querystring_name

請求查詢字串會覆寫。如果定義了此參數,則包含要使用的請求查詢字串,而不是整合請求窗格中定義的URL查詢字串參數。如需詳細資訊,請參閱使用映射範本覆寫 API的請求和回應參數和狀態碼

$context.responseOverride.header.header_name 回應標題會覆寫。如果此參數已經定義,它包含要傳回的標頭 (而不是在 Integration Response (整合回應) 窗格中定義為 Default mapping (預設映射)Response header (回應標頭))。如需詳細資訊,請參閱 使用映射範本覆寫 API的請求和回應參數和狀態碼
$context.responseOverride.status 回應狀態碼會覆寫。如果此參數已經定義,它包含要傳回的狀態碼 (而不是在 Integration Response (整合回應) 窗格中定義為 Default mapping (預設映射)Method response status (方法回應狀態))。如需詳細資訊,請參閱使用映射範本覆寫 API的請求和回應參數和狀態碼
$context.requestTime CLF格式化請求時間 (dd/MMM/yyyy:HH:mm:ss +-hhmm)。
$context.requestTimeEpoch Epoch 格式化的要求時間,以毫秒為單位。
$context.resourceId

API Gateway 指派給資源的識別碼。

$context.resourcePath

您資源的路徑。例如,對於 的非代理請求URIhttps://{rest-api-id}.execute-api.{region}.amazonaws.com/{stage}/root/child,值$context.resourcePath/root/child。如需詳細資訊,請參閱教學課程:RESTAPI使用HTTP非代理整合建立

$context.stage

API 請求的部署階段 (例如 BetaProd)。

$context.wafResponseCode

AWS WAF 收到的回應:WAF_ALLOWWAF_BLOCK。如果階段未與 Web 建立關聯,則不會設定 ACL。如需詳細資訊,請參閱用 AWS WAF 於在 API Gateway 中保護您的其餘 API

$context.webaclArn

ACL 用來決定是否允許或封鎖請求ARN的 Web 完整。如果階段未與 Web 建立關聯,則不會設定 ACL。如需詳細資訊,請參閱用 AWS WAF 於在 API Gateway 中保護您的其餘 API

$context 變數範本範例

如果您的API方法將結構化資料傳遞至需要資料以特定格式顯示的後端,您可能想要在映射範本中使用$context變數。

以下範例顯示一個映射範本,其會將傳入的 $context 變數映射至整合請求承載中名稱稍有不同的後端變數:

注意

其中一個變數是API金鑰。此範例假設 方法需要 API金鑰。

{ "stage" : "$context.stage", "request_id" : "$context.requestId", "api_id" : "$context.apiId", "resource_path" : "$context.resourcePath", "resource_id" : "$context.resourceId", "http_method" : "$context.httpMethod", "source_ip" : "$context.identity.sourceIp", "user-agent" : "$context.identity.userAgent", "account_id" : "$context.identity.accountId", "api_key" : "$context.identity.apiKey", "caller" : "$context.identity.caller", "user" : "$context.identity.user", "user_arn" : "$context.identity.userArn" }

此映射範本的輸出應如下所示:

{ stage: 'prod', request_id: 'abcdefg-000-000-0000-abcdefg', api_id: 'abcd1234', resource_path: '/', resource_id: 'efg567', http_method: 'GET', source_ip: '192.0.2.1', user-agent: 'curl/7.84.0', account_id: '111122223333', api_key: 'MyTestKey', caller: 'ABCD-0000-12345', user: 'ABCD-0000-12345', user_arn: 'arn:aws:sts::111122223333:assumed-role/Admin/carlos-salazar' }

僅適用於存取記錄的 $context 變數

以下 $context 變數僅適用於存取記錄。如需詳細資訊,請參閱在 API Gateway RESTAPIs中設定 CloudWatch 的記錄。(如需 WebSocket APIs,請參閱 使用 CloudWatch 指標監控 WebSocket API執行。)

參數 描述
$context.authorize.error 授權錯誤訊息。
$context.authorize.latency 授權延遲 (以毫秒為單位)。
$context.authorize.status 從授權嘗試傳回的狀態碼。
$context.authorizer.error 從授權方傳回的錯誤訊息。
$context.authorizer.integrationLatency 以毫秒為單位的授權方整合延遲。
$context.authorizer.integrationStatus 從 Lambda 授權方傳回的狀態碼。
$context.authorizer.latency 授權方延遲 (以毫秒為單位)。
$context.authorizer.requestId AWS 端點的請求 ID。
$context.authorizer.status 從授權方傳回的狀態碼。
$context.authenticate.error 從驗證嘗試傳回的錯誤訊息。
$context.authenticate.latency 驗證延遲 (以毫秒為單位)。
$context.authenticate.status 從驗證嘗試傳回的狀態碼。
$context.customDomain.basePathMatched

傳入請求相符的API映射路徑。當用戶端使用自訂網域名稱存取 時適用API。例如,如果用戶端將請求傳送至 https://api.example.com/v1/orders/1234,且請求符合與路徑 的API映射v1/orders,則值為 v1/orders。如需進一步了解,請參閱 將API階段映射至 的自訂網域名稱 REST APIs

$context.endpointType

的端點類型API。

$context.integration.error 從整合傳回的錯誤訊息。
$context.integration.integrationStatus 對於 Lambda 代理整合,從 傳回的狀態碼 AWS Lambda,而不是後端 Lambda 函數碼。
$context.integration.latency 整合延遲 (以毫秒為單位)。等同於 $context.integrationLatency
$context.integration.requestId AWS 端點的請求 ID。等同於 $context.awsEndpointRequestId
$context.integration.status 從整合傳回的狀態碼。對於 Lambda 代理整合而言,這是您的 Lambda 函數程式碼傳回的狀態碼。
$context.integrationLatency 整合延遲 (以毫秒為單位)。
$context.integrationStatus 對於 Lambda 代理整合,此參數代表從 傳回的狀態碼 AWS Lambda,而不是後端 Lambda 函數碼。
$context.responseLatency 回應延遲 (以毫秒為單位)。
$context.responseLength 回應承載長度 (以位元組為單位)。
$context.status 方法回應狀態。
$context.waf.error 從 傳回的錯誤訊息 AWS WAF。
$context.waf.latency 以毫秒為單位的 AWS WAF 延遲。
$context.waf.status 從 傳回的狀態碼 AWS WAF。
$context.xrayTraceId

X-Ray 追蹤的追蹤 ID。如需詳細資訊,請參閱 AWS X-Ray 使用 API Gateway REST API 進行設定

$input 變數

$input 變數代表映射範本要處理的方法請求承載和參數。它提供下列函數:

變數和函數 描述
$input.body

傳回原始請求承載做為字串。您可以使用 $input.body 來保留整個浮點數,例如 10.00

$input.json(x)

此函數會評估JSONPath運算式,並將結果傳回為JSON字串。

例如, 會$input.json('$.pets')傳回代表pets結構的JSON字串。

如需 的詳細資訊JSONPath,請參閱 Java 的 JSONPathJSONPath

$input.params()

傳回所有請求參數的映射。我們建議您使用 $util.escapeJavaScript 清理結果,以避免潛在的注入攻擊。為了完全控制請求清理,請使用沒有模板的代理整合,並處理整合中的請求清理。

$input.params(x)

從路徑、查詢字串或標頭值 (以此順序搜尋) 傳回方法請求參數值,而參數名稱字串為 x。我們建議您使 $util.escapeJavaScript 用清理參數,以避免潛在的注入攻擊。為了完全控制參數清理,請使用沒有模板的代理整合,並處理整合中的請求清理。

$input.path(x)

使用JSONPath運算式字串 (x),並傳回結果的JSON物件表示法。這可讓您以 Apache Velocity 範本語言 (VTL) 原生方式存取和操作承載的元素。

例如,如果表達式 $input.path('$.pets') 傳回如下物件:

[ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]

$input.path('$.pets').size() 會傳回 "3"

如需 的詳細資訊JSONPath,請參閱 Java 的 JSONPathJSONPath

$input 變數範本範例

下列範例示範如何在映射範本中使用$input變數。您可以使用模擬整合或 Lambda 非代理整合,將輸入事件傳回給 API Gateway,以嘗試這些範例。

參數對應範本範例

下列範例會透過JSON承載將所有請求參數傳遞至整合端點header,包括 querystringpath和 :

#set($allParams = $input.params()) { "params" : { #foreach($type in $allParams.keySet()) #set($params = $allParams.get($type)) "$type" : { #foreach($paramName in $params.keySet()) "$paramName" : "$util.escapeJavaScript($params.get($paramName))" #if($foreach.hasNext),#end #end } #if($foreach.hasNext),#end #end } }

對於包含下列輸入參數的請求:

  • 名為 的路徑參數 myparam

  • 查詢字串參數 querystring1=value1,value2&querystring2=value3

  • 標頭 "header1" : "value1""header2" : "value2""header3" : "value3"

此映射範本的輸出應如下所示:

{ "params" : { "path" : { "path" : "myparam" } , "querystring" : { "querystring1" : "value1,value2" , "querystring2" : "value3" } , "header" : { "header3" : "value3" , "header2" : "value2" , "header1" : "value1" } } }

JSON 映射範本範例

建議您使用 $input 變數來取得查詢字串和請求內文,而不論是否使用模型。您可能也想要取得 參數和承載,或承載的子區段。下列三個範例示範如何執行此操作。

下列範例使用映射範本來取得承載的子區段。此範例會取得輸入參數name,然後取得整個POST內文:

{ "name" : "$input.params('name')", "body" : $input.json('$') }

對於包含查詢字串參數name=Bella&type=dog和下列內文的請求:

{ "Price" : "249.99", "Age": "6" }

此映射範本的輸出應如下所示:

{ "name" : "Bella", "body" : {"Price":"249.99","Age":"6"} }

如果JSON輸入包含 無法剖析的未逸出字元 JavaScript,APIGateway 可能會傳回 400 回應。套用$util.escapeJavaScript($input.json('$'))以確保JSON輸入可以正確剖析。

$util.escapeJavaScript($input.json('$')) 套用的上一個範例如下所示:

{ "name" : "$input.params('name')", "body" : $util.escapeJavaScript($input.json('$')) }

在此情況下,此映射範本的輸出應如下所示:

{ "name" : "Bella", "body": {\"Price\":\"249.99\",\"Age\":\"6\"} }

JSONPath 表達式範例

下列範例示範如何將JSONPath運算式傳遞至 json() 方法。您也可以使用句點 .來指定 屬性,以讀取請求主體物件的子區段:

{ "name" : "$input.params('name')", "body" : $input.json('$.Age') }

對於包含查詢字串參數name=Bella&type=dog和下列內文的請求:

{ "Price" : "249.99", "Age": "6" }

此映射範本的輸出應如下所示:

{ "name" : "Bella", "body" : "6" }

如果方法請求承載包含 無法剖析的未逸出字元 JavaScript,APIGateway 可能會傳回400回應。套用$util.escapeJavaScript()以確保JSON輸入可以正確剖析。

$util.escapeJavaScript($input.json('$.Age')) 套用的上一個範例如下所示:

{ "name" : "$input.params('name')", "body" : "$util.escapeJavaScript($input.json('$.Age'))" }

在此情況下,此映射範本的輸出應如下所示:

{ "name" : "Bella", "body": "\"6\"" }

請求和回應範例

下列範例$input.json()針對路徑為 的資源使用 $input.params()$input.path()、 和 /things/{id}

{ "id" : "$input.params('id')", "count" : "$input.path('$.things').size()", "things" : $input.json('$.things')" }

對於包含路徑參數123和下列內文的請求:

{ "things": { "1": {}, "2": {}, "3": {} } }

此映射範本的輸出應如下所示:

{"id":"123","count":"3","things":{"1":{},"2":{},"3":{}}}

如果方法請求承載包含 無法剖析的未逸出字元 JavaScript,APIGateway 可能會傳回400回應。套用$util.escapeJavaScript()以確保JSON輸入可以正確剖析。

$util.escapeJavaScript($input.json('$.things')) 套用的上一個範例如下所示:

{ "id" : "$input.params('id')", "count" : "$input.path('$.things').size()", "things" : "$util.escapeJavaScript($input.json('$.things'))" }

此映射範本的輸出應如下所示:

{"id":"123","count":"3","things":"{\"1\":{},\"2\":{},\"3\":{}}"}

如需其他映射範例,請參閱「的映射範本 REST APIs」。

$stageVariables

階段變數可用於參數映射和映射範本,以及作為方法整合中ARNs和URLs方法整合中使用的預留位置。如需詳細資訊,請參閱RESTAPI在API閘道中使用階段變數

語法 描述
$stageVariables.<variable_name>$stageVariables['<variable_name>']${stageVariables['<variable_name>']}

<variable_name> 代表階段變數名稱。

$util 變數

$util 變數包含要在映射範本中使用的公用程式函數。

注意

除非另有說明,否則預設字元集為 UTF-8。

函式 描述
$util.escapeJavaScript()

使用字串規則逸出 JavaScript 字串中的字元。

注意

此函數會將任何一般單引號 (') 轉換為逸出單引號 (\')。不過,逸出的單一引號在 中無效JSON。因此,在 JSON 屬性中使用來自此函數的輸出時,您必須將任何逸出的單引號 (\') 轉回一般單引號 ()'。下列範例顯示這種情況:

"input" : "$util.escapeJavaScript(data).replaceAll("\\'","'")"
$util.parseJson()

採取 "stringified" JSON並傳回結果的物件表示法。您可以使用此函數的結果,以 Apache Velocity 範本語言 () 原生方式存取和操作承載的元素VTL。例如,如果您有下列承載:

{"errorMessage":"{\"key1\":\"var1\",\"key2\":{\"arr\":[1,2,3]}}"}

並使用下列映射範本

#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage'))) { "errorMessageObjKey2ArrVal" : $errorMessageObj.key2.arr[0] }

您將會收到下列輸出:

{ "errorMessageObjKey2ArrVal" : 1 }
$util.urlEncode()

將字串轉換為「application/x-www-form-urlencoded」格式。

$util.urlDecode()

解碼「應用程式/x-www-form-urlencoded」字串。

$util.base64Encode()

將資料編碼為 base64 編碼字串。

$util.base64Decode()

解碼 base64 編碼字串中的資料。