我有一个在 AWS 中使用 Terraform 部署的基础设施。这个基础设施可以部署到不同的环境中,我正在使用工作空间。
部署中的大多数组件应该为每个工作区单独创建,但我有几个我希望在它们之间共享的关键组件,主要是:
例如:
resource "aws_iam_role" "lambda_iam_role" {
name = "LambdaGeneralRole"
policy = <...>
}
resource "aws_lambda_function" "my_lambda" {
function_name = "lambda-${terraform.workspace}"
role = "${aws_iam_role.lambda_iam_role.arn}"
}
第一个资源是一个 IAM 角色,应该在该 Lambda 的所有实例之间共享,并且不应多次重新创建。
第二个资源是一个 Lambda 函数,其名称取决于当前工作区,因此每个工作区将部署并跟踪不同 Lambda 的状态。
如何在不同的 Terraform 工作空间之间共享资源及其状态?
最佳答案
对于共享资源,我在单独的模板中创建它们,然后使用 terraform_remote_state
引用它们在我需要有关它们的信息的模板中。
以下是我如何实现它,可能还有其他方法可以实现它。 YMMV
在共享服务模板(您将放置 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}"
}
A "backend" in Terraform determines how state is loaded and how an operation such as apply is executed. This abstraction enables non-local file state storage, remote execution, etc.
在单个模板中,您使用
terraform_remote_state
调用后端作为数据源。并且可以使用该模板中的数据。terraform_remote_state
:Retrieves state meta data from a remote backend
个人模板
data "terraform_remote_state" "shared_services" {
backend = "consul"
config {
address = "consul.aa.example.com:8500"
path = "terraform/shared_services"
}
}
# This is where you use the terraform_remote_state data source
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
关于amazon-web-services - 在 Terraform 工作空间之间共享资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52606011/