こんにちは。よっしーです(^^)
今日は、Terrafromを利用したECS環境の構築におけるクラスタやサービス、タスク定義についてご紹介します。
前提
構築するECS環境は下記のサイトをベースにしています。
また、この記事は下記の記事の続きとなっています。
背景
この記事では、ECS環境におけるクラスタやサービス、タスク定義の構築についてご紹介しています。
構築イメージ図
この記事で構築しようとしている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
今回は、下記のファイル内容をご紹介します。
- ecs/ecs.tf
- ecs/output.tf
- ecs/variables.tf
ecs/ecs.tf
下記の内容で新規作成します。
resource "aws_ecs_cluster" "learn_ecs_cluster" {
name = var.tag_name
}
locals {
container_name = "learn_ecs_nginx"
}
resource "aws_ecs_task_definition" "learn_ecs_task" {
family = "learn-ecs-task-definition"
cpu = 512
memory = 1024
requires_compatibilities = ["FARGATE"]
execution_role_arn = "${var.execution_role_arn}"
network_mode = "awsvpc"
container_definitions = <<-EOS
[
{
"name": "${local.container_name}",
"image": "${var.repository_url}:0.0.1",
"cpu": 0,
"portMappings": [
{
"name": "${local.container_name}",
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp",
"appProtocol": "http"
}
],
"essential": true,
"environment": [],
"environmentFiles": [],
"mountPoints": [],
"volumesFrom": [],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-create-group": "true",
"awslogs-group": "/ecs/learn-ecs-task-definition",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
}
}
]
EOS
runtime_platform {
cpu_architecture = "X86_64"
operating_system_family = "LINUX"
}
}
resource "aws_ecs_service" "learn_ecs_service" {
name = var.tag_name
cluster = aws_ecs_cluster.learn_ecs_cluster.id
task_definition = aws_ecs_task_definition.learn_ecs_task.arn
launch_type = "FARGATE"
desired_count = 2
network_configuration {
subnets = [
"${var.public_a_id}",
"${var.public_c_id}"
]
security_groups = [
"${var.sg_id}"
]
assign_public_ip = true
}
load_balancer {
target_group_arn = "${var.lb_target_group_arn}"
container_name = local.container_name
container_port = 80
}
}
ecs/output.tf
下記の内容で新規作成します。 出力する値がないため空ファイルを作成しています。
(空)
ecs/variables.tf
下記の内容で新規作成します。
variable "region" {}
variable "az_a" {}
variable "az_c" {}
variable "name_prefix" {}
variable "tag_name" {}
variable "tag_group" {}
variable "execution_role_arn" {}
variable "public_a_id" {}
variable "public_c_id" {}
variable "sg_id" {}
variable "lb_target_group_arn" {}
variable "repository_url" {
default = "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/learn_aws_ecr"
}
解説
ecs/ecs.tf
このコードは、Terraformを使用してAWS上でECS(Elastic Container Service)クラスター、タスク定義、およびECSサービスをデプロイするためのものです。ECSはコンテナ化されたアプリケーションを実行・管理するためのサービスです。
以下にコード内の各リソースの解説を行います。
aws_ecs_cluster
リソース(learn_ecs_cluster): このリソースは、ECSクラスターを定義しています。name
にはvar.tag_name
で指定された名前が使われます。aws_ecs_task_definition
リソース(learn_ecs_task): このリソースは、タスク定義を定義しています。タスク定義は、ECSサービスによって実行されるコンテナ化されたアプリケーションの設定を指定します。タスク定義の詳細な設定が含まれており、主にコンテナの定義とログ設定が行われています。aws_ecs_service
リソース(learn_ecs_service): このリソースは、ECSサービスを定義しています。ECSサービスは、ECSクラスター上でタスク定義に基づいてコンテナを実行するためのリソースです。サービスの詳細設定が含まれており、タスク定義、ネットワーク構成、ロードバランサーの設定などが指定されています。
上記のコードにはいくつかの変数が使用されています。これらの変数は、実行時に具体的な値が提供される必要があります。例えば、var.tag_name
、var.public_a_id
、var.public_c_id
などが該当します。
このコードによって、ECSクラスターが作成され、そのクラスター内でタスク定義をもとにコンテナが起動されるサービスがデプロイされます。タスクはタスク定義に指定されたコンテナイメージを使用して実行され、タスク数は desired_count
パラメータで指定されています。また、タスクはFargateというサーバーレスのコンテナ実行環境で実行されます。最後に、ロードバランサーによってトラフィックが分散されるための設定も含まれています。
aws_ecs_task_definition リソース
AWS Elastic Container Service (ECS) タスク定義(Task Definition)を定義しています。ECSタスク定義は、コンテナイメージ、リソース割り当て、ネットワーク設定などを含む、ECSクラスター上で実行されるコンテナタスクの設定を表します。以下がコード内の各パラメータの説明です。
family
: タスク定義のファミリ名を指定します。一連の関連するタスクをグループ化するための識別子です。cpu
およびmemory
: タスクに割り当てるCPUとメモリのリソースを指定します。requires_compatibilities
: タスクがFargateで実行されることを示すために、”FARGATE” を指定しています。execution_role_arn
: タスクが実行される際のIAMロールのARNを指定します。network_mode
: タスクのネットワークモードを指定します。”awsvpc” を指定することで、タスク単位のネットワークを使用します。container_definitions
: タスク内のコンテナの設定をJSON形式で指定します。ここでコンテナの名前、イメージ、ポートマッピング、環境変数、ログ設定などが定義されます。runtime_platform
: タスクが実行されるランタイムプラットフォームに関する設定です。ここではX86_64のLinuxを指定しています。
このタスク定義は、local.container_name
で指定されたコンテナ名と、var.repository_url
で指定されたコンテナイメージを使用しています。また、コンテナは80番ポートでTCPプロトコルを使用して待ち受けます。
ログ設定は、CloudWatch Logsを使用してタスクのログを収集するためのものです。タスクのログは /ecs/learn-ecs-task-definition
というロググループに保存され、リージョンとストリームのプレフィックスが指定されています。
このタスク定義は、Terraformが管理するECSクラスター内で実行されるコンテナタスクを定義します。
aws_ecs_service リソース
AWS Elastic Container Service (ECS) サービス(Service)を定義しています。ECSサービスは、ECSクラスター内でタスク定義に基づいてコンテナを実行するためのリソースです。以下がコード内の各パラメータの説明です。
name
: サービスの名前を指定します。var.tag_name
で指定された名前が使用されます。cluster
: サービスが属するECSクラスターのIDを指定します。ここではaws_ecs_cluster.learn_ecs_cluster.id
でクラスターのIDを参照しています。task_definition
: サービスが実行するタスクの定義を指定します。ここではaws_ecs_task_definition.learn_ecs_task.arn
でタスク定義のARNを参照しています。launch_type
: サービスがFargateで実行されることを示すために “FARGATE” を指定しています。desired_count
: サービスが起動するタスクの数を指定します。network_configuration
: サービスのネットワーク構成を指定します。ここでは、パブリックサブネットを使用し、指定されたセキュリティグループを適用しています。load_balancer
: サービスが利用するロードバランサーの設定を指定します。ターゲットグループのARNやコンテナ名、ポート番号などが指定されています。
このサービス定義によって、ECSクラスター上でFargateタスクが実行され、指定されたターゲットグループにトラフィックが分散されることが期待されます。このコードは、Terraformを使用してAWS上でECSサービスをデプロイする手段として使用されることを想定しています。
ecs/variables.tf
提供されたコードは、変数(Variables)の宣言を行っており、Terraformコード内で利用される値を格納するためのものです。変数はコードの柔軟性と再利用性を高めるために使用されます。以下が変数の説明です。
region
: AWSのリージョンを指定するための変数です。az_a
およびaz_c
: Availability Zone(AZ)を指定するための変数です。name_prefix
: リソースに付けるプレフィックス(接頭辞)を指定する変数です。tag_name
およびtag_group
: リソースに付けるタグの値を指定するための変数です。execution_role_arn
: ECSタスク実行ロールのARNを指定するための変数です。public_a_id
およびpublic_c_id
: パブリックサブネットのIDを指定するための変数です。sg_id
: セキュリティグループのIDを指定するための変数です。lb_target_group_arn
: ロードバランサーのターゲットグループのARNを指定するための変数です。repository_url
: ECR(Elastic Container Registry)リポジトリのURLを指定するための変数です。デフォルト値が指定されていますが、必要に応じて上書きすることができます。
これらの変数は、Terraformコード内で ${var.変数名}
の形式で参照され、変数に設定された値が使用されます。実行時には、変数の値を指定することで特定の環境に合わせたコンフィグレーションを行うことができます。repository_url
のように、デフォルト値を指定することも可能です。
おわりに
今日は、Terrafromを利用したECR環境の構築するために必要なファイルの一部をご紹介しました。残りのファイルも明日以降、ご紹介していきます。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント