逐步構建 AWS Terraform VPC

如果您需要设置 AWS虚拟私有云(VPC),您可以通过AWS管理控制台实现,但自动化操作更有趣!在DevOps场景中,使用像 Terraform 这样的工具构建AWS服务是一种更可扩展和自动化的云资源提供方式。

在本教程中,您将学习如何构建和运行一个Terraform配置,从头开始构建一个Terraform VPC!

先决条件

本文将是一个逐步教程。如果您希望跟随操作,请确保具备以下条件:

  • Terraform – 本教程将使用在Ubuntu 18.04.5 LTS上运行的Terraform v0.14.9,但任何安装有 Terraform 的操作系统都可以使用。
  • A code editor – Even though you can use any text editor to work with Terraform configuration files, you should have one that understands the HCL Terraform language. Try out Visual Studio (VS) Code.

了解AWS VPCs

AWS雲端具有數十種不同的服務,包括計算、儲存、網路等。這些服務可以像本地資料中心的服務一樣互相通信。但是,每個服務都是獨立的,並不一定與其他服務隔離。AWS VPC改變了這一點。

AWS VPC是一個單一的網路,允許您在一個隔離的網路中啟動AWS服務。從技術上講,AWS VPC幾乎與擁有一個資料中心一樣,但具有可擴展性、容錯性、無限儲存等內建的額外優勢。

AWS VPC architecture

AWS VPC受地區限制。您不能跨地區擁有一個VPC,每個地區最多支持五個VPC。

建立AWS VPC的Terraform配置

說話夠了,讓我們開始建立吧!

1. 首先,創建一個文件夾來存儲您的Terraform配置文件。本教程將在您的主目錄中創建一個名為terraform-vpc-demo的文件夾。

mkdir ~/terraform-vpc-demo
 cd ~/terraform-vpc-demo

2. 打開您喜歡的程式碼編輯器,將以下配置複製/粘貼到已經為您創建好的配置文件中,將文件保存為main.tf,放在~/terraform-vpc-demo目錄中。有關要創建的每個資源的信息都在內嵌的註釋中。

main.tf文件包含了需要配置的所有資源。

Terraform 使用幾種不同類型的配置文件。每個文件都是以純文本格式或 JSON 格式編寫的。它們具有特定的命名慣例,可以是 `.tf` 或 `.tfjson` 格式。

以下是 Terraform 配置:

  • 創建一個 VPC
  • 創建一個互聯網閘道,並將其附加到 VPC,以允許 VPC 內的流量可以被外部世界訪問。
  • 創建公共和私有子網路

子網路是網絡中的網絡。它們旨在幫助網絡流量更有效地流動,並提供更小、更可管理的 IP 地址“塊”

  • 為公共和私有子網路創建路由表,並將該表與兩個子網路關聯
  • 創建 NAT 閘道,以使私有子網路能夠在不需要為每個資源分配外部路由 IP 地址的情況下訪問互聯網。
Create the VPC
 resource "aws_vpc" "Main" {                # 在這裡創建 VPC
   cidr_block       = var.main_vpc_cidr     # 使用 10.0.0.0/24 來定義 CIDR 區塊供示範使用
   instance_tenancy = "default"
 }
 Create Internet Gateway and attach it to VPC
 resource "aws_internet_gateway" "IGW" {    # 創建互聯網網關
    vpc_id =  aws_vpc.Main.id               # 在創建 VPC 後將生成 vpc_id
 }
 Create a Public Subnets.
 resource "aws_subnet" "publicsubnets" {    # 創建公共子網
   vpc_id =  aws_vpc.Main.id
   cidr_block = "${var.public_subnets}"        # 公共子網的 CIDR 區塊
 }
 Create a Private Subnet                   # 創建私有子網
 resource "aws_subnet" "privatesubnets" {
   vpc_id =  aws_vpc.Main.id
   cidr_block = "${var.private_subnets}"          # 私有子網的 CIDR 區塊
 }
 Route table for Public Subnet's
 resource "aws_route_table" "PublicRT" {    # 為公共子網創建 RT
    vpc_id =  aws_vpc.Main.id
         route {
    cidr_block = "0.0.0.0/0"               # 公共子網的流量通過互聯網網關到達互聯網
    gateway_id = aws_internet_gateway.IGW.id
     }
 }
 Route table for Private Subnet's
 resource "aws_route_table" "PrivateRT" {    # 為私有子網創建 RT
   vpc_id = aws_vpc.Main.id
   route {
   cidr_block = "0.0.0.0/0"             # 私有子網的流量通過 NAT 網關到達互聯網
   nat_gateway_id = aws_nat_gateway.NATgw.id
   }
 }
 Route table Association with Public Subnet's
 resource "aws_route_table_association" "PublicRTassociation" {
    subnet_id = aws_subnet.publicsubnets.id
    route_table_id = aws_route_table.PublicRT.id
 }
 Route table Association with Private Subnet's
 resource "aws_route_table_association" "PrivateRTassociation" {
    subnet_id = aws_subnet.privatesubnets.id
    route_table_id = aws_route_table.PrivateRT.id
 }
 resource "aws_eip" "nateIP" {
   vpc   = true
 }
 Creating the NAT Gateway using subnet_id and allocation_id
 resource "aws_nat_gateway" "NATgw" {
   allocation_id = aws_eip.nateIP.id
   subnet_id = aws_subnet.publicsubnets.id
 }

