跳至内容

为什么我会在 CloudFormation 中收到“S3 error: Access Denied”错误?

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 身份提供 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 角色的显式拒绝语句,请完成以下步骤:

  1. 打开 Amazon S3 控制台
  2. 在导航窗格中,选择 Buckets(存储桶)。
  3. Buckets(存储桶)下拉列表中,选择包含模板文件的存储桶。
  4. 选择 Permissions(权限)选项卡。
  5. Bucket policy(存储桶策略)下,选择 Edit(编辑)。
  6. 搜索包含 "Effect": "Deny" 的语句。
  7. 更新 "Effect": "Deny" 语句,这些语句会拒绝 IAM 角色对 s3:GetObjects3:GetObjectVersion 的访问。
  8. 删除您用于 CloudFormation 的 IAM 角色。
  9. 选择 Save changes(保存更改)。
  10. 再次创建或更新堆栈。

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

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

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

完成以下步骤:

  1. 打开 AWS KMS 控制台
  2. 在导航窗格中,选择 Customer managed keys(客户自主管理型密钥)。
  3. 在 KMS 密钥列表中,选择用于加密 s3 对象的密钥的别名或密钥 ID,然后选择 Key Policy(密钥策略)选项卡。
  4. 使用以下语句更新策略:
{    "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

AWS 官方已更新 4 个月前