ECS on Fargateでタスクのログ出力を コンテナ単位で振り分ける [Terraform]

公式ドキュメントに書いてあることをTerraformでやるだけなんですけどね
2021.02.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ちゃだいん(@chazuke4649)です。

知ってる方も多いと思いますが、ECS on Fargateにて、同じタスク定義(およびタスク)にて複数のコンテナを実行する場合、それぞれコンテナごとでCloudWatch Logsの出力先(Log Group)を変更することができます。

調べるまで自分は知らなかったので備忘録として書きたいと思います。
また、公式ドキュメントにはコンソールから実施する方法が記載されており、今回Terraformで実施する機会があったのでそれをご紹介します。

ちなみにより柔軟にログルーティングを行うFireLensについては、以下エントリがわかりやすいのでご覧ください。

概要

基本的な実施方法は、以下公式ドキュメントに記載があります。

上記の手順としては以下となります。

  • ロググループを作成する
  • タスク定義でログ設定を指定する
  • CloudWatch Logsで awslogsコンテナログを表示する

今回はそれをTerraformで行います。とても簡単です。

構成としては、

  • 1サービス、1タスク定義
  • 1タスク内に2つのコンテナ(WEB,APP)

という構成です。

ロググループを作成する

ロググループを複数作成します。

今回はWEBコンテナとAPPコンテナがあり、それぞれロググループを分けます。

よって以下の通り、2つのロググループを作成します。

resource "aws_cloudwatch_log_group" "web" {
  name              = "/ecs/project/dev/web"
  retention_in_days = 30
}

resource "aws_cloudwatch_log_group" "app" {
  name              = "/ecs/project/dev/app"
  retention_in_days = 30
}

タスク定義でログ設定を指定する

タスク定義は以下の通りです。コンテナ定義部分を別途Jsonファイルを参照する形をとっています。

resource "aws_ecs_task_definition" "project-dev-taskdef-app" {
  family                    = "project-dev-taskdef-app"
  cpu                       = 256
  memory                    = 512
  network_mode              = "awsvpc"
  requires_compatibilities  = [ "FARGATE" ]
      container_definitions = file("container_definitions/app_container_definitions.json")
  execution_role_arn        = "arn:aws:iam::123456789012:role/project-ecs-task-execution-role"
  task_role_arn             = aws_iam_role.ecs-app-task-role.arn
}

コンテナ定義は以下の通りです。

それぞれnginxコンテナとphp-fpmコンテナにて、先ほど指定したロググループを指定しています。それだけでOKです。

[
  {
    "name": "nginx",
    "image": "nginx:1.19-alpine",
    "essentials": true,
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-region": "ap-northeast-1",
        "awslogs-stream-prefix": "web",
        "awslogs-group": "/ecs/project/dev/web"
      }
    },
    "portMappings": [
      {
        "protocol": "tcp",
        "containerPort": 80
      }
    ]
  },
  {
    "name": "php-fpm",
    "image": "php:8.0-fpm-alpine",
    "essentials": true,
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-region": "ap-northeast-1",
        "awslogs-stream-prefix": "app",
        "awslogs-group": "/ecs/project/dev/app"
      }
    }
  }
]

上記内容でTerraform applyを行います。

CloudWatch Logsで awslogsコンテナログを表示する

それではCloudWatch logsのロググループを確認します。

コンソールからCloudWatch Logs ロググループを開きます。

以下のように作成したロググループが2つ存在することが確認できます。

ecs/project/dev/webのロググループを開き、ログストリームを選択する以下の通り、WEBコンテナのログが配信されていることが確認できます。

作業としては以上となります。

終わりに

コンテナ単位でロググループを作成し配信する方法をTerraformde行いました。Logsでコンテナ単位でロググループを分けるだけなら簡単に行えることがわかりました。

それではこの辺で。ちゃだいん(@chazuke4649)でした。