我们正在使用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,看来我可以在每个资源的基础上配置第二个提供程序,但实际上我要做的是在基于每次会话。有什么解决方案吗?
答案 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
这样,提供者和设置可以在整个环境中完全改变。