【问题标题】:Terraform 403 Forbidden Error while executing terraform planTerraform 403 执行 terraform 计划时出现禁止错误
【发布时间】:2020-09-18 23:49:10
【问题描述】:

我们目前使用 S3 作为我们的后端来保存 tf 状态文件。在执行terraform plan 时,我们收到以下错误:

Error: Forbidden: Forbidden
        status code: 403, request id: 18CB0EA827E6FE0F, host id: 8p0TMjzvooEBPNakoRsO3RtbARk01KY1KK3z93Lwyvh1Nx6sw4PpRyfoqNKyG2ryMNAHsdCJ39E=

我们已启用调试模式,下面是我们注意到的错误消息。

2020-05-31T20:02:20.842+0400 [DEBUG] plugin.terraform-provider-aws_v2.64.0_x4: Accept-Encoding: gzip
2020-05-31T20:02:20.842+0400 [DEBUG] plugin.terraform-provider-aws_v2.64.0_x4: 
2020-05-31T20:02:20.842+0400 [DEBUG] plugin.terraform-provider-aws_v2.64.0_x4: 
2020-05-31T20:02:20.842+0400 [DEBUG] plugin.terraform-provider-aws_v2.64.0_x4: -----------------------------------------------------
2020/05/31 20:02:20 [ERROR] <root>: eval: *terraform.EvalRefresh, err: Forbidden: Forbidden
        status code: 403, request id: 2AB56118732D7165, host id: 5sM6IwjkufaDg1bt5Swh5vcQD2hd3fSf9UqAtlL4hVzVaGPRQgvs1V8S3e/h3ta0gkRcGI7GvBM=
2020/05/31 20:02:20 [ERROR] <root>: eval: *terraform.EvalSequence, err: Forbidden: Forbidden
        status code: 403, request id: 2AB56118732D7165, host id: 5sM6IwjkufaDg1bt5Swh5vcQD2hd3fSf9UqAtlL4hVzVaGPRQgvs1V8S3e/h3ta0gkRcGI7GvBM=
2020/05/31 20:02:20 [TRACE] [walkRefresh] Exiting eval tree: aws_s3_bucket_object.xxxxxx
2020/05/31 20:02:20 [TRACE] vertex "aws_s3_bucket_object.xxxxxx": visit complete
2020/05/31 20:02:20 [TRACE] vertex "aws_s3_bucket_object.xxxxxx: dynamic subgraph encountered errors
2020/05/31 20:02:20 [TRACE] vertex "aws_s3_bucket_object.xxxxxx": visit complete

我们已尝试将代码和 tfstate 文件恢复为工作版本并尝试过。另外,也在本地删除了 tfstate 文件。还是同样的错误。

s3 存储桶策略如下:

{
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxx:role/Administrator"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3:::xxxxxx/*",
                "arn:aws:s3:::xxxxxx"
            ]
        }

terraform 正在承担相同的角色来执行,但仍然失败。我也清空了存储桶策略并尝试了但没有看到任何成功。我知道这与存储桶策略本身有关,但不确定如何解决。

非常感谢任何解决此问题的指针。

【问题讨论】:

  • 审查您的 S3 存储桶策略将有助于理解这一点。在发布之前,请务必在政策中使用虚假占位符掩盖您的帐户 ID、KMS 密钥 ID 或其他个人身份信息(例如个人或公司名称)。
  • 另外,请发布您在运行时向 Terraform 提供其凭证的 IAM 用户或 IAM 角色 STS 会话的组合 IAM 策略。
  • 用存储桶策略更新了描述。请检查。

标签: amazon-s3 terraform


【解决方案1】:

在运行 Terraform 之前,需要检查您是谁(从 AWS API 角度):

aws sts get-caller-identity

如果输出是这样的,那么您将被认证为 IAM 用户,该用户将无权访问存储桶,因为它授予对 IAM 角色而不是 IAM 用户的访问权限:

{
    "UserId": "AIDASAMPLEUSERID",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/DevAdmin"
}

在这种情况下,您需要配置 AWS CLI 以假定 arn:aws:iam::xxxxxx:role/Administrator

[profile administrator]
role_arn = arn:aws:iam::xxxxxx:role/Administrator
source_profile = user1

在此处阅读有关该过程的更多信息:

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html

如果 get-caller-identity 返回类似这样的内容,则说明您承担了 IAM 角色,问题可能与存储桶策略中的操作有关:

{
    "UserId": "AIDASAMPLEUSERID",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:assumed-role/Administrator/role-session-name"
}

根据Backend type: S3 documentation,还需要s3:PutObject:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::mybucket"
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": "arn:aws:s3:::mybucket/path/to/my/key"
    }
  ]
}

虽然我不明白为什么计划需要 PutObject,但可以想象这是导致此 Forbidden 错误的原因。

如果已启用,您还可以在 CloudTrail 中查找被拒绝的 S3 操作。

【讨论】:

  • 我们使用 1 个 s3 存储桶作为我们多个模块的后端,所有其他模块计划和应用都工作正常。仅在管理 cdn 和 s3 存储桶时才会出现问题。此外,我们尝试了 put 和 get 权限,但这并没有太大帮助。将按照建议查看 CloudTrail 日志。
  • 谢谢。我在我的答案中添加了一些其他内容,关于诊断和解释 IAM 用户与 IAM 角色的权限问题,这可能是这里的情况。
  • 这个答案让我找到了与我的案例相关的原因。有不同的 AWS 凭证配置文件,我错了。发现我的 terraform 支持的 s3 块允许我指定配置文件,我这样做了,并且成功了。
【解决方案2】:

问题现已解决。在此之前,我们执行了 s3 复制操作,将所有 s3 对象从账户 A 复制到账户 B。这里的问题是复制命令总是移动对象以及相同的用户权限,这使得当前用户角色无法访问这些新复制的对象导致 Forbidden 403 错误。

我们已清除此存储桶中的所有对象并运行 aws sync 命令而不是 cp,这为我们解决了问题。谢谢阿兰的详细解释。这些肯定帮助我们解决了这个问题。

This 帮助我们指出正确的问题。

后续步骤:

  1. 备份所有 s3 对象。
  2. 清空桶。
  3. 运行terraform plan
  4. 对存储桶进行更改后,运行 aws sync 命令。

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2021-01-16
    相关资源
    最近更新 更多