[terraform]我写了一个模块在AWS上构建3层网络配置
我叫寺冈,是一名基础设施工程师。
这次我们要讲的是terraform模块。
我创建了一个模块,允许您构建一个配置,将 AWS 网络一次分为三层:公共/DMZ/私有,并且
通过执行本文中描述的代码,您可以在 AWS 上部署以下配置。
多AZ和DMZ子网通过NATGateway与外界通信。
公共子网直接与 InternetGateway 通信,
私有子网仅在本地通信。
乍一看似乎很复杂,但我认为这是一个相当常见的结构。
使用 terraform 对该配置进行模块化的结果如下。
■定义要传递给模块的值的变量
首先,定义要传递给模块的值作为变量。
变量“vpc_config”{默认={项目=“tf-moduletest”环境=“stg”cidr_block=“10.10.0.0/16”}}变量“availability_zones”{默认=[“ap-northeast-1a”,“ap- east-1c"] } 变量 "public_subnets" { 默认 = ["10.10.0.0/20","10.10.16.0/20"] } 变量 "dmz_subnets" { 默认 = ["10.10.32.0/20","10.10. 48.0/20"] } 变量 "private_subnets" { 默认 = ["10.10.64.0/20","10.10.80.0/20"] }
■描述模块
这部分是本文的主题。
由于您只是根据变量中定义的值构建资源,因此您
基本上可以在任何项目中重用它。
###### # VPC ###### 资源 "aws_vpc" "vpc" { cidr_block = "${var.vpc_config["cidr_block"]}" 标签 { Name = "vpc-${var.vpc_config[ "project"]}-${var.vpc_config["environment"]}" } } ################ # 公共子网 ########## ##### 资源 "aws_subnet" "public" { count = "${length(var.public_subnets)}" vpc_id = "${aws_vpc.vpc.id}" cidr_block = "${element(var.public_subnets, count) .index)}" available_zone = "${element(var.availability_zones, count.index)}" map_public_ip_on_launch = "true" 标签 { Name = "subnet-${var.vpc_config["project"]}-${var. vpc_config["environment"]}-public-${substr(element(var.availability_zones, count.index),-1,1)}" } } ################ # DMZ 子网 ############## 资源 "aws_subnet" "dmz" { count = "${length(var.dmz_subnets)}" vpc_id = "${aws_vpc.vpc.id } " cidr_block = "${element(var.dmz_subnets, count.index)}" available_zone = "${element(var.availability_zones, count.index)}" 标签 { Name = "subnet-${var.vpc_config[" 项目"]}-${var.vpc_config["environment"]}-dmz-${substr(element(var.availability_zones, count.index),-1,1)}" } } ####### # ######## # 私有子网 ############## 资源 "aws_subnet" "private" { count = "${length(var.private_subnets)}" vpc_id = " ${aws_vpc.vpc.id}" cidr_block = "${element(var.private_subnets, count.index)}"availability_zone = "${element(var.availability_zones, count.index)}" 标签 { Name = "subnet- ${var.vpc_config["project"]}-${var.vpc_config["environment"]}-private-${substr(element(var.availability_zones, count.index),-1,1)}" } } ############################## # 公共路线和关联 ############ ### ################ 资源 "aws_route_table" "public" { vpc_id = "${aws_vpc.vpc.id}" 标签 { Name = "rtb-${var.vpc_config["项目"]}-${var.vpc_config["环境"]}-public" } } 资源 "aws_internet_gateway" "internet_gateway" { vpc_id = "${aws_vpc.vpc.id}" 标签 { Name = "igw -${ var.vpc_config["project"]}-${var.vpc_config["environment"]}" } } 资源 "aws_route" "public_internet_gateway" { route_table_id = "${aws_route_table.public.id}" destination_cidr_block = " 0.0.0.0 /0" gateway_id = "${aws_internet_gateway.internet_gateway.id}" } 资源 "aws_route_table_association" "public" { count = "${length(var.public_subnets)}" subnet_id = "${element(aws_subnet.public .*. id, count.index)}"route_table_id = "${aws_route_table.public.id}" } ############################ ## # DMZ 路由和关联 ########################### 资源 "aws_route_table" "dmz" { count = "${length( var.dmz_subnets) }" vpc_id = "${aws_vpc.vpc.id}" 标签 { Name = "rtb-${var.vpc_config["project"]}-${var.vpc_config["environment"]}-dmz -${substr (element(var.availability_zones, count.index),-1,1)}" } } 资源 "aws_eip" "nat" { count = "${length(var.dmz_subnets)}" vpc = true } 资源 "aws_nat_gateway" "nat_gateway" { count = "${length(var.dmz_subnets)}"allocation_id = "${element(aws_eip.nat.*.id, count.index)}"subnet_id = "${element(aws_subnet .public.*) .id, count.index)}" 标签 { Name = "nat-${var.vpc_config["project"]}-${var.vpc_config["environment"]}-public-${substr( element(var. availability_zones, count.index),-1,1)}" } } 资源 "aws_route" "dmz_nat_gateway" { count = "${length(var.dmz_subnets)}" route_table_id = "${element(aws_route_table.dmz.*. id, count.index)}" destination_cidr_block = "0.0.0.0/0" gateway_id = "${element(aws_nat_gateway.nat_gateway.*.id, count.index)}" } 资源 "aws_route_table_association" "dmz" { count = " ${length(var.dmz_subnets)}"subnet_id = "${element(aws_subnet.dmz.*.id, count.index)}"route_table_id = "${element(aws_route_table.dmz.*.id, count.index) }" } ################################# # 私人路线和关联 ###### ##### #################### 资源 "aws_route_table" "private" { vpc_id = "${aws_vpc.vpc.id}" 标签 { Name = "rtb-${var .vpc_config["project"]}-${var.vpc_config["environment"]}-private" } } 资源 "aws_route_table_association" "private" { count = "${length(var.private_subnets) }"subnet_id = "$ {element(aws_subnet.private.*.id, count.index)}"route_table_id = "${aws_route_table.private.id}" }
■调用所描述的模块
使用 terraform 调用模块时,编写以下代码。
只需指定包含描述源中模块的 .tf 文件的目录,并
传递执行变量中指定的模块所需的变量。
模块“vpc”{源=“../modules/network/vpc/”vpc_config=“${var.vpc_config}”availability_zones=“${var.availability_zones}”public_subnets=“${var.public_subnets}”dmz_subnets= "${var.dmz_subnets}" private_subnets = "${var.private_subnets}" }
这就是你需要做的全部,然后应用致命的地形。
。 。 。 。就是这样。
如果您觉得这篇文章有帮助,请点赞!