作者:刘哥2502908157 | 来源:互联网 | 2022-12-03 12:32
我有要在AWS中使用Terraform部署的基础架构。该基础架构可以部署到我正在使用工作空间的不同环境中。
应该为每个工作区分别创建部署中的大多数组件,但是我希望在它们之间共享几个关键组件,主要是:
IAM角色和权限
他们应使用相同的API网关,但每个工作区应部署到不同的路径和方法
例如:
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工作空间之间共享资源及其状态?
1> kenlukas..:
对于共享资源,我在单独的模板中创建它们,然后terraform_remote_state
在需要有关它们的信息的模板中引用它们。
接下来是我如何实现它,可能还有其他方法可以实现它。青年汽车
在共享服务模板(您将在其中放置IAM角色)中,我使用Terraform后端将共享服务模板的输出数据存储在Consul中。您还需要output
其他模板中要使用的任何信息。
share_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中的“后端”确定如何加载状态以及如何执行诸如apply之类的操作。这种抽象可以实现非本地文件状态存储,远程执行等。
在单个模板中,您terraform_remote_state
可以使用并将后端作为数据源调用,并且可以使用该模板中的数据。
terraform_remote_state
:
从远程后端检索状态元数据
个别模板
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