2022.03.13  

【Terraform】AWSのネットワークを構築する

Terraform,  AWS    

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
コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信