パーソル&サーバーワークス

ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【Terraform】まずはシンプルなコードでVPCとサブネットを構築してみましょう

この記事を共有する

目次

はじめに


皆さんこんにちは!サービスGの榎本です。突然ですが、Terraformというツールを耳にしたことはありますか?

簡単にお伝えしますと、IaC(Infrastructure as Code)ツールの一つで、AWSなどの環境をコードの記載の通りに構築できるものになります。

私も以前までは耳にしたことはあるものの、どのように勉強すればよいのかがわからずなかなか手を付けられずにいました。ただ今回初めて実際にTerraformを学習してハンズオンでAWSの環境構築をしたところ、構築時間や負荷の削減、ヒューマンエラー防止、再現性の高さなど多大なるメリットを感じて日々感動しております!

今回は以前の私のように「聞いたことはあるけど使ったことはない」、「使ってみたいけどやり方がわからない」といった悩みをお持ちの方向けに、まずはシンプルなコードを使ってVPCをTerraformで構築するためのハンズオン手順をまとめた記事となっております。ぜひ一度Terraformを使って環境構築をし、感動を味わっていただければと思います!

本ハンズオンの目的

まずはTerraformを使ってAWS環境を構築してみて、Terraformで構築するメリットを肌で感じること。

前提

Terraformをインストールする環境として、同じAWSアカウント内のEC2(Amazon Linux 2023)を利用する。

EC2がインターネット接続できる。(Terraformをインストールする手順も実施したいため)

本ハンズオン概要

以下構成図のようなVPCをTerraformのコードをとおして構築する。

構成図

構成図(VPC).png

構築環境

  • AWS
  • 東京リージョン(ap-northeast-1)
  • AvailabilityZone(ap-northeast-1a、ap-northeast-1c)

構築対象

  • VPC ×1
  • インターネットゲートウェイ ×1
  • パブリックサブネット ×2(各AZに1つずつ)
  • プライベートサブネット ×2(各AZに1つずつ)
  • パブリックルートテーブル ×1
  • プライベートルートテーブル ×1


事前準備

EC2にログインし、以下コマンドを順番に実行してTerraformをインストールする。

# システムの更新
sudo yum update -y

最新版のダウンロードURLを確認し、以下のコマンドを実行する。(例ではバージョン1.10.2を使用)

# Terraformをダウンロード
wget https://releases.hashicorp.com/terraform/1.10.2/terraform_1.10.2_linux_amd64.zip
# Terraformを解凍してインストールして移動
unzip terraform_1.10.2_linux_amd64.zip
sudo mv terraform /usr/local/bin/

以下のコマンドを実行してバージョンが表示されるか確認。成功すると Terraform v1.10.2 のように表示される。

# Terraformのインストール確認
terraform version

ハンズオン手順

1. EC2にログインし、以下コマンドで今回のハンズオン用のディレクトリを作成

mkdir -p terraform/handson
# terraform/handsonというディレクトリを新規作成

2. 以下コマンドで作成したディレクトリに移動

cd terraform/handson/
# terraform/handsonというディレクトリに移動

3. 移動したディレクトリ配下に、構築に必要なファイルを作成

touch main.tf
# main.tfというファイルを新規作成

4. 作成したmain.tfファイル内に以下記載して保存

# プロバイダー指定 AWSの東京リージョンを使用することを定義
provider "aws" {
region = "ap-northeast-1"
}

# VPC作成
resource "aws_vpc" "main_vpc" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true

tags = {
Name = "terraform-handson-vpc"
}
}

# インターネットゲートウェイ作成
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main_vpc.id

tags = {
Name = "terraform-handson-igw"
}
}

# パブリックサブネットa作成
resource "aws_subnet" "public_subnet_a" {
vpc_id = aws_vpc.main_vpc.id
cidr_block = "10.0.0.0/24"
availability_zone = "ap-northeast-1a"

tags = {
Name = "terraform-handson-public-subnet-a"
}
}

# パブリックサブネットc作成
resource "aws_subnet" "public_subnet_c" {
vpc_id = aws_vpc.main_vpc.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-1c"

tags = {
Name = "terraform-handson-public-subnet-c"
}
}

# プライベートサブネットa作成
resource "aws_subnet" "private_subnet_a" {
vpc_id = aws_vpc.main_vpc.id
cidr_block = "10.0.10.0/24"
availability_zone = "ap-northeast-1a"

tags = {
Name = "terraform-handson-private-subnet-a"
}
}

# プライベートサブネットc作成
resource "aws_subnet" "private_subnet_c" {
vpc_id = aws_vpc.main_vpc.id
cidr_block = "10.0.11.0/24"
availability_zone = "ap-northeast-1c"

tags = {
Name = "terraform-handson-private-subnet-c"
}
}

# パブリックルートテーブル作成
resource "aws_route_table" "route_table_public" {
vpc_id = aws_vpc.main_vpc.id

route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}

tags = {
Name = "terraform-handson-public-rt"
}
}

# プライベートルートテーブル作成
resource "aws_route_table" "route_table_private" {
vpc_id = aws_vpc.main_vpc.id

tags = {
Name = "terraform-handson-private-rt"
}
}

# パブリックルートテーブルa関連付け
resource "aws_route_table_association" "route_table_association_public_a" {
route_table_id = aws_route_table.route_table_public.id
subnet_id = aws_subnet.public_subnet_a.id
}

# パブリックルートテーブルc関連付け
resource "aws_route_table_association" "route_table_association_public_c" {
route_table_id = aws_route_table.route_table_public.id
subnet_id = aws_subnet.public_subnet_c.id
}

# プライベートルートテーブルa関連付け
resource "aws_route_table_association" "route_table_association_private_a" {
route_table_id = aws_route_table.route_table_private.id
subnet_id = aws_subnet.private_subnet_a.id
}

# プライベートルートテーブルc関連付け
resource "aws_route_table_association" "route_table_association_private_c" {
route_table_id = aws_route_table.route_table_private.id
subnet_id = aws_subnet.private_subnet_c.id
}

5. 以下コマンドを順番に実行する

5-1. 必要モジュールをインストールする。

terraform init
# 必要なモジュールをインストール

以下表示が出れば成功しているため次のコマンドを実行する。

Init.png

5-2. 実行内容を事前確認する。

terraform plan
# 実行内容を事前確認

以下表示が出れば成功しているため次のコマンドを実行する。

Plan.png

5-3. 構築を実行する。

terraform apply
# 構築実行 

※以下のように実行前に最終確認されるため、yesと入力する。

ApplyYES.png

以下表示が出れば構築成功。

ApplyComplete.png

6. マネジメントコンソールを開き、VPCが新規作成されていることを確認

7. 作成されていることを確認できたら、以下コマンドを実行して作成した環境を削除

terraform destroy
#環境を削除

※以下のように実行前に最終確認されるため、yesと入力する。

DestroyYES.png

以下表示が出れば削除成功。

DestroyComplete.png

まとめ

今回はEC2にTerraformをインストールして、VPCを構築するハンズオン手順を記載しました。tfファイルを作成してterraform applyコマンドを実行すればあとは待つだけでAWS環境が構築されます。

マネジメントコンソールから構築するよりもはるかに早くて楽でミスも防げる点を魅力的に感じていただけたのではないでしょうか。

本記事がTerraformについて学習する第一歩となり、皆さんの一助となりましたら幸いです。

この記事は私が書きました

榎本 将希

2024 Japan AWS All Certifications Engineers   サッカー観戦とサウナが好きです!   機械学習を勉強中です!

榎本 将希

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。