使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

为什么我会收到 CloudFormation 中的“S3 error: Access Denied(S3 错误:访问被拒绝)”错误消息?

2 分钟阅读
0

我想解决我在 AWS CloudFormation 中创建或更新堆栈时遇到的 Amazon Simple Storage Service (Amazon S3)“Access Denied(访问被拒绝)”错误。

解决方案

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅对 AWS CLI 错误进行故障排除。此外,请确保您使用的是最新版本的 AWS CLI

对 IAM 角色或用户策略进行故障排除

查看您用于 CreateChangeSetCreateStack 的 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 角色的显式拒绝语句,请完成以下步骤:

  1. 打开 Amazon S3 控制台
  2. 从存储桶列表中,打开包含模板文件的存储桶。
  3. 选择 Permissions(权限)选项卡。
  4. 导航到存储桶策略分段。
  5. 搜索包含 "Effect": "Deny" 的语句。
  6. 编辑存储桶策略以更新任何 "Effect": "Deny" 语句,这些语句拒绝对 s3:GetObjects3:GetObjectVersion 的 IAM 角色访问权限。
  7. 移除用于 CloudFormation 的 IAM 角色。
  8. 选择 Save(保存)。
  9. 再次创建或更新堆栈。

有关 S3 存储桶策略的详细信息,请参阅存储桶策略示例

验证 S3 存储桶上的加密设置并激活 IAM 角色的 KMS 访问权限

当存储桶使用客户自主管理型 AWS Key Management Service (KMS) 密钥激活加密时,您可能会看到 S3 Access Denied(S3 访问被拒绝)错误。如果存储桶已加密,请更新密钥策略以允许 IAM 身份访问 KMS 密钥。

完成以下步骤:

  1. 打开 AWS KMS 控制台
  2. 找到用于加密 S3 存储桶中对象的密钥,然后选择 Key Policy(密钥策略)选项卡。
  3. 使用以下语句更新策略:
    {
        "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

AWS 官方
AWS 官方已更新 9 个月前