3. 現在,在 ~/terraform-vpc-demo 目錄內創建另一個文件,命名為 vars.tf,並粘貼以下內容。

Vars.tf 是一個 Terraform 變數文件,其中包含配置文件引用的所有變數。

您可以在配置文件中看到變數引用:

  • var.region
  • var.main_vpc_cidr
  • var.public_subnets
  • var.private_subnets
variable "region" {}
 variable "main_vpc_cidr" {}
 variable "public_subnets" {}
 variable "private_subnets" {}

可以將所有配置值放在單個配置文件中。為了保持清晰並使開發人員和管理員更容易理解,重要的是將事情分開處理。

4. 在~/terraform-vpc-demo目錄中創建一個文件,將以下代碼粘貼進去,並將其命名為provider.tf以定義AWS提供程序。該教程將在us-east-2地區創建資源。

提供程序文件定義提供程序,如AWS、Oracle或Azure等,以便Terraform可以與正確的雲服務連接。 provider "aws" { region = "us-east-2" }

provider "aws" {
   region = "us-east-2"
 }

5. 最後,在~/terraform-vpc-demo目錄中創建另一個文件,命名為terraform.tfvars,並粘貼下面的代碼。此變量文件包含Terraform將用於替換配置文件中變量引用的值。

main_vpc_cidr = "10.0.0.0/24"
 public_subnets = "10.0.0.128/26"
 private_subnets = "10.0.0.192/26"

現在,打開您喜歡的終端(本例中為Bash),並通過運行tree命令來驗證文件夾中包含所有所需的文件。

tree terraform-vpc-demo  
Folder structure of terraform files

運行Terraform創建AWS VPC

現在您已經準備好 Terraform 配置文件和變量文件,是時候啟動 Terraform 並創建 VPC 了!為了提供一個 Terraform 配置,Terraform 通常使用三個階段的方法 terraform initterraform planterraform apply。現在讓我們來逐個介紹每個階段。

1. 打開終端並切換到 ~\terraform-vpc-demo 目錄。

cd ~\terraform-vpc-demo

2. 在同一目錄中運行 terraform init 命令。該命令用於初始化所需的插件和提供者,以便與資源一起使用。

terraform init

如果一切順利,您應該在輸出中看到 Terraform has been successfully initialized 的消息,如下所示。

Terraform initialized successfully

3. 現在,運行 terraform plan 命令。這是一個可選的,但建議的操作,用於確保配置的語法正確,並提供您的基礎架構中將要提供的資源的概覽。terraform plan

terraform plan

如果成功,您應該在輸出中看到類似於計劃:"X"添加,"Y"更改,或"Z"銷毀的消息,表示命令成功。您還將看到Terraform打算創建的每個AWS資源。

Plan command execution

4. 接下來,告訴Terraform實際使用terraform apply配置AWS VPC和資源。當您調用terraform apply時,Terraform將讀取配置(main.tf)和其他文件以編譯配置。然后,它將將該配置發送到AWS,作為構建VPC和其他組件的指示。

terraform apply
Terraform apply command execution

注意Terraform輸出中定義的ID。您將需要這些ID來將來在下一部分創建的資源相關聯起來。

Terraform命令執行成功,因此讓我們切換到AWS管理控制台,確認VPC和組件是否成功創建。

驗證AWS Terraform VPC

到目前為止,您應該已經使用Terraform創建了VPC。讓我們通過手動檢查AWS管理控制台中的VPC來進行驗證。

1. 打開您喜歡的Web瀏覽器,然後轉到AWS管理控制台並登錄。

2. 在控制台中,點擊頂部的搜索欄,搜索“vpc”,然後點擊VPC菜單項。

Navigating to the VPC service

3. 一旦進入VPC頁面,點擊Your VPCs。您應該看到使用Terraform先前返回的相同ID創建的VPC。

VPC created

4. 由於 Terraform 建立的不僅僅是 VPC 資源,而是 VPC 所需的所有資源,因此您應該在此頁面上找到每個資源。

Subnets created
Route tables created
Internet Gateway created
NAT Gateway created

所有元件都成功建立後,使用 Terraform,這個 VPC 已準備就緒!

結論

在本教程中,您已經學會了如何使用 Terraform 部署 AWS VPC 及其組件。

使用 Terraform 構建 Amazon Virtual Private Cloud 讓您能夠快速、輕鬆且可預測地創建資源。現在,您已準備好將此知識應用於其他 AWS 服務並在其上構建功能強大的服務。

Source:
https://adamtheautomator.com/terraform-vpc/