我想要解決在 AWS CloudFormation 建立或更新堆疊時,Amazon Simple Storage Service (Amazon S3) 出現的 "Access Denied" 錯誤。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱 Troubleshooting errors for the AWS CLI (對 AWS CLI 錯誤進行疑難排解)。此外,請務必使用最新版 AWS CLI。
IAM 角色或使用者政策疑難排解
請確定您用於 CreateChangeSet 或 CreateStack 的 AWS Identity and Access Management (IAM) 使用者或角色具有必要權限。您可能需要附加政策以便向 IAM 身分提供 GetObject 權限。以下範例政策包含 GetObject 權限:
{ "Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource":"arn:aws:s3:::amzn-s3-demo-bucket/*"
}
]
}
注意: 請將 amzn-s3-demo-bucket 替換為您的儲存貯體。
確認範本檔案存在且無拼字錯誤
若要檢查範本檔案是否存在且無拼字錯誤,請執行 list-objects AWS CLI 命令:
aws s3 list-objects --bucket amzn-s3-demo-bucket --prefix file-path/template-file.json
注意: 請將 amzn-s3-demo-bucket 替換為您的儲存貯體,並將 file-path/template-file.json 替換為您的檔案路徑與範本檔案。請確定範本網址中沒有多餘空格。拼字錯誤可能會導致 "S3 Access Denied" 錯誤。
確認範本檔案是否為空
如果範本檔案存在但為空,您可能會收到 "S3 Access Denied" 錯誤。若要檢查範本檔案是否為空,請執行 get-object AWS CLI 命令:
aws s3api get-object --bucket amzn-s3-demo-bucket --key key-name template-file.txt
**注意:**請將 amzn-s3-demo-bucket 替換為您的儲存貯體,將 key-name 替換為您的金鑰名稱,並將 template-file.txt 替換為您的範本檔案。
接著,開啟範本檔案。
檢查 S3 儲存貯體政策中是否有明確的 Deny 陳述式
若要檢查 S3 儲存貯體是否針對 IAM 角色包含明確的 Deny 陳述式,請完成以下步驟:
- 開啟 Amazon S3 主控台。
- 在導覽窗格中,選擇 Buckets (儲存貯體)。
- 在 Buckets (儲存貯體) 下拉式清單中,選取包含範本檔案的儲存貯體。
- 選擇 Permissions (權限) 索引標籤。
- 在 Bucket policy (儲存貯體政策) 下方,選擇 Edit (編輯)。
- 在其中搜尋包含 "Effect": "Deny" 的陳述式。
- 更新 "Effect": "Deny" 陳述式,其拒絕 IAM 角色存取 s3:GetObject 或 s3:GetObjectVersion。
- 移除您在 CloudFormation 中使用的 IAM 角色。
- 選擇 Save changes (儲存變更)。
- 再次建立或更新堆疊。
如需更多資訊,請參閱 Examples of Amazon S3 bucket policies (Amazon S3 儲存貯體政策範例)。
驗證 S3 儲存貯體的加密設定並啟用 IAM 角色的 KMS 存取權
當儲存貯體使用客戶自管 AWS Key Management Service (KMS) 金鑰啟用加密時,您可能會收到 "S3 Access Denied" 錯誤。如果您的儲存貯體已加密,請更新金鑰政策以允許 IAM 身分存取 KMS 金鑰。
請完成以下步驟:
- 開啟 AWS KMS 主控台。
- 在導覽窗格中,選擇 Customer managed keys (客戶受管金鑰)。
- 在 KMS 金鑰清單中,選取加密 S3 物件的別名或金鑰 ID,然後選擇 Key Policy (金鑰政策) 索引標籤。
- 使用以下陳述式更新政策:
{ "Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/IDENTITY"
},
"Resource": "arn:aws:kms:aa-example-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
}
注意: 請將 arn:aws:iam::111122223333:user/IDENTITY 替換為您的 IAM 使用者 Amazon Resource Name (ARN),並將 arn:aws:kms:aa-example-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd 替換為您的 KMS ARN。如果 IAM 身分位於另一個 AWS 帳戶中,請參閱 My Amazon S3 bucket has default encryption using a custom AWS KMS key.How can I allow users to download from and upload to the bucket? (我的 Amazon S3 儲存貯體使用自訂 AWS KMS 金鑰進行預設加密。我要如何允許使用者從儲存貯體下載與上傳?)
查看範本檔案的物件 ACL 權限
當目標帳戶上傳來源帳戶擁有的範本檔案時,目標帳戶中的使用者無法存取來源帳戶中的範本。若要解決此問題,請將範本檔案複製到 S3 儲存貯體,以授予儲存貯體擁有者對範本的完整存取權。
若要授予儲存貯體存取權,請執行以下 put-object AWS CLI 命令:
aws s3api put-object --bucket amzn-s3-demo-bucket --key key-name --body path-to-file --acl bucket-owner-full-control
注意: 請將 amzn-s3-demo-bucket 替換為您的儲存貯體,將 key-name 替換為您的金鑰名稱,並將 path-to-file 替換為您的檔案路徑。
如需存取控制清單 (ACL) 的更多資訊,請參閱 Controlling ownership of objects and deactivating ACLs for your bucket (控制物件擁有權與停用儲存貯體的 ACL)。