如何對在 Amazon SQS API 呼叫時的 AccessDenied 錯誤進行疑難排解?

上次更新日期:2021 年 9 月 3 日

我在執行 Amazon Simple Queue Service (Amazon SQS) API 呼叫時,收到類似下列其中一項的 AccessDenied 錯誤:

「在呼叫 SendMessage 操作時發生錯誤 (AccessDenied):拒絕存取資源 https://sqs.us-east-1.amazonaws.com/。」

「在呼叫 SendMessage 操作時發生錯誤 (KMS.AccessDeniedException):未授權使用者 arn:aws:iam::xxxxx:user/xxxx 對資源 arn:aws:kms:us-east-1:xxxx:key/xxxx 執行 kms:GenerateDataKey,且明確拒絕」

如何對此問題進行疑難排解?

解決方案

Amazon SQS 存取政策和 IAM 政策

注意:如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本

  • SQS 存取政策或 AWS Identity and Access Management (IAM) 政策必須包含許可,才能明確允許存取此動作。
  • 如果 SQS 佇列在不同的帳戶中,則 SQS 存取政策和 IAM 政策都必須明確允許存取。
    重要
    :任一政策中的明確拒絕會覆寫明確允許。
  • 如果原則使用條件元素,請驗證條件是否限制存取。
  • 如果使用者或角色在使用服務控制政策 (SCP) 的 AWS Organizations 組織中,請驗證 SCP 未封鎖使用者或角色。

若要確認用來進行 API 呼叫的 IAM 身分,請執行以下 get-caller-identity AWS CLI 命令:

aws sts get-caller-identity

如需 Amazon SQS 存取許可的詳細資訊,請參閱存取 Amazon SQS 佇列需要哪些許可?

KMS 許可

如果 Amazon SQS 佇列已開啟伺服器端加密 (SSE),則必須同時授與生產者和取用者許可。所需的許可可以由 AWS 受管 AWS KMS 金鑰或客戶受管金鑰提供。客戶受管金鑰政策必須包含每個佇列產生者和取用者的存取許可。或者,您可以更新 IAM 政策以包含 KMS 金鑰所需的 KMS 許可。

  • 所需的生產者許可:kms:GenerateDataKey 和 kms:Decrypt
  • 所需的取用者許可:kms:Decrypt

若要從其他帳戶存取 SSE Amazon SQS 佇列,佇列必須使用客戶受管金鑰。您無法使用 AWS 受管金鑰,因為只能修改客戶受管金鑰政策。KMS 金鑰政策必須允許跨帳戶存取 KMS 金鑰,而 IAM 政策必須包含存取 KMS 金鑰的許可。

如需詳細資訊,請參閱金鑰管理

VPC 端點政策

如果您透過 Amazon Virtual Private Cloud (Amazon VPC) 端點存取 SQS,則 SQS VPC 端點政策必須允許存取。

以下範例 VPC 端點政策指定允許 IAM 使用者 MyUser 將訊息傳送至 SQS 佇列 MyQueue。透過 VPC 端點拒絕存取其他動作、IAM 使用者和 SQS 資源。

{
   "Statement": [{
      "Action": ["sqs:SendMessage"],
      "Effect": "Allow",
      "Resource": "arn:aws:sqs:us-east-2:123456789012:MyQueue",
      "Principal": {
        "AWS": "arn:aws:iam:123456789012:user/MyUser"
      }
   }]
}

此文章是否有幫助?


您是否需要帳單或技術支援?