我想解决我在 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 身份提供 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 替换为您的文件路径和模板文件。确保模板 URL 不包含额外的空格。拼写错误可能会导致“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 存储桶策略中是否存在显式拒绝语句
要检查 S3 存储桶是否有针对 IAM 角色的显式拒绝语句,请完成以下步骤:
- 打开 Amazon S3 控制台。
- 在导航窗格中,选择 Buckets(存储桶)。
- 在 Buckets(存储桶)下拉列表中,选择包含模板文件的存储桶。
- 选择 Permissions(权限)选项卡。
- 在 Bucket policy(存储桶策略)下,选择 Edit(编辑)。
- 搜索包含 "Effect": "Deny" 的语句。
- 更新 "Effect": "Deny" 语句,这些语句会拒绝 IAM 角色对 s3:GetObject 或 s3:GetObjectVersion 的访问。
- 删除您用于 CloudFormation 的 IAM 角色。
- 选择 Save changes(保存更改)。
- 再次创建或更新堆栈。
有关详细信息,请参阅 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 资源名称 (ARN),将 arn:aws:kms:aa-example-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd 替换为您的 KMS ARN。如果 IAM 身份位于另一个 AWS 账户中,请参阅我的 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) 的详细信息,请参阅控制对象的所有权和停用存储桶的 ACL。