[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

[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}" }

这就是你需要做的全部,然后应用致命的地形。

。 。 。 。就是这样。

如果您觉得这篇文章有帮助,请点赞!
0
加载中...
0 票,平均:0.00 / 10
3,560
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

寺冈由纪

于 2016 年加入 Beyond,目前是他担任基础设施工程师
MSP 的第六个年头,他负责排除故障,同时
使用 AWS 等公共云设计和构建基础设施。
最近,我
一直在使用 Terraform 和 Packer 等 Hashicorp 工具作为构建 Docker 和 Kubernetes 等容器基础设施以及自动化操作的一部分,并且我
还扮演了在外部学习小组和研讨会上发言的传播者的角色。

・GitHub
https://github.com/nezumisannn

・演示历史
https://github.com/nezumisannn/my-profile

・演示材料(SpeakerDeck)
https://speakerdeck.com/nezumisannn

・认证:
AWS认证解决方案架构师-
谷歌云专业云架构师