如何解決執行 Amazon SQS API 呼叫產生的「AccessDenied」或「AccessDeniedException」錯誤?

2 分的閱讀內容
0

我執行了 Amazon Simple Queue Service (Amazon SQS) API 呼叫,收到了「AccessDenied」錯誤。

簡短說明

當我執行 Amazon SQS API 呼叫時,收到類似下列內容的「AccessDenied」或「AccessDeniedException」錯誤:

「呼叫 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 命令列介面 (AWS CLI) 命令時收到錯誤訊息,請參閱 AWS CLI 錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

  • SQS 存取政策或 AWS 身分與存取管理 (IAM) 政策必須包含明確允許存取動作的權限。

  • 最佳實務是僅針對執行工作所需的權限授與最低權限。如需詳細資訊,請參閱套用最低權限許可

  • 如果 SQS 佇列位於不同的帳戶中,則 SQS 存取政策和 IAM 政策都必須明確允許存取。

    重要: 任一政策中的明確拒絕會覆寫明確允許。

  • 如果政策使用條件元素,請檢查條件是否限制存取。

  • 如果使用者或角色位於使用 SCP 的 AWS Organizations 組織中,請確認 SCP 未封鎖使用者或角色。

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

aws sts get-caller-identity

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

AWS Key Management Service (AWS KMS) 權限

如果您的 Amazon SQS 佇列已開啟伺服器端加密 (SSE),則必須同時向生產者及消費者授予權限。所需權限會隨 AWS 受管 AWS KMS 金鑰或客戶受管金鑰一起提供。客戶受管金鑰政策必須包含每個佇列產生者和消費者的存取權限。或者,更新 IAM 政策以包含 AWS KMS 金鑰所需的 AWS KMS 權限。

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

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

VPC 端點政策

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

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

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

**注意:**您只能將 VPC 與 HTTPS Amazon SQS 端點搭配使用

SQS 主控台權限

若要從 SQS 主控台檢視 SQS 佇列和屬性,使用者必須擁有 ListQueuesGetQueueAttributes 動作的權限:

{
  "Sid": "Statement1",
  "Effect": "Allow",
  "Action": [
    "sqs:ListQueues",
    "sqs:GetQueueAttributes"
  ],
  "Resource": "*"
}

**注意:**您無法對特定佇列使用 ListQueues API 動作。ListQueues API 必須套用至「*」資源或「arn:aws:sqs:region:account_id:*」。

拒絕所有佇列政策

如果新增類似下列範例的拒絕所有政策,您可能會失去 SQS 佇列的存取權:

{
  "Sid": "deny-sqs-actions",
  "Effect": "Deny",
  "Principal": "*",
  "Action": "SQS:*",
  "Resource": "queueName"
}

如果您失去 SQS 佇列的存取權,則使用根使用者憑證來存取佇列並移除拒絕所有政策。如需詳細資訊,請參閱使用拒絕佇列政策時如何疑難排解和防止 Amazon SQS 佇列存取問題?

相關資訊

教學課程: 從 Amazon Virtual Private Cloud 傳送訊息至 Amazon SQS 佇列

Amazon SQS API 權限: 動作和資源參考

AWS 官方
AWS 官方已更新 6 個月前