在 GitLab-CI 中使用 terraform 更新 aws_iam_policy 失败并出现 EntityAlreadyExists 错误

update aws_iam_policy with terraform in GitLab-CI fails with EntityAlreadyExists error

我正在尝试通过 GitLab-CI 更新 IAM 角色及其与 Terraform 的附加策略。我的地形代码如下所示:-

data "aws_iam_policy_document" "billing-roles" {
  statement {
      effect = "Allow"
      principals {
          type = "Federated"
          identifiers = ["${var.samlprovider_arn}"]
      }
      actions = ["sts:AssumeRoleWithSAML"]
      condition {
        test = "StringEquals"
        variable ="SAML:aud"
        values = ["https://signin.aws.amazon.com/saml"]
       }
    }
}

resource "aws_iam_role" "billing_role" {
  name               = "billing-role"
  permissions_boundary = "${var.permissions_boundary_arn}"
  assume_role_policy = "${data.aws_iam_policy_document.billing-roles.json}"
  tags =  {
      Applicatio_ID = "${var.app_id}"
      Environment = "${var.environment}"
      Name = "billing-role"
      Owner = "Terraform"
  }
}


resource "aws_iam_policy" "billing_policy" {
  name  = "billing-policy"
  policy= "${file("${path.module}/policies/billing-role-policy.json")}"
}

resource "aws_iam_role_policy_attachment" "billing_attachment" {
  role  = aws_iam_role.billing_role.name
  policy_arn = aws_iam_policy.billing_policy.arn
}

我正在通过 GitLab-运行 terraform 的各个阶段(INIT、PLAN、APPLY)-CI。这第一次有效但因 EntityAlreadyExists 错误而失败。 .gitlab-ci.yml 看起来像这样:-

include:
  - project: 'infrastructure/infrastructure-code-cicd-files'
    ref: master
    file: '.for_terraform_iam.yml'

stages:
  - init
  - plan
  - apply

tf_init:
  extends: .tf_init
  tags:
    - integration
  stage: init
  variables:
    ACCOUNT: "ACCOUNT_ID"
    ASSUME_ROLE: "arn:aws:iam::ACCOUNT_ID:role/devops-cross-account"
    backend_bucket_name: "iam-role-backend-${ACCOUNT}"
    tfstate_file: "iam-role/terraform.tfstate"

tf_plan:
  extends: .tf_plan
  variables:
    ASSUME_ROLE: "arn:aws:iam::ACCOUNT_ID:role/devops-cross-account"
  tags:
    - integration
  stage: plan


tf_apply:
  extends: .tf_apply
  variables:
    ASSUME_ROLE: "arn:aws:iam::ACCOUNT_ID:role/devops-cross-account"
  tags:
    - integration
  stage: apply

这个 gitlab-ci 配置包括一个实用程序文件,其中包含用于初始化、计划和应用的所有 terraform 逻辑。

我是 运行 Terraform 0.12.13 上的设置。 Terraform 导入虽然成功导入了资源,但在这里无济于事,因为 Terraform 抱怨“EntityAlreadyExists” 由于我在此处使用的 Terraform 版本中存在错误,Terraform 污点无法正常工作。

我想要一个 IAM 角色创建后的工作流程,其附加的内联策略可以由 Ops 工程师更新,批准者将批准合并请求,这样 IAM 角色将根据 Ops 工程师的需要添加服务.

我们可以在这里更新 IAM 策略吗?我知道更新 IAM 角色需要先分离 policies,然后将新的 policies 附加到它。

请帮忙

问题是将 terraform.tfstate 文件传递​​到我错过的计划阶段。我们 运行 一个“aws s3 cp s3://backend-bucket/keys”。获取状态文件,这已经解决了问题。