👋

Terraformを使ったAWSインフラ構築ガイド: VPCからNATゲートウェイまで

2024/07/03に公開

初めに

この記事では、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