我想解决我在 AWS CloudFormation 中创建或更新堆栈时遇到的 Amazon Simple Storage Service (Amazon S3)“Access Denied(访问被拒绝)”错误。
解决方案
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅对 AWS CLI 错误进行故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
对 IAM 角色或用户策略进行故障排除
查看您用于 CreateChangeSet 或 CreateStack 的 AWS Identity and Access Management (IAM) 身份。确保 IAM 用户或角色拥有必要的权限。如有必要,可附加向 IAM 身份提供 GetObject 权限的策略。以下示例策略包含 GetObject 权限:
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}
]
}
验证模板文件是否存在且不包含拼写错误
要检查模板文件是否存在且不包含拼写错误,请完成以下步骤:
验证为嵌套堆栈指定的模板 URL 是否有效。运行 list-objects AWS CLI 命令以列出对象:
aws s3 list-objects --bucket DOC-EXAMPLE-BUCKET --prefix file-path/template-file.json
确保模板 URL 不包含任何额外的空格。拼写错误可能会导致 S3 Access Denied(S3 访问被拒绝)错误。
检查 S3 存储桶策略中是否存在显式拒绝语句
要检查 S3 存储桶是否有针对 IAM 角色的显式拒绝语句,请完成以下步骤:
- 打开 Amazon S3 控制台。
- 从存储桶列表中,打开包含模板文件的存储桶。
- 选择 Permissions(权限)选项卡。
- 导航到存储桶策略分段。
- 搜索包含 "Effect": "Deny" 的语句。
- 编辑存储桶策略以更新任何 "Effect": "Deny" 语句,这些语句拒绝对 s3:GetObject 或 s3:GetObjectVersion 的 IAM 角色访问权限。
- 移除用于 CloudFormation 的 IAM 角色。
- 选择 Save(保存)。
- 再次创建或更新堆栈。
有关 S3 存储桶策略的详细信息,请参阅存储桶策略示例。
验证 S3 存储桶上的加密设置并激活 IAM 角色的 KMS 访问权限
当存储桶使用客户自主管理型 AWS Key Management Service (KMS) 密钥激活加密时,您可能会看到 S3 Access Denied(S3 访问被拒绝)错误。如果存储桶已加密,请更新密钥策略以允许 IAM 身份访问 KMS 密钥。
完成以下步骤:
- 打开 AWS KMS 控制台。
- 找到用于加密 S3 存储桶中对象的密钥,然后选择 Key Policy(密钥策略)选项卡。
- 使用以下语句更新策略:
{
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/IDENTITY"
},
"Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
}
**注意:**如果 IAM 身份位于另一个 AWS 账户中,请参阅我的 Amazon S3 存储桶默认使用自定义 AWS KMS 密钥进行加密。如何允许用户在存储桶中上传和下载内容?
检查模板文件的对象 ACL 权限
有时,模板文件可能是从其他账户上传的,但源账户拥有该文件。此操作会拒绝目标账户中的用户访问源账户中的模板。要解决此问题,请将模板文件复制到 S3 存储桶,以授予存储桶所有者对该模板的完全访问权限。
运行以下 put-object AWS CLI 命令以授予对存储桶的访问权限:
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key key-name --body path-to-file --acl bucket-owner-full-control
有关访问控制列表 (ACL) 的详细信息,请参阅控制对象的所有权和禁用存储桶的 ACL。