AWS入門:Terrafromを利用したECS環境の構築について -クラスタ、サービスとタスク定義編-

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

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

今日は、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はコンテナ化されたアプリケーションを実行・管理するためのサービスです。

以下にコード内の各リソースの解説を行います。

  1. aws_ecs_cluster リソース(learn_ecs_cluster): このリソースは、ECSクラスターを定義しています。name には var.tag_name で指定された名前が使われます。
  2. aws_ecs_task_definition リソース(learn_ecs_task): このリソースは、タスク定義を定義しています。タスク定義は、ECSサービスによって実行されるコンテナ化されたアプリケーションの設定を指定します。タスク定義の詳細な設定が含まれており、主にコンテナの定義とログ設定が行われています。
  3. aws_ecs_service リソース(learn_ecs_service): このリソースは、ECSサービスを定義しています。ECSサービスは、ECSクラスター上でタスク定義に基づいてコンテナを実行するためのリソースです。サービスの詳細設定が含まれており、タスク定義、ネットワーク構成、ロードバランサーの設定などが指定されています。

上記のコードにはいくつかの変数が使用されています。これらの変数は、実行時に具体的な値が提供される必要があります。例えば、var.tag_namevar.public_a_idvar.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コード内で利用される値を格納するためのものです。変数はコードの柔軟性と再利用性を高めるために使用されます。以下が変数の説明です。

  1. region: AWSのリージョンを指定するための変数です。
  2. az_a および az_c: Availability Zone(AZ)を指定するための変数です。
  3. name_prefix: リソースに付けるプレフィックス(接頭辞)を指定する変数です。
  4. tag_name および tag_group: リソースに付けるタグの値を指定するための変数です。
  5. execution_role_arn: ECSタスク実行ロールのARNを指定するための変数です。
  6. public_a_id および public_c_id: パブリックサブネットのIDを指定するための変数です。
  7. sg_id: セキュリティグループのIDを指定するための変数です。
  8. lb_target_group_arn: ロードバランサーのターゲットグループのARNを指定するための変数です。
  9. repository_url: ECR(Elastic Container Registry)リポジトリのURLを指定するための変数です。デフォルト値が指定されていますが、必要に応じて上書きすることができます。

これらの変数は、Terraformコード内で ${var.変数名} の形式で参照され、変数に設定された値が使用されます。実行時には、変数の値を指定することで特定の環境に合わせたコンフィグレーションを行うことができます。repository_url のように、デフォルト値を指定することも可能です。

おわりに

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

よっしー
よっしー

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

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

コメント

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