对于共享资源,我会在一个单独的模板中创建它们,然后在需要这些信息的模板中使用terraform_remote_state
引用它们。
接下来是我如何实现这一点,可能还有其他的实现方式。您的情况可能会有所不同。
在共享服务模板中(您将在其中放置IAM角色),我使用Terraform后端将共享服务模板的输出数据存储在Consul中。您还需要output
任何想要在其他模板中使用的信息。
shared_services模板
terraform {
backend "consul" {
address = "consul.aa.example.com:8500"
path = "terraform/shared_services"
}
}
resource "aws_iam_role" "lambda_iam_role" {
name = "LambdaGeneralRole"
policy = <...>
}
output "lambda_iam_role_arn" {
value = "${aws_iam_role.lambda_iam_role.arn}"
}
在Terraform中,“backend”决定了如何加载状态(state),以及如何执行apply等操作。这种抽象使得非本地文件状态存储、远程执行等成为可能。在单独的模板中,您可以使用
terraform_remote_state
作为数据源调用后端,并可以在该模板中使用该数据。
terraform_remote_state
:从远程后端检索状态元数据。
“individual template”
data "terraform_remote_state" "shared_services" {
backend = "consul"
config {
address = "consul.aa.example.com:8500"
path = "terraform/shared_services"
}
}
resource "aws_lambda_function" "my_lambda" {
function_name = "lambda-${terraform.workspace}"
role = "${data.terraform_remote_state.shared_services.lambda_iam_role_arn}"
}
参考文献:
https://www.terraform.io/docs/state/remote.html
https://www.terraform.io/docs/backends/
https://www.terraform.io/docs/providers/terraform/d/remote_state.html
terraform.tfstate
文件可用,就没有理由不行。 - kenlukasterraform_remote_state
可以与backend = "local"
一起使用,甚至不指定任何后端也可以,似乎会将local
作为默认值。 - Bastianterraform_remote_state
中指定workspace =“production”
。这很方便。 - Bastianlambda_iam_role
仍然在每个工作区中创建,这正是问题(和我自己)试图避免的。 - Andy Shinn