Terraformの勉強のため、AWSにVPC、サブネット、ルートテーブル、インターネットゲートウェイを構築するファイルを作成したのでメモ書きします。
参考
ファイル構成
ファイル構成は以下のようになります。
01_network
├── .gitignore
├── config.ty
├── variables.tf
├── network.tf
├── security_group.tf
└── outputs.tf
.gitignore
以下サイトでterraform
と検索して出力された結果を貼り付けます。
https://www.toptal.com/developers/gitignore
# Created by https://www.toptal.com/developers/gitignore/api/terraform
# Edit at https://www.toptal.com/developers/gitignore?templates=terraform
### Terraform ###
# Local .terraform directories
**/.terraform/*
### 中略 ###
# Ignore CLI configuration files
.terraformrc
terraform.rc
# End of https://www.toptal.com/developers/gitignore/api/terraform
config.ty
terraformの基本設定を行います。
providerのprofile =
以降には ~/.aws/config
で定義したprofile名を設定します。
そうすることで、自分のAWSアカウントの領域にterraformで設定したインフラが構築されます。
backend "s3"
を設定すると、terraform.tfstate
ファイルを指定したS3に保存することができます。
注意点としてはterraform.tfstate
ファイルを保存するS3バケットは事前に作成しておく必要があります。
# ------------------------------
# Terraform configuration
# ------------------------------
terraform {
required_version = ">=0.13"
required_providers {
aws = {
source = "hashicorp/aws"
version = ">3.0"
}
}
# ------------------------------
# tfstate
# ------------------------------
# S3にterraform.tfstateを保存する設定
backend "s3" {
# backetは事前に作成しておく必要がある
bucket = "tfstate-lab-20220417"
key = "aws/01_network/terraform.tfstate"
region = "ap-northeast-1"
}
}
# ------------------------------
# provider
# ------------------------------
provider "aws" {
profile = "lab-env" # ~/.aws/configのprofile名
region = "ap-northeast-1"
}
variables.ty
各tfファイル内で使用する変数を設定しています。
variableには変数名、defaultには変数の値を設定します。
variable "project" {
default = "test_20220417"
}
variable "enviroment" {
default = "lab"
}
variable "create_date" {
default = "20220417"
}
network.tf
具体的なネットワーク設定を行います。
今回はVPC、サブネット、ルートテーブル、インターネットゲートウェイを構築しています。
# --------------------------------------------------------------
# VPC
# --------------------------------------------------------------
resource "aws_vpc" "vpc" {
cidr_block = "192.168.0.0/16" # IPv4 CIDR ブロック
instance_tenancy = "default" # テナンシー。EC2 インスタンスが物理ハードウェアに分散される方法を定義。料金に影響。defaultは他アカウントと共有利用、hostは専有の設定。
enable_dns_support = true # DNS解決(bool)
enable_dns_hostnames = true # DNSホスト名(bool)
assign_generated_ipv6_cidr_block = false # IPv6 CIDR ブロック
tags = {
Name = "${var.project}-${var.enviroment}-vpc"
project = var.project
Env = var.enviroment
}
}
# --------------------------------------------------------------
# Subnet パブリック、プライベート用にそれぞれ2つずつ構築
# --------------------------------------------------------------
resource "aws_subnet" "public_subnet_1a" {
vpc_id = aws_vpc.vpc.id # リソースの参照(上記VPC)
availability_zone = "ap-northeast-1a" # アベイラビリティーゾーン
cidr_block = "192.168.1.0/24" # CIDRブロック
map_public_ip_on_launch = true # 自動割り当てIP設定
tags = {
Name = "${var.project}-${var.enviroment}-public_subnet_1a"
project = var.project
Env = var.enviroment
Tpye = "public"
}
}
resource "aws_subnet" "public_subnet_1c" {
vpc_id = aws_vpc.vpc.id
availability_zone = "ap-northeast-1c"
cidr_block = "192.168.2.0/24"
map_public_ip_on_launch = true
tags = {
Name = "${var.project}-${var.enviroment}-public_subnet_1c"
project = var.project
Env = var.enviroment
Tpye = "public"
}
}
resource "aws_subnet" "private_subnet_1a" {
vpc_id = aws_vpc.vpc.id
availability_zone = "ap-northeast-1a"
cidr_block = "192.168.3.0/24"
map_public_ip_on_launch = false
tags = {
Name = "${var.project}-${var.enviroment}-private_subnet_1a"
project = var.project
Env = var.enviroment
Tpye = "private"
}
}
resource "aws_subnet" "private_subnet_1c" {
vpc_id = aws_vpc.vpc.id
availability_zone = "ap-northeast-1c"
cidr_block = "192.168.4.0/24"
map_public_ip_on_launch = false
tags = {
Name = "${var.project}-${var.enviroment}-private_subnet_1c"
project = var.project
Env = var.enviroment
Tpye = "private"
}
}
# --------------------------------------------------------------
# Route Table
# --------------------------------------------------------------
# public
resource "aws_route_table" "public_route_table" {
vpc_id = aws_vpc.vpc.id
tags = {
Name = "${var.project}-${var.enviroment}-public_route_table"
project = var.project
Env = var.enviroment
Tpye = "private"
}
}
resource "aws_route_table_association" "public_route_table_1a" {
route_table_id = aws_route_table.public_route_table.id
subnet_id = aws_subnet.public_subnet_1a.id
}
resource "aws_route_table_association" "public_route_table_1c" {
route_table_id = aws_route_table.public_route_table.id
subnet_id = aws_subnet.public_subnet_1c.id
}
# private
resource "aws_route_table" "private_route_table" {
vpc_id = aws_vpc.vpc.id
tags = {
Name = "${var.project}-${var.enviroment}-private_route_table"
project = var.project
Env = var.enviroment
Tpye = "private"
}
}
resource "aws_route_table_association" "private_route_table_1a" {
route_table_id = aws_route_table.private_route_table.id
subnet_id = aws_subnet.private_subnet_1a.id
}
resource "aws_route_table_association" "private_route_table_1c" {
route_table_id = aws_route_table.private_route_table.id
subnet_id = aws_subnet.private_subnet_1c.id
}
# --------------------------------------------------------------
# Internet Gateway
# --------------------------------------------------------------
resource "aws_internet_gateway" "internet_gateway" {
vpc_id = aws_vpc.vpc.id
tags = {
Name = "${var.project}-${var.enviroment}-internet_gateway"
project = var.project
Env = var.enviroment
}
}
# パブリックルートテーブルとインターネットゲートウェイの紐付け
resource "aws_route" "PublicRouteTable_Connect_InternetGateway" {
route_table_id = aws_route_table.public_route_table.id
destination_cidr_block = "0.0.0.0/0" # internet_gatewayの外への通信許可設定
gateway_id = aws_internet_gateway.internet_gateway.id
}
security_group.tf
security_groupを設定しているファイルです。
今回は次回作成するRDSのためのsecurity Groupを作成しています。
# -------------------------------
# security Group
# -------------------------------
# --DB security group
resource "aws_security_group" "db_sg" {
name = "${var.project}-${var.enviroment}-db-sg"
description = "DB security group"
vpc_id = aws_vpc.vpc.id
tags = {
Name = "${var.project}-${var.enviroment}-db-sg"
project = var.project
Env = var.enviroment
}
}
resource "aws_security_group_rule" "db_in_tcp3306" {
# resource "aws_security_group"で作成したidを設定
security_group_id = aws_security_group.db_sg.id
# 通信を受け付ける設定を行う場合は、ingressを設定
type = "ingress"
protocol = "tcp"
from_port = 3306
to_port = 3306
# 受け付けるIPアドレス
cidr_blocks = [ "0.0.0.0/0" ]
# 送信先のセキュリティグループ
# source_security_group_id = aws_security_group.app_sg.id
}
outputs.tf
今回は使用しませんが、次回のRDS構築用に設定を行なっています。
output
を定義しておくと、他のディレクトリでterraform apply
を実行する際にここで定義した値を参照することできるようになります。
# vpcのidを取得
output "vpc_id" {
value = aws_vpc.vpc.id
}
# DB用のセキュリティグループIDを取得
output "aws_security_group_db_id" {
value = aws_security_group.db_sg.id
}
# リージョンAのプライベートサブネットIDを取得
output "private_subnet_1a_id" {
value = aws_subnet.private_subnet_1a.id
}
# リージョンCのプライベートサブネットIDを取得
output "private_subnet_1c_id" {
value = aws_subnet.private_subnet_1c.id
}
terraformで環境構築
以下コマンドを実行すると環境構築を行えます。
コマンドは今までに作成したファイルが置いてあるディレクトリで実行します。
# terraformファイルを整形する
terraform fmt
# terraformファイルの構文が正しいか確認する
terraform plan
# terraformファイルに定義された構成で構築を実施。実行後にyes入力する
terraform apply
構築した環境の削除
以下コマンドを実行すると、先ほど構築した環境をもれなく削除できます。
terraform destroy