Terraformを使ったAWSインフラ構築ガイド: VPCからNATゲートウェイまで
初めに
この記事では、WSL2上のUbuntu環境でTerraformを使ってAWSリソースネットワークを構築する手順を紹介します。これは自分用の備忘録でもあり、今後学習する方々の参考にもなればなと。
ゴールは以下の通りです:
- VPCをつくる
- VPCの中でサブネットを作る
- インターネットへの接続をおこなう
- セキュリティの設定を行う
前提条件
以下が完了していること:
WSL2上のUbuntuでTerraformを使用するためのセットアップガイド
これらの前提条件が整っている場合、次のステップに進んでください。
Terraformプロジェクトのセットアップ
1. プロジェクトフォルダに移動
まず、Terraformプロジェクトを作成するディレクトリに移動します。
$ cd ~/terraform-project
2. VPC設定ファイルを作成
プロジェクトディレクトリ内にvpc.tfファイルを作成し、以下の内容を追加します。
$ vi vpc.tf
# vpc.tf
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16" # VPCのCIDRブロックを指定。10.0.0.0/16の範囲を使用。
}
- resource "aws_vpc" "main": AWSのVPC(Virtual Private Cloud)リソースを定義します。
- cidr_block = "10.0.0.0/16": VPCのCIDRブロックを指定します。この場合、範囲は10.0.0.0/16です。
3. サブネット設定ファイルを作成
プロジェクトディレクトリ内にsubnet.tfファイルを作成し、以下の内容を追加します。
$ vi subnet.tf
# subnet.tf
resource "aws_subnet" "main" {
vpc_id = aws_vpc.main.id # 作成したVPCのIDを指定。
cidr_block = "10.0.1.0/24" # サブネットのCIDRブロックを指定。10.0.1.0/24の範囲を使用。
}
- resource "aws_subnet" "main": AWSのサブネットリソースを定義します。
- vpc_id = aws_vpc.main.id: 作成したVPCのIDを指定します。aws_vpc.main.idは先に作成したVPCのIDを参照します。
- cidr_block = "10.0.1.0/24": サブネットのCIDRブロックを指定します。この場合、範囲は10.0.1.0/24です。
4. Elastic IP設定ファイルを作成
プロジェクトディレクトリ内にeip.tfファイルを作成し、以下の内容を追加します。
$ vi eip.tf
# eip.tf
resource "aws_eip" "nat" {
domain = "vpc" # ドメインを指定。VPC内で使用することを示す。
}
- resource "aws_eip" "nat": AWSのElastic IP(EIP)リソースを定義します。
- vpc = true: EIPをVPCに関連付けます。
5. インターネットゲートウェイ設定ファイルを作成
プロジェクトディレクトリ内にinternet_gateway.tfファイルを作成し、以下の内容を追加します。
$ vi internet_gateway.tf
# internet_gateway.tf
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
}
- resource "aws_internet_gateway" "igw": AWSのインターネットゲートウェイリソースを定義します。
- vpc_id = aws_vpc.main.id: 作成したVPCのIDを指定します。aws_vpc.main.idは先に作成したVPCのIDを参照します。
6. NATゲートウェイ設定ファイルを作成
プロジェクトディレクトリ内にnat_gateway.tfファイルを作成し、以下の内容を追加します。
$ vi nat_gateway.tf
# nat_gateway.tf
resource "aws_nat_gateway" "nat" {
allocation_id = aws_eip.nat.id
subnet_id = aws_subnet.main.id
}
- resource "aws_nat_gateway" "nat": AWSのNATゲートウェイリソースを定義します。
- allocation_id = aws_eip.nat.id: Elastic IPの割り当てIDを指定します。aws_eip.nat.idは先に作成したEIPのIDを参照します。
- subnet_id = aws_subnet.main.id: 作成したサブネットのIDを指定します。aws_subnet.main.idは先に作成したサブネットのIDを参照します。
7. ルートテーブル設定ファイルを作成
プロジェクトディレクトリ内にroute_table.tfファイルを作成し、以下の内容を追加します。
$ vi route_table.tf
# route_table.tf
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
}
resource "aws_route_table_association" "a" {
subnet_id = aws_subnet.main.id
route_table_id = aws_route_table.public.id
}
- resource "aws_route_table" "public": AWSのルートテーブルリソースを定義します。
- vpc_id = aws_vpc.main.id: 作成したVPCのIDを指定します。aws_vpc.main.idは先に作成したVPCのIDを参照します。
- route { ... }: ルートテーブルにルートを追加します。
- cidr_block = "0.0.0.0/0": デフォルトルートを指定します。
- gateway_id = aws_internet_gateway.igw.id: インターネットゲートウェイのIDを指定します。
- aws_internet_gateway.igw.idは先に作成したインターネットゲートウェイのIDを参照します。
- resource "aws_route_table_association" "a": サブネットをルートテーブルに関連付けます。
- subnet_id = aws_subnet.main.id: 作成したサブネットのIDを指定します。
- aws_subnet.main.idは先に作成したサブネットのIDを参照します。
- route_table_id = aws_route_table.public.id: ルートテーブルのIDを指定します。
- aws_route_table.public.idは先に作成したルートテーブルのIDを参照します。
8. セキュリティグループ設定ファイルを作成
プロジェクトディレクトリ内にsecurity_group.tfファイルを作成し、以下の内容を追加します。
$ vi security_group.tf
# security_group.tf
resource "aws_security_group" "web_sg" {
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
- resource "aws_security_group" "web_sg": AWSのセキュリティグループリソースを定義します。
- vpc_id = aws_vpc.main.id: 作成したVPCのIDを指定します。aws_vpc.main.idは先に作成したVPCのIDを参照します。
- ingress { ... }: インバウンドルールを定義します。
- from_port = 80: 開始ポート番号を指定します。
- to_port = 80: 終了ポート番号を指定します。
- protocol = "tcp": プロトコルを指定します。
- cidr_blocks = ["0.0.0.0/0"]: 許可するIP範囲を指定します。0.0.0.0/0は全てのIPアドレスを意味します。
- egress { ... }: アウトバウンドルールを定義します。
- from_port = 0: 開始ポート番号を指定します。
- to_port = 0: 終了ポート番号を指定します。
- protocol = "-1": 全てのプロトコルを意味します。
- cidr_blocks = ["0.0.0.0/0"]: 許可するIP範囲を指定します。
Terraformのプラン作成と適用
次に、Terraformのプランを作成し、適用します。これにより、AWSリソースが実際に作成されます。
Terraformのプラン作成と適用
Terraformの初期化
terraform init
Terraformの初期化を行い、必要なプラグインをダウンロードします。
プランの確認
$ terraform plan
terraform planコマンドは、現在の設定に基づいてTerraformが実行するアクションを表示します。AWSリソースを作成、変更、削除する前に、どのような変更が行われるかを確認することができます。これにより、予期しない変更が行われないように確認することができます。
適用
$ terraform apply
terraform applyコマンドは、terraform planで確認した変更を実際に適用し、AWSリソースを作成、変更、削除します。設定した通りにリソースがプロビジョニングされ、AWSに展開されます。
リソースの確認とクリーンアップ
リソースの確認
リソースが正しく作成されたことを確認するために、AWSマネジメントコンソールにログインし、VPC、サブネット、インターネットゲートウェイなどが作成されていることを確認します。
リソースのクリーンアップ
リソースのクリーンアップは、作成したAWSリソースを削除するプロセスです。これは、不要になったリソースを削除してコストを削減するために重要です。
$ terraform destroy
まとめ
この記事では、WSL2上のUbuntu環境でTerraformを使用してAWSリソースを構築する手順を説明しました。基本的なセットアップから、VPC、サブネット、インターネット接続、セキュリティグループの設定、そしてリソースのクリーンアップまでをカバーしています。この手順を参考にして、さらに複雑なインフラストラクチャを構築してみてください。
Discussion