与Terraform共享全局堆栈数据

2020-05-16 05:34:19

因此,假设您已经将您的Terraform基础设施分解成多个独立的小堆栈。在它们之间共享公共数据的最佳方法是什么?在本文中,我们将讨论一种可能的解决方案。

在本演示中,我们假设在不同的堆栈中有两个服务:service-a和service-b,这两个服务都需要同一个vPC中相同子网上的ALB。

模块service_a_alb{source=";terraform-aws-module/alb/aws";name=";service-a";load_balancer_type=";application";vpc_id=";vpc-12345";subnet=[";subnetfoo";,";subnetbar";,";subnetbaz";]。

模块服务_b_alb{源=";terraform-aws-module/alb/aws";名称=";服务-b";负载均衡器类型=";应用程序";vpc_id=";vpc-12345";子网=[";子网-foo";,";子网条";,";子网-baz";]。

您可以看到vPC_id和子网被复制并在堆栈之间共享。现在最明显的做法是使用数据资源:

Data AWS_vpc vpc{default=false filter{name=";tag:name";values=[";my-vpc";]}}data aws_subnetids public{vpc_id=data.aws_vpc.vpc.id filter{name=";tag:name";values=[";public-*";,]}}模块service_a_alb{source=";TerraForm-aws-module/alb/aws";name=";service-a";load_balancer_type=";application";vpc_id=data.aws_vpc.vpc_id subnet=data.aws_subnet_ids.public.ids}。

Data AWS_vpc vpc{default=false filter{name=";tag:name";values=[";my-vpc";]}}data aws_subnetids public{vpc_id=data.aws_vpc.vpc.id filter{name=";tag:name";values=[";public-*";,]}}模块service_b_alb{source=";TerraForm-aws-module/alb/aws";name=";service-b";load_balancer_type=";application";vpc_id=data.aws_vpc.vpc_id subnet=data.aws_subnet_ids.public.ids}。

但是现在数据资源是重复的,并且AWS刚刚弃用了您的一个可用区。不能再在其中提供资源。您要做的最后一件事是进入每个堆栈并编辑数据资源。怎么办呢?

Data AWS_vpc vpc{default=false filter{name=";tag:name";values=[";my-vpc";]}}data aws_subnetids public{vpc_id=data.aws_vpc.vpc.id filter{name=";tag:name";values=[";public-*";,]}}输出vpc_id{value=data.aws_vpc.vpc.id}输出public_subnetid{value=data.aws_子网_ids.public.ids}terraform{backend";s3";{bucket=";terraform.example.com";key=";{[env_name]}/{[AWS_Region]}/{[vpc_name]}";region=。

data terraform_remote_state env{后端=";S3";配置={存储桶=";terraform.example.com";ENCRYPT=TRUE KEY=";${var.env_name}/${var.aws_region}/${var.vpc_name}";Region=var.aws_region}}本地{PUBLIC_SUBNET_ID=data.terraform_remote_state.env.outputs.public_subnet_ids vpc_id=data.terraform_remote_state.env.outputs.vpc_id}模块SERVICE_a_ALB{SOURCE-AWS-MODULES/ALB/AWS";NAME=";SERVICE-a";LOAD_BALANER_TYPE=";APPLICATION";vpc_id=local.vpc_id子网=local.public_subnet_ids}。

data terraform_remote_state env{后端=";S3";配置={存储桶=";terraform.example.com";ENCRYPT=TRUE KEY=";${var.env_name}/${var.aws_region}/${var.vpc_name}";Region=var.aws_region}}本地{PUBLIC_SUBNET_ID=data.terraform_remote_state.env.outputs.public_subnet_ids vpc_id=data.terraform_remote_state.env.outputs.vpc_id}模块SERVICE_b_ALB{SOURCE-AWS-MODULES/ALB/AWS";NAME=";SERVICE-b";LOAD_BANCER_TYPE=";APPLICATION";vpc_id=local.vpc_id子网=local.public_subnet_ids}。

到目前为止,您可能认为对数据堆栈的引用是重复的。是的,但让我们回到被否决的az的问题上来。要过滤掉不良子网,您只需在一个位置进行更改:

本地变量{EXCLUDE_PUBLIC_SUBNETS=[";SUBNET-BAZ";]}输出PUBLIC_SUBLINT_ID{value=[对于数据中的SUBTONET_ID。aws_SUBLINT_ids.public.ids:SUBLINT_ID if!包含(local.excluded_public_subnet,subnetid)]}。

请告诉我您对此的想法和意见。如何在分解的Terraform环境中管理共享数据?