首页 > 解决方案 > Terraform 无法承担 IAM 角色

问题描述

我正在尝试开始使用 Terraform,并正在使用 GitLab CI/CD 与之交互。My Runner 无法担任具有创建 AWS 资源的提升权限的 IAM 角色。我在这方面的 Google-fu 让我失望了。

收到的错误是:

错误:配置 Terraform AWS 提供程序时出错:无法假定 IAM 角色 (my:arn)。有许多可能的原因 - 最常见的是:

  • 用于承担角色的凭据无效
  • 凭据没有担任该角色的适当权限
  • 角色 ARN 无效

我在 IAM 中创建了一个访问/密钥,并尝试将它们作为 GitLab CI/CD 变量、我直接export在我before_scriptprovider. 无论如何,我仍然遇到同样的错误。

更奇怪的是,AWS 显示该密钥正在被使用。“上次使用”列将始终反映上次尝试运行管道的时间戳。无论好坏,密钥都是我的根 AWS 账户的一部分 - 这是一个沙盒项目,我没有任何 IAM 用户,因此,我不清楚 Terraform 如何无法使用这些凭证来承担角色,根据 AWS,它可以访问我的帐户,并且我的帐户具有 root 权限。

这是我的provider.tf

terraform {
    required_version = ">= 0.14"
    backend "s3" { }
}

provider "aws" {
    region = "us-east-1"
    access_key = "redacted"
    secret_key = "redacted"
    assume_role {
        role_arn = "arn:aws:iam::redacted:role/gitlab-runner-role"
    }
}

这是我.gitlab-ci.yml在这个阶段的相关部分:

.terraform_init: &terraform_init |-
  terraform init -backend-config="bucket=my-terraform-state" -backend-config="region=us-east-1" -backend-config="key=terraform.tfstate"

tf-plan:
  image: 
    name: hashicorp/terraform
    entrypoint: [""]
  stage: plan
  before_script:
    - *terraform_init
  script:
    - terraform plan -out=tfplan.plan
    - terraform show --json tfplan.plan | convert_report > tfplan.json
  needs:
    - job: tf-val
  tags:
    - my-runner

main.tf只包含一个基本的aws_instance节,我的terraform validate舞台(上面省略)说它是船形的。这些是我的仓库中仅有的 3 个文件。

gitlab-runner-role只包含一个 Policy, gitlab-runner-policy,它的 JSON 是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::my-terraform-state"
            ]
        }
    ]
}

TIA 的任何建议......真的把我的头撞在墙上。

标签: amazon-web-servicesgitlabterraformgitlab-cigitlab-ci-runner

解决方案


事实证明,假设角色只需要跨账户工作。我在我自己的帐户中完成所有工作,因此删除它允许 Terraform 只使用密钥来完成工作,而无需其他 IAM 角色(或者它能够通过附加到Runner 作为实例配置文件)。我不清楚为什么无论如何指定假设角色会导致错误,因为访问应该在那里,但删除它已经解决了这个问题。


推荐阅读