我们使用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
通过这种方式,提供程序和设置可以在不同环境中完全更改。