如何將 API Gateway REST API 與 Amazon SQS 予以整合,並解決常見錯誤?
我要將 Amazon API Gateway REST API 與 Amazon Simple Queue Service (Amazon SQS) 予以整合,並對整合錯誤進行疑難排解。
解決方法
若要建立整合式解決方案,請將 API Gateway REST API 設定為與 Amazon SQS 搭配使用。
設定 REST API 和 Amazon SQS 整合
請完成下列步驟:
- 建立 SQS 佇列。
- 建立 AWS Identity and Access Management (IAM) 角色,然後將 Amazon SQS 政策與 SendMessage 許可連接起來。這項政策可讓您將訊息從 API 發佈到 Amazon SQS:
**注意事項:**將 example-region 取代為 AWS 區域、將 example-account-id 取代為 AWS 帳戶 ID,以及將 example-sqs-queue-name 取代為 SQS 佇列名稱。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": [ "arn:aws:sqs:example-region:example-account-id:example-sqs-queue-name" ], "Action": [ "sqs:SendMessage" ] } ] }
- 在 API Gateway 中建立 REST API。
- 在 API Gateway 主控台中,建立適用於 REST API 的 Amazon SQS 整合。
- (選用) 建立 REST API 資源或 REST API 方法:
在資源畫面上,選擇建立方法。
對於方法類型,請選擇 POST。
對於整合類型,請選擇 AWS 服務。
對於 AWS 區域,請選擇您的區域。
對於 AWS 服務,請選擇 Simple Queue Service (SQS)。
(選用) 對於 AWS 子網域,請輸入 AWS 服務使用的子網域。請檢查 AWS 服務的文件以確認子網域的可用性。對於 Amazon SQS 範例設定,請將其保留空白。
對於 HTTP 方法,請選擇 POST。
對於動作類型,請選擇使用路徑覆寫。
對於路徑覆寫 (選用),請以下列格式輸入您的帳戶 ID 和 SQS 佇列名稱:example-account-id/example-sqs-queue-name。例如: 1234567890/MySQSStandardQueue。
對於執行角色,請輸入 IAM 角色的 ARN。
對於預設逾時,請選擇設定的選項。
繼續輸入 REST API 整合資訊。
選擇 POST 方法整合請求。
選擇編輯。
對於請求內文傳遞,請選取適用於需求的選項。
展開 URL 請求標頭參數。
選擇新增請求標頭參數。
對於名稱,請輸入 Content-Type。
對於映射來源,請輸入 'application/x-www-form-urlencoded'。
然後,展開映射範本。
選擇新增映射範本。
對於 Content-Type,請輸入 application/json。
對於範本,請輸入 Action=SendMessage&MessageBody=$input.body,然後選擇儲存。 - 部署 REST API。
- 若要測試設定,請將下列請求傳送至 API Gateway:
**注意事項:**將 example-api-id 取代為 API ID、將 example-region 取代為區域、將 example-stage 取代為測試階段名稱,並且將 example-resource 取代為資源名稱。curl --location --request POST 'https://example-api-id.execute-api.example-region.amazonaws.com/example-stage/example-resource' --header 'Content-Type: application/json' --data-raw '{ "message": "Hello World" }'
整合成功時,您的回應看起來類似於下列內容:{ "SendMessageResponse": { "ResponseMetadata": { "RequestId": "f879fb11-e736-52c0-bd29-a0f2d09ad90d" }, "SendMessageResult": { "MD5OfMessageAttributes": null, "MD5OfMessageBody": "3fc759ac1733366f98ec4270c788fcd1", "MD5OfMessageSystemAttributes": null, "MessageId": "4c360c3c-08f4-4392-bc14-8b0c88e314a2", "SequenceNumber": null } } }
解決常見錯誤
若要對常見錯誤進行疑難排解,請根據您收到的錯誤訊息完成任務。
UnknownOperationException 錯誤
您未將 Content-Type 設定為整合請求 HTTP 標頭中的 "application/x-www-form-urlencoded" 時,即會發生 UnknownOperationException 錯誤。您未將 SendMessage 動作新增至整合請求映射範本時,也會發生 UnknownOperationException 錯誤。若要解決此錯誤,請確定 Content-Type 是否已正確格式化,並在映射範本中包含 SendMessage 動作。
AccessDenied 錯誤
下列內容是 AccessDenied 錯誤的範例:
{
"Error": {
"Code": "AccessDenied",
"Message": "Access to the resource https://sqs.example-region.amazonaws.com/example-account-id/example-sqs-queue-name is denied.",
"Type": "Sender"
},
"RequestId": "92aea8b7-47f1-5bd4-b3c4-f3d0688d3809" }
API 整合執行角色未設定將訊息傳送至 SQS 佇列的 sqs:SendMessage 許可時,即會發生 AccessDenied 錯誤。在請求內容承載中傳遞例如 "&" 和 "%" 的特殊字元時,也會出現 AccessDenied 錯誤。您必須對要傳遞的特殊字元進行編碼。在映射範本中新增 $util.urlEncode() 函數,以將請求內文從字串轉換為編碼格式。下列內容為映射範本的範例:
Action=SendMessage&MessageBody=$util.urlEncode($input.body)
下列範例包含傳送訊息至 SQS 佇列的必要許可:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": [ "arn:aws:sqs:example-region:example-account-id:example-sqs-queue-name" ], "Action": [ "sqs:SendMessage" ] } ] }
**注意事項:**將 example-region 取代為區域、將 example-account-id 取代為帳戶 ID,並且將 example-sqs-queue-name 取代為 SQS 佇列名稱。
KMS.AccessDeniedException 錯誤
下列內容是 KMS.AccessDeniedException 錯誤的兩種範例:
{
"Error": {
"Code": "KMS.AccessDeniedException",
"Message": "User: arn:aws:sts::example-account-number:assumed-role/example-sqs-queue-name/BackplaneAssumeRoleSession is not authorized to perform: kms:GenerateDataKey on resource: arn:aws:kms:example-region:example-account-number:key/example-keyId because no identity-based policy allows the kms:GenerateDataKey action (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: c58f1eec-6b18-4029-826b-d05d6a715716;
Proxy: null)",
"Type": "Sender"
},
"RequestId": "99976a6a-3311-57e9-86e9-310d0654ff80"
}
{
"Error": {
"Code": "KMS.AccessDeniedException",
"Message": "The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.(Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: a8adea02-c246-49d9-8b3d-ff6b6a43b40f;
Proxy: null)",
"Type": "Sender"
},
"RequestId": "9565c451-742c-55f3-a1eb-9f3641fd30aa"
}
API 整合執行角色無法透過 AWS Key Management Service (AWS KMS) 執行操作時,即會出現 KMS.AccessDeniedException 錯誤。您必須設定許可,對連接至 Amazon SQS 伺服器端加密佇列的 AWS KMS 金鑰執行操作。
下列範例包括對連接至 SQS 佇列的 KMS 金鑰執行操作的必要許可:
{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::example-account-id:role/example-api-gw-integration-execution-role" }, "Action": [ "kms:Encrypt", "kms:GenerateDataKey*", "kms:Decrypt" ], "Resource": "*" }
**注意事項:**將 example-account-id 取代為帳戶 ID,並且將 example-api-gw-integration-execution-role 取代為執行角色名稱。
相關資訊
相關內容
- 已提問 4 天前lg...
- 已提問 2 年前lg...
- 已提問 16 天前lg...
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 10 個月前