有没有办法从CLI指定要使用哪个Terraform提供程序



我们使用Terraform在AWS上编译所有基础设施。我们将Gitlab用于SCM,使用Gitlab Runner用于CI/CD。我们还开始使用亚特兰蒂斯,这样我们就可以在拉取请求中自动运行所有Terraform。

我们在代码中配置的Terraform提供者看起来像这样:

provider "aws" {
region = "us-east-1"
assume_role {
role_arn     = "arn:aws:iam::123456789012:role/atlantis"
session_name = "terraform"
}
}

运行Atlantis的Gitlab Runner实例具有承担assume_role块中引用的"Atlantis"角色的权限。这一切都很好。

然而,有时我仍然需要从命令行手动运行Terraform。这样做的问题是,当我这样做时,我的帐户(配置为联邦/SAML登录)无法承担角色。不过,它确实可以做一切与创造和破坏资源有关的事情。

这意味着我需要在本地机器上暂时删除上面的assume_role块,然后运行Terraform命令。这不是世界末日,但有点烦人。我想做的是:创建第二个"aws"提供者——一个不会尝试扮演另一个角色的提供者——比如:

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

然后我会称之为terraform plan --provider=local-cli。但遗憾的是,没有这样的--provider选项;我现在只是编出来的。根据Terraform文档,看起来我可以在每个资源的基础上配置第二个提供程序,但实际上我想做的是在每个会话基础上用第二个提供者运行Terraform。对此有什么解决方案吗?

这就是我所做的。我在bash中创建了一个小包装器,它生成了更改的地形代码,并为您生成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

通过这种方式,提供程序和设置可以在不同环境中完全更改。

最新更新