AWS Terraform Section2 - VPC

VPC & Subnet

image

每当一个账户在区域创建时,都会拥有一个AWS VPC(Virtual Private Cloud)

image

跟随区域,跟随AWS账户默认创建,用于保护每个账户的私有资源访问权限

例如不同的账户可能创建在同一台物理服务器上,但是不同的账号间的资源访问是互相隔离的

image

控制台可以看到默认创建的VPC

image

VPC代表了公司的网络架构,包括网络配置、路由、防火墙等

VPC由不同的Availability Zone​组成,具体指代实际的物理服务器所在的数据中心

例如 我在中国区,可能会有华南、华中、华北3个数据中心都有虚拟服务器运行,那么就会有3个Availability Zone​,也就会有3个subnet

image

当我们需要从外部访问资源时,需要配置一个公共IP地址,可以使用Internet Gateway

当我们需要控制外部对VPC访问权限,可以配置防火墙

image

配置外部访问

设置防火墙规则和安全组

VPC -> SECURITY

image

添加VPC资源

资源命名规则: aws_[resource_name]

所有的语法示例都能在文档中找到

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc

image

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

provider "aws" {
region = "eu-west-3" # 取决于购买的EC2实例所属的区域

/**
不推荐hardcode明文的key
**/
access_key = ""
secret_key = ""
}

# 资源命名规则 - aws_resource
# 创建名为 development-vpc的VPC
resource "aws_pvc" "development-vpc" {

# VPC地址范围
cider_block = "10.0.0.0/16"

}

# 创建名为 dev-subnet-1 的subnet
resource "aws_subnet" "dev-subnet-1" {
# 指定subnet所属的VPC
# 目前VPC还没创建,所以需要动态引用定义的资源
vpc_id = aws_pvc.development-vpc.id

# 定义VPC地址范围的子集
cidr_block = "10.0.10.0/24"

availability_zone = "eu-west-3a"
}

通过执行如下命令应用到AWS

1
terraform apply

执行命令以后可以预览terraform的执行计划,然后输入yes​确认该计划

image

DataSource

假如我们需要从已有的VPC中创建subnet,则需要先拉取AWS已有的VPC信息,然后引用其id

image

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 拉取aws数据
# 定义变量名为 existing_vpc 的vpc数据源
data "aws_vpc" "existing_vpc" {

# 拉取默认的vpc
default = true
}

# 创建名为 dev-subnet-1 的subnet
resource "aws_subnet" "dev-subnet-2" {
# 从已有的vpc中获取id
vpc_id = data.aws_vpc.existing_vpc.id

# 定义VPC地址范围的子集
# 不应与vpc中的已有subnet ip范围重复
cidr_block = "172.31.48.0/20"

availability_zone = "eu-west-3a"
}

执行 terraform apply

image

修改 & 删除资源

继续以AWS VPC为例

修改

使用关键字tags​,它存在于所有的资源中

例如,指定VPC名称

image

在应用tf文件的时候,~​代表资源修改,+​代表新增

并且在执行计划中有8个属性保持不变

image

将会在控制台显示名称

image

如果删除掉tags​,那么在执行计划中会以-​显示

image

删除

修改tf

*推荐使用配置文件的方式,配置文件方便代码管理

如果把*.tf​中的subnet删除,执行 terraform apply,则意味着删除该subnet

image

执行计划如下

可以看到整个资源都标有-​,因为这个资源即将被删除

image

terraform destroy

执行

1
terraform destroy -target [resource_type] [resource_name]

例如

1
terraform destroy -target aws_subnet dev-subnet-2

可以看到执行计划也是类似的

image

对比差异

检查aws和tf文件的差异

1
terraform plan

示例

image

总结

  • provider: 用于导入一组或一段代码,类似import library
  • resource: 类似于从库中调用一段函数
  • data: 类似于返回已经存在的资源的函数

image

需要注意的是,这里的用户必须具有创建资源所必须的权限image

另外,terraform在apply相同的tf文件的时候,会自动检查所有组件的状态

如果组件已经存在,则terraform不会再执行操作

也就是说每当应用相同的配置时,总会得到一样的结果。用户不需要记住当前组件的状态,也不会意外地破坏某些原有的组件。

0%