是否可以通过CLI指定要使用的Terraform提供程序?

时间:2019-02-04 21:02:10

标签: terraform

我们正在使用Terraform在AWS上整理所有基础架构。我们在SCM上使用Gitlab,在CI / CD上使用Gitlab-Runner。我们还开始使用Atlantis,以便可以在请求请求中自动运行所有Terraform。

我们在代码中配置的Terraform提供程序如下所示:

provider "aws" {
  region = "us-east-1"

  assume_role {
    role_arn     = "arn:aws:iam::123456789012:role/atlantis"
    session_name = "terraform"
  }
}

运行亚特兰蒂斯的Gitlab-Runner实例具有承担assume_role块中引用的“亚特兰蒂斯”角色的权限。一切都很好。

但是,有时候我仍然需要从命令行手动运行Terraform。这样做的麻烦在于,这样做时,我的帐户(配置为联合身份验证/ SAML登录名)无法承担角色。不过,它确实有权执行与创建和销毁资源有关的所有事情。

这意味着我需要在本地计算机上临时删除上面的assume_role块,然后运行Terraform命令。这不是世界的尽头,但是有点令人讨厌。我想做的事情是这样的:创建第二个“ aws”提供程序-一个尝试承担另一个角色的程序-

provider "aws" {
  region = "us-east-1"
  alias  = "local-cli"
}

然后我会称呼类似terraform plan --provider=local-cli的东西。但是遗憾的是,没有这样的--provider选项;我现在才弥补。 According to the Terraform docs,看来我可以在每个资源的基础上配置第二个提供程序,但实际上我要做的是在基于每次会话。有什么解决方案吗?

1 个答案:

答案 0 :(得分:1)

这就是我的工作。我在bash中创建了一个小型包装程序,该包装程序会生成可更改的terraform代码并为您生成provider.tf文件:

cat << EOF > ./provider.tf
terraform {
  backend "s3" {
    bucket = "${TF_VAR_state_bucket}"
    dynamodb_table = "${DYNAMODB_STATE_TABLE}"
    key    = "terraform/$STATE_PATH/terraform.tfstate"
    region = "$REGION"
    encrypt = "true"
  }
}
provider "aws" {
  region  = "$REGION"
  version = "1.51.0"
}
provider "archive" { version = "1.1.0" }
provider "external" { version = "1.0.0" }
provider "local" { version = "1.1.0" }
provider "null" { version = "1.0.0" }
provider "random" { version = "2.0.0" }
provider "template" { version = "1.0.0" }
provider "tls" { version = "1.2.0" }
EOF

这样,提供者和设置可以在整个环境中完全改变。