用terraform在aws上部署vpc
VPC
AWS 虚拟私有云 (VPC) 是与您的 AWS 账户关联的虚拟网络。它代表一个与 AWS 公有云中的其他资源隔离的逻辑网络。 VPC 由几个独立的组件组成,被粗略地描述为在 AWS 中运行的“迷你数据中心”。在 VPC 中,组织托管 EC2 实例和其他 AWS 资源。 VPC 的管理通过 AWS 管理控制台完成,或者通过使用 Terraform 或 CloudFormation 的软件自动化完成。
VPC 的一些常见用例包括:
-
托管网络应用程序
-
托管网站或电子商务网站
-
将工作负载迁移到 AWS 云
-
将数据中心扩展到云端(混合云)
-
备份或恢复
对于云网络,VPC 为帐户所有者提供了极大的灵活性以及对网络和安全环境的控制。这包括定义安全组、网络访问控制列表、创建 IP 子网、建立 IP 地址范围、配置路由表以及确定哪些 EC2 实例可公开访问的能力。可以在 VPC 中部署其他 AWS 服务(例如 Amazon S3),并且组织可以将 S3 访问限制为仅对 VPC 中的那些 EC2 实例进行访问。
-
VPC 的常见网络用例包括:
-
VPC 到 VPC 对等
-
VPC 到 On-premise 数据中心
-
分支位置到 VPC 连接
-
远程用户到基于 VPC 的应用程序
-
多云对等(AWS VPC 到 Azure VNET 或谷歌云 VPC)
-
VPC 到 Internet 资源(VPC 出口流量)
最后,通过选择 VPC 选项通过 AWS 管理控制台直接设置 VPC。一旦选择,VPC 在(1)选择 IP 地址范围后开始运行; (2) 创建子网; (3) 创建到 Internet 的路由以及 (4) 授权进出 VPC 的流量。
terraform基础
一般文件包括:
-
main.tf: 主文件
-
variables.tf: 存储变量的文件
-
output.tf: 输出文件,一般用于module
tf的variables中default无法再用variable:利用module,赋值
一些结构:
variable "public_subnet_cidrs" {
type = list(string)
description = "public subnet cidrs"
default="10.0.0.0/24"#没有default会让用户输入
}#采用 var.public_subnet_cidrs调用
data "aws_ami""webapp_ami" {
filter {
name = "name"
values = ["csye6225_*"]
}
most_recent = true#因为名字设置的时间,可以找最新的一个
}#采用data.aws_ami.webapp_ami调用
代码参考
文件结构
modules
-webserver //webserver module
--main.tf
--output.tf //本次没用到,所以为空
--variables.tf
setups //运行的主程序,命令需要来到这个文件夹之下
-main.tf
-variables.tf
main.tf (modules/webserver/)
terraform {
required_version = ">= 0.12"
}#版本要求
resource "aws_subnet" "public_subnets" {
count = length(var.public_subnet_cidrs)
vpc_id = var.vpc_id
cidr_block = element(var.public_subnet_cidrs, count.index)
availability_zone = element(var.azs_public, count.index)
map_public_ip_on_launch = true
tags = {
Name = "Public Subnet ${count.index + 1}"
}
}
resource "aws_subnet" "private_subnets" {
count = length(var.private_subnet_cidrs)
vpc_id = var.vpc_id
cidr_block = element(var.private_subnet_cidrs, count.index)
availability_zone = element(var.azs_private, count.index)
tags = {
Name = "Private Subnet ${count.index + 1}"
}
}
resource "aws_internet_gateway" "gw" {
vpc_id = var.vpc_id
tags = {
Name = "Project VPC IG"
}
}
resource "aws_route_table" "public" {
vpc_id = var.vpc_id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
tags = {
Name = "Public Route Table"
}
}
resource "aws_route_table_association" "public_subnet_asso" {
count = length(var.public_subnet_cidrs)
subnet_id = element(aws_subnet.public_subnets[*].id, count.index)
route_table_id = aws_route_table.public.id
}
resource "aws_route_table" "private" {
vpc_id = var.vpc_id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
tags = {
Name = "Private Route Table"
}
}
resource "aws_route_table_association" "private_subnet_asso" {
count = length(var.private_subnet_cidrs)
subnet_id