最初に
terraformを業務で使用することになりました。
そのため勉強したことをまとめています。
terraformでaws-vpc作成
※リソース名等を意味のないものに変更しています。
main.tf
# プロバイダーとプロファイルの指定
provider "aws" {
shared_credentials_files = ["~/.aws/credentials"]
region = "ap-northeast-1"
profile = "profile-name"
}
# tfstateファイル格納先の指定
# バケットは事前に作成する必要あり。
terraform {
backend "s3" {
bucket = "s3-bucket"
key = "tfstateファイル格納先指定"
encrypt = true
region = "ap-northeast-1"
profile = "profile-name"
}
}
# aws-vpc作成
resource "aws_vpc" "vpc-name" {
cidr_block = "0.0.0.0/0"
# VPC内でインスタンスにDNSホスト名を割り当てるか
enable_dns_hostnames = true
# vpc内での名前解決をできるようにするか
enable_dns_support = true
# EC2インスタンスがどのハードウェア上で実行されるか指定
# default:他のユーザーとハードウェアを共有する
# dedicated:専用のハードウェア上で実行
instance_tenancy = "default"
# IPv6 CIDRブロックを自動的に割り当てるか
assign_generated_ipv6_cidr_block = true
tags = {
Name = "vpc-name"
}
}
# サブネットの作成①
resource "aws_subnet" "subnet-name_1a" {
vpc_id = aws_vpc.vpc-name.id
cidr_block = "0.0.0.0/0"
availability_zone = "ap-northeast-1a"
tags = {
Name = "subnet-name_1_1a"
}
}
# サブネットの作成②
resource "aws_subnet" "subnet-name_1c" {
vpc_id = aws_vpc.vpc-name.id
cidr_block = "0.0.0.0/0"
availability_zone = "ap-northeast-1c"
tags = {
Name = "subnet-name_1c"
}
}
# ルートテーブルの作成
resource "aws_route_table" "table-name" {
vpc_id = aws_vpc.terraform_vpc.id
tags = {
Name = "table-name"
}
}
# インターネットゲートウェイの作成
resource "aws_internet_gateway" "igw-name" {
vpc_id = aws_vpc.vpc-name.id
tags = {
Name = "igw-name"
}
}
# サブネットとルートテーブルを関連付け
resource "aws_route_table_association" "table_association" {
subnet_id = aws_subnet.subnet-name_1a.id
route_table_id = aws_route_table.table-name.id
}
# ルートテーブルとインターネットゲートウェイを関連付け
resource "aws_route" "table-name" {
route_table_id = aws_route_table.table-name.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw-name.id
}
outputs.tf
# 下記はすべて作成したリソースを外部から値を読み取れるように設定しています。
# 例として別フォルダでrds作成用のコードを作成し今回作成したサブネットの値を指定したい場合outputsで読み取りできるようにしないとサブネットを値を取得できません。
output "vpc_id" {
value = aws_vpc.vpc-name.id
}
output "vpc_cidr" {
value = aws_vpc.vpc-name.cidr_block
}
output "subnet-name_1a_ids" {
value = aws_subnet.subnet-name.id
}
output "subnet-name_1a_cidrs" {
value = aws_subnet.subnet-name_1a.cidr_block
}
output "subnet-name_1c_ids" {
value = [aws_subnet.subnet-name_1c.id]
}
output "subnet-name_1c_cidrs" {
value = [aws_subnet.subnet-name_1c.cidr_block]
}
output "igw_id" {
value = aws_internet_gateway.igw-name.id
}
output "rt_public_ids" {
value = aws_route_table.table-name.id
}
最後に
上記内容ではサブネット"subnet-name_1a"がパブリックサブネットになりサブネット"subnet-name_1c"がプライベートサブネットになります。
そしてサブネット"subnet-name_1c"は特段どことも明示的にルートテーブルと関連付けしていないためデフォルトのルートテーブルと自動で関連付けされます。
terraformで初めて作成したものになるため色々反省点はありますが、とりあえず動くものはできました。
実際に業務で使用する場合はサブネットの数を増やさないといけない等修正は必要になります。
そしてresourceで宣言するよりmoduleを使用するとコードが短くわかりやすいと思うのでmoduleでも書きたいです。
また次はプレフィックスリストやセキュリティグループについても作成したので書きたいです。