こんにちは。よっしーです(^^)
今日は、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)を構築するためのリソース定義です。以下は、それぞれのリソースの目的と設定の概要です。
aws_vpc
リソース (learn_ecs_vpc
):- VPCを定義しています。
cidr_block
: VPCのCIDRブロックを指定しています。enable_dns_support
およびenable_dns_hostnames
: DNSのサポートとホスト名を有効にしています。- タグ: タグを使用してリソースに名前を付けています。
aws_subnet
リソース (learn_ecs_public_subnet_1a
およびlearn_ecs_public_subnet_1c
):- パブリックなサブネットを定義しています。アベイラビリティゾーン
1a
および1c
にそれぞれサブネットを作成しています。 vpc_id
: サブネットが所属するVPCを指定しています。cidr_block
: サブネットのCIDRブロックを指定しています。availability_zone
: サブネットが存在するアベイラビリティゾーンを指定しています。- タグ: タグを使用してリソースに名前を付けています。
- パブリックなサブネットを定義しています。アベイラビリティゾーン
aws_internet_gateway
リソース (learn_ecs_igw
):- インターネットゲートウェイを定義しています。
vpc_id
: インターネットゲートウェイが接続されるVPCを指定しています。- タグ: タグを使用してリソースに名前を付けています。
aws_route_table
リソース (learn_ecs_rt
):- ルートテーブルを定義しています。
vpc_id
: ルートテーブルが所属するVPCを指定しています。- タグ: タグを使用してリソースに名前を付けています。
aws_route
リソース (learn_ecs_rt_public
):- パブリックなルートを定義しています。
route_table_id
: ルートが関連付けられるルートテーブルを指定しています。gateway_id
: ルートが指すターゲットゲートウェイ(ここではインターネットゲートウェイ)を指定しています。destination_cidr_block
: ルートの宛先CIDRブロックを指定しています。
aws_route_table_association
リソース (learn_ecs_rt_associate_1a
およびlearn_ecs_rt_associate_1c
):- サブネットとルートテーブルを関連付けています。
これらのリソース定義を使用して、VPC、サブネット、インターネットゲートウェイ、ルートテーブルなどを組み合わせて、AWS上にVPCのネットワークインフラストラクチャを構築しています。
vpc/output.tf
これらのコード行は、Terraformコード内で出力(Output)を定義しています。これにより、特定のリソースの情報やIDを他のTerraformコードや外部に公開できます。以下は、各出力の説明です:
output "vpc_id"
:- この出力は、VPCのIDを外部に公開します。
value = "${aws_vpc.learn_ecs_vpc.id}"
:aws_vpc.learn_ecs_vpc.id
は、aws_vpc
リソースで作成されたVPCのIDです。
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です。
- この出力は、アベイラビリティゾーン
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)を定義していますが、変数に初期値が指定されていないため、変数の値は別途提供する必要があります。変数はコード内のパラメータをパラメータ化するために使用され、コードの再利用性と管理性を向上させる役割を果たします。以下が各変数の説明です:
variable "region"
:- リージョン(Region)を指定するための変数です。リソースがデプロイされるAWSのリージョンを指定します。
variable "az_a"
:- アベイラビリティゾーン A の名前を指定するための変数です。アベイラビリティゾーンは、AWSのデータセンター内での冗長性と耐障害性を提供するためのエリアです。
variable "az_c"
:- アベイラビリティゾーン C の名前を指定するための変数です。複数のアベイラビリティゾーンを使用することで、高可用性と冗長性を確保することができます。
variable "name_prefix"
:- リソース名のプレフィックスを指定するための変数です。リソースの名前を一意にするために使用されます。
variable "tag_name"
:- リソースに適用されるタグの名前を指定するための変数です。タグはリソースに情報を付加するために使用され、リソースの識別や整理に役立ちます。
variable "tag_group"
:- リソースに適用されるタグのグループを指定するための変数です。タグをグループ化して整理する際に使用します。
これらの変数には、初期値が指定されていないため、Terraform実行時にこれらの変数の値を提供する必要があります。変数の提供方法は、Terraformのコマンドライン引数、環境変数、または .tfvars
ファイルを使用して行うことができます。例えば、コマンドラインから実行する場合は -var
オプションを使用して値を渡すことができます。
おわりに
今日は、Terrafromを利用したECR環境の構築するために必要なファイルの一部をご紹介しました。残りのファイルも明日以降、ご紹介していきます。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント