こんにちは。よっしーです(^^)
今日は、Terrafromを利用したECS環境の構築についてご紹介します。
前提
構築するECS環境は下記のサイトをベースにしています。
背景
ECS環境を構築する機会がありましたので、上記のサイトを参考にTerraformで構築してみました。
作業ディレクトリの作成
下記のコマンドで作業ディレクトリを作成します。
mkdir 21_learn_terraform-aws-ecs
cd 21_learn_terraform-aws-ecs
使用するコマンドのバージョン指定
下記のコマンドを実行します。
asdf local terraform 1.5.3
asdf local awscli 2.13.2
もし、指定のバージョンがインストールされていなければ、下記の手順でインストールできます。
# terraform
asdf install terraform 1.5.4
# awscli
asdf install awscli 2.13.7
詳しくは下記のサイトをご覧ください。
下記のコマンドで指定のバージョンが利用できることを確認します。
% terraform --version
Terraform v1.5.4
on darwin_arm64
% aws --version
aws-cli/2.13.7 Python/3.11.4 Darwin/22.5.0 exe/x86_64 prompt/off
構築イメージ図
構築しようとしている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
作成するファイルが多いため何回かに分けてご紹介します。
今回は、下記のファイル内容をご紹介します。
- main.tf
- output.tf
- variables.tf
main.tf
下記の内容で新規作成します。
terraform {
cloud {
organization = "(自身の組織名を入力)"
workspaces {
name = "learn-aws-ecs"
}
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "ap-northeast-1"
}
# VPC
module "vpc" {
source = "./vpc"
name_prefix = var.name_prefix
region = var.region
az_a = var.az_a
az_c = var.az_c
tag_name = var.tag_name
tag_group = var.tag_group
}
# SG
module "sg" {
source = "./sg"
name_prefix = var.name_prefix
region = var.region
az_a = var.az_a
az_c = var.az_c
tag_name = var.tag_name
tag_group = var.tag_group
vpc_id = module.vpc.vpc_id
}
# ECS
module "ecs" {
source = "./ecs"
name_prefix = var.name_prefix
region = var.region
az_a = var.az_a
az_c = var.az_c
tag_name = var.tag_name
tag_group = var.tag_group
lb_target_group_arn = module.lb.lb_target_group_arn
execution_role_arn = module.iam.execution_role_arn
public_a_id = module.vpc.public_a_id
public_c_id = module.vpc.public_c_id
sg_id = module.sg.sg_id
}
# IAM
module "iam" {
source = "./iam"
name_prefix = var.name_prefix
region = var.region
az_a = var.az_a
az_c = var.az_c
tag_name = var.tag_name
tag_group = var.tag_group
}
# LB
module "lb" {
source = "./lb"
name_prefix = var.name_prefix
region = var.region
az_a = var.az_a
az_c = var.az_c
tag_name = var.tag_name
tag_group = var.tag_group
vpc_id = module.vpc.vpc_id
public_a_id = module.vpc.public_a_id
public_c_id = module.vpc.public_c_id
sg_id = module.sg.sg_id
}
output.tf
下記の内容で新規作成します。
output "lb_dns_name" {
value = module.lb.lb_dns_name
}
variables.tf
下記の内容で新規作成します。
variable "region" {
default = "ap-northeast-1"
}
variable "az_a" {
default = "ap-northeast-1a"
}
variable "az_c" {
default = "ap-northeast-1c"
}
variable "name_prefix" {
default = "lae"
}
variable "tag_name" {
default = "learn-aws-ecr"
}
variable "tag_group" {
default = "learn-aws-ecr"
}
解説
main.tf
これはTerraformのコードで、AWSのリソースをデプロイするために使用されるものです。Terraformは、インフラストラクチャをコードとして管理し、変更を追跡し、自動化するためのツールです。このコードは、AWSのインフラストラクチャをセットアップするために必要なリソースをモジュールとして定義しています。
以下は、このコードのセクションごとの概要です。
terraform
ブロック:cloud
セクション: このブロックで、Terraform Cloudの組織名とワークスペース名を指定しています。required_providers
セクション: このセクションで、使用するプロバイダ(ここではAWS)の詳細情報を指定しています。required_version
: このコードの実行に必要なTerraformのバージョンを指定しています。
provider "aws"
ブロック: AWSプロバイダの設定を行っています。このコードでは、AWSリソースを管理するためにAWSプロバイダが使用されます。ここで指定されたリージョンは「ap-northeast-1」(東京リージョン)です。module "vpc"
ブロック:./vpc
というパスにあるモジュールを呼び出しています。このモジュールは、Virtual Private Cloud (VPC) 関連のリソースを設定するために使用されます。変数(var)が複数渡されています。module "sg"
ブロック:./sg
パスにあるモジュールを呼び出しています。このモジュールはセキュリティグループ(Security Group)に関連するリソースを設定するために使用されます。VPCのIDなどの情報を渡しています。module "ecs"
ブロック:./ecs
パスにあるモジュールを呼び出しています。このモジュールはAmazon Elastic Container Service (ECS) 関連のリソースを設定するために使用されます。ロードバランサーやIAMロール、VPC情報などが渡されています。module "iam"
ブロック:./iam
パスにあるモジュールを呼び出しています。このモジュールはAWS Identity and Access Management (IAM) 関連のリソースを設定するために使用されます。module "lb"
ブロック:./lb
パスにあるモジュールを呼び出しています。このモジュールはロードバランサー(Load Balancer)に関連するリソースを設定するために使用されます。VPCやセキュリティグループ情報が渡されています。
このコード全体を通じて、Terraformのモジュールを使用して、AWSインフラストラクチャをセットアップし、それぞれのモジュールで特定のリソースや設定を管理しています。各モジュールは個別のディレクトリに配置され、そのディレクトリ内でリソースの定義と設定が行われています。
output.tf
このコードは、Terraformコード内で出力(Output)を定義しています。出力を定義することで、Terraformが特定のリソースの情報や値を外部に提供できるようになります。この例では、ロードバランサー(Load Balancer)のDNS名(Domain Name System name)を外部に公開するための出力を定義しています。
output
ブロック: この部分で、出力を定義しています。output
ブロックは、Terraformコード内でどのような情報を外部に公開するかを指定するために使用されます。"lb_dns_name"
: この出力の名前です。外部に提供される情報の識別子となります。他のTerraformコードやモジュールからこの名前で参照できます。value = module.lb.lb_dns_name
: この出力が持つ値を指定しています。module.lb.lb_dns_name
は、別のモジュールで定義されたロードバランサーのDNS名にアクセスするための指定です。これにより、この出力はロードバランサーのDNS名を外部に提供する役割を果たします。
出力を定義することで、Terraformはプラン実行時や適用後に、このロードバランサーのDNS名を取得して表示することができます。他のコードやプロジェクトでこの出力を利用することで、作成されたリソースの情報を共有することができます。例えば、別のTerraformプロジェクトでこの出力をインポートして、ロードバランサーのDNS名を別のリソースに関連付けることができます。
variables.tf
この部分は、Terraformの変数(Variables)を定義しています。変数は、Terraformコード内で使用される値をパラメータ化するための仕組みです。これにより、コード内の値を中央で管理しやすくなり、再利用性や柔軟性が向上します。
各変数の説明を見てみましょう:
variable "region"
: リージョン(Region)を指定するための変数です。デフォルト値として「ap-northeast-1」(東京リージョン)が設定されています。variable "az_a"
: サブネットが存在するアベイラビリティゾーン A の名前を指定するための変数です。デフォルト値として「ap-northeast-1a」が設定されています。variable "az_c"
: サブネットが存在するアベイラビリティゾーン C の名前を指定するための変数です。デフォルト値として「ap-northeast-1c」が設定されています。variable "name_prefix"
: リソース名のプレフィックスを指定するための変数です。デフォルト値として「lae」が設定されています。variable "tag_name"
: リソースのタグ(Tag)の名前を指定するための変数です。デフォルト値として「learn-aws-ecr」が設定されています。variable "tag_group"
: リソースのタグ(Tag)のグループを指定するための変数です。デフォルト値として「learn-aws-ecr」が設定されています。
これらの変数は、このコード内の各モジュールに渡され、モジュール内で使用される値を指定するために利用されます。変数を使用することで、同じコードを異なる環境にデプロイする際に、変更が必要な値を簡単に調整できるようになります。また、変数のデフォルト値を設定することで、変数が指定されなかった場合に備えて適切な値を持っていることが保証されます。
おわりに
今日は、Terrafromを利用したECR環境の構築するために必要なファイルの一部をご紹介しました。残りのファイルも明日以降、ご紹介していきます。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント