AWS入門:Terrafromを利用したECS環境の構築について -VPC編-

スポンサーリンク
AWS入門:Terrafromを利用したECS環境の構築について -VPC編- 環境構築
AWS入門:Terrafromを利用したECS環境の構築について -VPC編-
この記事は約11分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、Terrafromを利用したECS環境の構築におけるVPCについてご紹介します。

スポンサーリンク

前提

構築するECS環境は下記のサイトをベースにしています。

また、この記事は下記の記事の続きとなっています。

背景

この記事では、ECS環境におけるVPCの構築についてご紹介しています。

構築イメージ図

この記事で構築しようとしているECSの構成図は下記のとおりです。

ファイル作成

ECS環境の構築で作成するファイルは下記のとおりです。

21_learn_terraform-aws-ecs
├── main.tf
├── output.tf
├── variables.tf
├── ecs
│   ├── ecs.tf
│   ├── output.tf
│   └── variables.tf
├── iam
│   ├── iam.tf
│   ├── output.tf
│   └── variables.tf
├── lb
│   ├── lb.tf
│   ├── output.tf
│   └── variables.tf
├── sg
│   ├── output.tf
│   ├── sg.tf
│   └── variables.tf
└── vpc
    ├── output.tf
    ├── variables.tf
    └── vpc.tf

今回は、下記のファイル内容をご紹介します。

  • vpc/vpc.tf
  • vpc/output.tf
  • vpc/variables.tf

vpc/vpc.tf

下記の内容で新規作成します。

# VPC
resource "aws_vpc" "learn_ecs_vpc" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true # DNSホスト名を有効化
  tags = {
    Name = "${var.tag_name}"
  }
}

# Subnet
resource "aws_subnet" "learn_ecs_public_subnet_1a" {
  vpc_id            = aws_vpc.learn_ecs_vpc.id
  cidr_block        = "10.0.0.0/20"
  availability_zone = var.az_a
  tags = {
    Name = "${var.tag_name}"
  }
}

resource "aws_subnet" "learn_ecs_public_subnet_1c" {
  vpc_id            = aws_vpc.learn_ecs_vpc.id
  cidr_block        = "10.0.16.0/20"
  availability_zone = var.az_c
  tags = {
    Name = "${var.tag_name}"
  }
}

# Internet Gateway
resource "aws_internet_gateway" "learn_ecs_igw" {
  vpc_id = aws_vpc.learn_ecs_vpc.id
  tags = {
    Name = "${var.tag_name}"
  }
}

# Route table
resource "aws_route_table" "learn_ecs_rt" {
  vpc_id = aws_vpc.learn_ecs_vpc.id
  tags = {
    Name = "${var.tag_name}"
  }
}

resource "aws_route" "learn_ecs_rt_public" {
  route_table_id         = aws_route_table.learn_ecs_rt.id
  gateway_id             = aws_internet_gateway.learn_ecs_igw.id
  destination_cidr_block = "0.0.0.0/0"
}

# SubnetとRoute tableの関連付け
resource "aws_route_table_association" "learn_ecs_rt_associate_1a" {
  subnet_id      = aws_subnet.learn_ecs_public_subnet_1a.id
  route_table_id = aws_route_table.learn_ecs_rt.id
}

resource "aws_route_table_association" "learn_ecs_rt_associate_1c" {
  subnet_id      = aws_subnet.learn_ecs_public_subnet_1c.id
  route_table_id = aws_route_table.learn_ecs_rt.id
}

vpc/output.tf

下記の内容で新規作成します。

output "vpc_id" {
    value = "${aws_vpc.learn_ecs_vpc.id}"
}

output "public_a_id" {
    value = "${aws_subnet.learn_ecs_public_subnet_1a.id}"
}

output "public_c_id" {
    value = "${aws_subnet.learn_ecs_public_subnet_1c.id}"
}

vpc/variables.tf

下記の内容で新規作成します。

variable "region"      {}
variable "az_a"        {}
variable "az_c"        {}
variable "name_prefix" {}
variable "tag_name"    {}
variable "tag_group"   {}

解説

vpc/vpc.tf

このTerraformコードは、Amazon Web Services(AWS)上にVirtual Private Cloud(VPC)を構築するためのリソース定義です。以下は、それぞれのリソースの目的と設定の概要です。

  1. aws_vpc リソース (learn_ecs_vpc):
    • VPCを定義しています。
    • cidr_block: VPCのCIDRブロックを指定しています。
    • enable_dns_support および enable_dns_hostnames: DNSのサポートとホスト名を有効にしています。
    • タグ: タグを使用してリソースに名前を付けています。
  2. aws_subnet リソース (learn_ecs_public_subnet_1a および learn_ecs_public_subnet_1c):
    • パブリックなサブネットを定義しています。アベイラビリティゾーン 1a および 1c にそれぞれサブネットを作成しています。
    • vpc_id: サブネットが所属するVPCを指定しています。
    • cidr_block: サブネットのCIDRブロックを指定しています。
    • availability_zone: サブネットが存在するアベイラビリティゾーンを指定しています。
    • タグ: タグを使用してリソースに名前を付けています。
  3. aws_internet_gateway リソース (learn_ecs_igw):
    • インターネットゲートウェイを定義しています。
    • vpc_id: インターネットゲートウェイが接続されるVPCを指定しています。
    • タグ: タグを使用してリソースに名前を付けています。
  4. aws_route_table リソース (learn_ecs_rt):
    • ルートテーブルを定義しています。
    • vpc_id: ルートテーブルが所属するVPCを指定しています。
    • タグ: タグを使用してリソースに名前を付けています。
  5. aws_route リソース (learn_ecs_rt_public):
    • パブリックなルートを定義しています。
    • route_table_id: ルートが関連付けられるルートテーブルを指定しています。
    • gateway_id: ルートが指すターゲットゲートウェイ(ここではインターネットゲートウェイ)を指定しています。
    • destination_cidr_block: ルートの宛先CIDRブロックを指定しています。
  6. aws_route_table_association リソース (learn_ecs_rt_associate_1a および learn_ecs_rt_associate_1c):
    • サブネットとルートテーブルを関連付けています。

これらのリソース定義を使用して、VPC、サブネット、インターネットゲートウェイ、ルートテーブルなどを組み合わせて、AWS上にVPCのネットワークインフラストラクチャを構築しています。

vpc/output.tf

これらのコード行は、Terraformコード内で出力(Output)を定義しています。これにより、特定のリソースの情報やIDを他のTerraformコードや外部に公開できます。以下は、各出力の説明です:

  1. output "vpc_id":
    • この出力は、VPCのIDを外部に公開します。
    • value = "${aws_vpc.learn_ecs_vpc.id}": aws_vpc.learn_ecs_vpc.id は、aws_vpc リソースで作成されたVPCのIDです。
  2. output "public_a_id":
    • この出力は、アベイラビリティゾーン 1a にあるパブリックサブネットのIDを外部に公開します。
    • value = "${aws_subnet.learn_ecs_public_subnet_1a.id}": aws_subnet.learn_ecs_public_subnet_1a.id は、aws_subnet リソースで作成されたパブリックサブネット 1a のIDです。
  3. output "public_c_id":
    • この出力は、アベイラビリティゾーン 1c にあるパブリックサブネットのIDを外部に公開します。
    • value = "${aws_subnet.learn_ecs_public_subnet_1c.id}": aws_subnet.learn_ecs_public_subnet_1c.id は、aws_subnet リソースで作成されたパブリックサブネット 1c のIDです。

これらの出力を定義することで、このTerraformコードを適用した後に、作成されたリソースのIDを取得して表示できるようになります。他のTerraformコードやプロジェクトでこれらの出力を利用することで、関連するリソースの情報を共有することができます。たとえば、別のプロジェクトでこれらの出力を使用して、VPC内の特定のサブネットにリソースをデプロイすることができます。

vpc/variables.tf

このコードは、Terraformの変数(Variables)を定義していますが、変数に初期値が指定されていないため、変数の値は別途提供する必要があります。変数はコード内のパラメータをパラメータ化するために使用され、コードの再利用性と管理性を向上させる役割を果たします。以下が各変数の説明です:

  1. variable "region":
    • リージョン(Region)を指定するための変数です。リソースがデプロイされるAWSのリージョンを指定します。
  2. variable "az_a":
    • アベイラビリティゾーン A の名前を指定するための変数です。アベイラビリティゾーンは、AWSのデータセンター内での冗長性と耐障害性を提供するためのエリアです。
  3. variable "az_c":
    • アベイラビリティゾーン C の名前を指定するための変数です。複数のアベイラビリティゾーンを使用することで、高可用性と冗長性を確保することができます。
  4. variable "name_prefix":
    • リソース名のプレフィックスを指定するための変数です。リソースの名前を一意にするために使用されます。
  5. variable "tag_name":
    • リソースに適用されるタグの名前を指定するための変数です。タグはリソースに情報を付加するために使用され、リソースの識別や整理に役立ちます。
  6. variable "tag_group":
    • リソースに適用されるタグのグループを指定するための変数です。タグをグループ化して整理する際に使用します。

これらの変数には、初期値が指定されていないため、Terraform実行時にこれらの変数の値を提供する必要があります。変数の提供方法は、Terraformのコマンドライン引数、環境変数、または .tfvars ファイルを使用して行うことができます。例えば、コマンドラインから実行する場合は -var オプションを使用して値を渡すことができます。

おわりに

今日は、Terrafromを利用したECR環境の構築するために必要なファイルの一部をご紹介しました。残りのファイルも明日以降、ご紹介していきます。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました