この記事では、サブネット、インターネットゲートウェイ、NATゲートウェイ、およびルートテーブルとともにVPCを作成する方法を紹介します。 4つのサブネット(2つのプライベートと2つのパブリック、2つのNATゲートウェイ、1つのインターネットゲートウェイ、4つのルートテーブル)で1つのVPCを作成します。
先に進む前に、AWSでのTerraformとVPCの基本を理解していることを前提としています。 AWSコンソールからVPCとその作成について学ぶには、ここをクリックしてください。Terraformの基本については、「Terraformとは何ですか。AWSEC2インスタンスにインストールする方法」を検索してください。
- Terraformの基本的な理解。
- システムにインストールされているTerraform。
- AWSアカウント(アカウントがない場合は作成します)。
- AWSIAMユーザーの「access_key」と「secret_key」。 (AWSで「access_key」と「secret_key」を使用してIAMユーザーを作成する方法については、ここをクリックしてください)
- 他の依存リソースを使用してVPCを作成するためのTerraform構成ファイルを作成します。
- Terraform構成ファイルを使用してVPCおよびその他の依存リソースを作成します
- Terraformを使用して作成されたVPCおよびその他の依存リソースを削除します
テラフォーム構成ファイルを作成できる専用ディレクトリを作成します。
次のコマンドを使用してディレクトリを作成し、現在の作業ディレクトリをそのディレクトリに変更します。
mkdir terraform
cd terraform/
私はファイルを書き込むためのエディターとして「vim」を使用しています。選択したエディターを使用して、次の構成をコピーして貼り付け、variables.tf、terraform.tfvars、およびmain.tf
を作成できます。
'main.tf'を作成します。これは、依存リソースを使用してAWSにVPCを作成する役割を果たします。このmain.tfは、variables.tfおよびterraform.tfvarsから変数の値を読み取ります。
vim main.tf
provider "aws" {
region = "${var.region}"
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
}
# VPC resources: This will create 1 VPC with 4 Subnets, 1 Internet Gateway, 4 Route Tables.
resource "aws_vpc" "default" {
cidr_block = var.cidr_block
enable_dns_support = true
enable_dns_hostnames = true
}
resource "aws_internet_gateway" "default" {
vpc_id = aws_vpc.default.id
}
resource "aws_route_table" "private" {
count = length(var.private_subnet_cidr_blocks)
vpc_id = aws_vpc.default.id
}
resource "aws_route" "private" {
count = length(var.private_subnet_cidr_blocks)
route_table_id = aws_route_table.private[count.index].id
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.default[count.index].id
}
resource "aws_route_table" "public" {
vpc_id = aws_vpc.default.id
}
resource "aws_route" "public" {
route_table_id = aws_route_table.public.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.default.id
}
resource "aws_subnet" "private" {
count = length(var.private_subnet_cidr_blocks)
vpc_id = aws_vpc.default.id
cidr_block = var.private_subnet_cidr_blocks[count.index]
availability_zone = var.availability_zones[count.index]
}
resource "aws_subnet" "public" {
count = length(var.public_subnet_cidr_blocks)
vpc_id = aws_vpc.default.id
cidr_block = var.public_subnet_cidr_blocks[count.index]
availability_zone = var.availability_zones[count.index]
map_public_ip_on_launch = true
}
resource "aws_route_table_association" "private" {
count = length(var.private_subnet_cidr_blocks)
subnet_id = aws_subnet.private[count.index].id
route_table_id = aws_route_table.private[count.index].id
}
resource "aws_route_table_association" "public" {
count = length(var.public_subnet_cidr_blocks)
subnet_id = aws_subnet.public[count.index].id
route_table_id = aws_route_table.public.id
}
# NAT resources: This will create 2 NAT gateways in 2 Public Subnets for 2 different Private Subnets.
resource "aws_eip" "nat" {
count = length(var.public_subnet_cidr_blocks)
vpc = true
}
resource "aws_nat_gateway" "default" {
depends_on = ["aws_internet_gateway.default"]
count = length(var.public_subnet_cidr_blocks)
allocation_id = aws_eip.nat[count.index].id
subnet_id = aws_subnet.public[count.index].id
}
変数の宣言と定義を含む「variables.tf」を作成します。
vim variables.tf
variable "access_key" {
description = "Access key to AWS console"
}
variable "secret_key" {
description = "Secret key to AWS console"
}
variable "region" {
default = "eu-west-3"
type = string
description = "Region of the VPC"
}
variable "cidr_block" {
default = "10.0.0.0/16"
type = string
description = "CIDR block for the VPC"
}
variable "public_subnet_cidr_blocks" {
default = ["10.0.0.0/24", "10.0.2.0/24"]
type = list
description = "List of public subnet CIDR blocks"
}
variable "private_subnet_cidr_blocks" {
default = ["10.0.1.0/24", "10.0.3.0/24"]
type = list
description = "List of private subnet CIDR blocks"
}
variable "availability_zones" {
default = ["eu-west-3a", "eu-west-3b"]
type = list
description = "List of availability zones"
}
上記のファイルで定義されたaccess_key変数とsecret_key変数の定義を含む「terraform.tfvars」を作成します。これら2つの変数の宣言は、「terraform.tfvars」ファイルに保存されています。
次のキーは、IAMユーザーのキーで変更する必要があります。
vim terraform.tfvars
access_key = "AKIAQ6GAIA5XIHHM2GJM" secret_key = "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"
これで、3つのファイル、つまり、variables.tf、terraform.tfvars、およびmain.tfが必要になります
Terraform構成ファイルを使用してVPCおよびその他の依存リソースを作成します
次のコマンドを実行する前に、有効なaccess_keyとsecret_keyが構成されていることを確認してください。
使用する最初のコマンドは「terraforminit」です。このコマンドは、構成内で使用されるプロバイダーのプラグインをダウンロードしてインストールします。私たちの場合、それはAWSです。
terraform init
使用する2番目のコマンドは「テラフォームプラン」です。このコマンドは、インフラストラクチャで行われる変更を確認するために使用されます。
terraform plan
'terraform apply'コマンドは、main.tfファイルに記載されているAWSにリソースを作成します。リソースを作成するための入力を入力するように求められます。
terraform apply
上記のコマンドを実行すると、20個の新しいリソースが追加され、0個が出力で破棄されていることがわかります。
AWS VPCコンソールに移動して、VPCがサブネット、ルートテーブルNATゲートウェイ、およびインターネットゲートウェイとともに作成されているかどうかを確認できます。
Terraformを使用して作成されたVPCとその他の依存リソースを削除します
main.tfファイルに記載されている構成を使用して作成したリソースが不要になった場合は、「terraformdestroy」コマンドを使用してそれらのリソースをすべて削除できます。
terraform destroy
上記のコマンドを実行すると、作成された20個のリソースが出力で破棄されていることがわかります。 VPCダッシュボードでAWSにアクセスすると、同じことを確認できます。
この記事では、4つのサブネット、4つのルートテーブル、2つのNATゲートウェイ、および1つのインターネットゲートウェイを備えたVPCを作成する手順について説明しました。また、作成されたリソースがどのように破壊されるかを見ました。