执行Terraform计划时出现Terraform 403禁止错误

时间:2020-05-31 16:36:39

标签: amazon-s3 terraform

我们当前正在使用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承担着相同的角色来执行,但仍然失败。我也清空了存储桶策略,并尝试了一下,但是没有看到任何成功。我了解这与存储桶策略本身有关,但不确定如何解决。

任何解决此问题的指针都受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

要检查的是您是谁(从AWS API角度看),然后再运行Terraform:

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角色,而问题可能与Bucket策略中的操作有关:

{
    "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 :(得分:2)

该问题现已解决。在此之前,我们已经执行了s3复制操作,该操作已将所有s3对象从帐户A复制到帐户B。此处的问题是复制命令始终将对象与相同的用户权限一起移动,这导致当前用户角色无法访问这些对象新复制的对象会导致“禁止403”错误。

我们清除了此存储桶中的所有对象,然后运行aws sync命令而不是cp,从而为我们解决了该问题。谢谢阿兰的详尽解释。这些肯定可以帮助我们解决此问题。

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

遵循的步骤:

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