DynamoDB AccessDeniedException — "not authorized to perform dynamodb:..."

TL;DR — 你的 IAM 使用者/角色沒有對該資源執行相應 DynamoDB 操作的許可權。訊息會指明確切的 dynamodb: 操作和 ARN——把該操作針對該資源 ARN 新增到該身份的 IAM 策略中(並檢查是否存在阻斷它的 Deny 或條件)。

這是什麼意思

AccessDeniedException: User: arn:aws:iam::123456789012:user/app is not authorized to
perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:123456789012:table/Orders
because no identity-based policy allows the dynamodb:Query action

IAM 拒絕了這次呼叫。這條訊息就是一份清單:它指明瞭主體操作資源——三者都必須被允許且沒有顯式 Deny。末尾的從句指明瞭拒絕訪問的策略型別(基於身份的策略、SCP、許可權邊界、會話策略……)。DynamoDB 以 HTTP 狀態碼 400 返回它,且不可重試——在策略(或身份)改變之前,同樣的請求會一直失敗。

為什麼會發生

  • 操作未被允許——策略授予了 dynamodb:GetItem,但你呼叫的是 Query,或者根本沒有授予。
  • 資源 ARN 不匹配——策略允許 table/Orders,但你查詢的是一個索引(需要 table/Orders/index/*)或另一張表。
  • 某處存在顯式 Deny(許可權邊界、SCP 或策略本身)覆蓋了 allow。
  • 某個策略條件未被滿足(dynamodb:LeadingKeys 細粒度訪問、源 IP、MFA)。
  • 憑證不對——你擔任的角色並不是有訪問許可權的那個。

如何修正

  1. 授予訊息中指明的確切操作,針對確切的資源 ARN。查詢 GSI/LSI 時要包含索引 ARN(.../index/*)。
  2. 檢查是否存在覆蓋性的 Deny——許可權邊界和 SCP 會壓過 allow。
  3. 核實細粒度條件dynamodb:LeadingKeys 等)確實與你的請求匹配。
  4. aws sts get-caller-identity 確認身份——確保它就是你以為的那個主體。

Example policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["dynamodb:Query", "dynamodb:GetItem", "dynamodb:PutItem"],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/Orders",
        "arn:aws:dynamodb:us-east-1:123456789012:table/Orders/index/*"
      ]
    }
  ]
}

在 DynoTable 中開啟

DynoTable 解析 CLI 在每個連線上使用的相同 ~/.aws 設定檔案 (Connect an AWS account),所以當你修復 IAM 或切換時設定檔案應用程式無需重新啟動即可拾取它。按⌘P開啟設定檔案切換器並確認哪個身份處於活動狀態 - 憑證狀態點當令牌在會話中失效時,會透過內聯 重新連線 操作變為紅色。如果你的策略拒絕 dynamodb:ListTables 但允許讀取指定表, DynoTable 仍然可以直接開啟該表: ⌘K開啟表 name 跳過list呼叫,直接到桌子上的GetItem/Query 你輸入。一旦訪問成功,視覺query builder 從你的過濾藥丸中得出 Query-vs-Scan,以便你可以證明政策允許你需要的操作。如果錯誤命名為 GSI/LSI ARN,則授予 dynamodb:Query on table/YourTable/index/* — 表級索引許可權是一個常見的缺失允許看起來正確。

相關錯誤

來源

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。