コンテンツにスキップ

Amazon ECS上のコンテナログを、AWS FireLensを使ってAmazon CloudWatch Logsに送信する

概要

このページでは、Amazon ECS上で動作するコンテナのログをAWS FireLensを介してAmazon CloudWatch Logsに送信する方法について説明します。

ℹ️ EponaではAmazon ECSのうち、AWS Fargateを対象にしています。

また、合わせてログドライバーとAWS FireLensに関しても、簡単に記載します。

このページの内容と、patternとの関連

このページの記載内容は、cd_pipeline_backend patternが構築する AWS CodeDeployで使用するタスク定義内(taskdef.json)に組み込むことを想定しています。

また、AWS CodeDeployのデプロイ先となるAWS Fargateはpublic_traffic_container_service patternで構築されます。

このページの内容に関連するhow_to

このページの手順で、Javaのスタックトレースのような改行を含むログをAmazon CloudWatch Logsに転送すると、 改行ごとに別のログエントリとして取り扱われます。
このページでは主にFluent Bitを使用した手順を紹介していますが、複数行のログを1つのログエントリに集約する場合は、Fluentdを使用する必要があります。

複数行のログを扱う必要がある場合は、このページの内容に加えて 複数行で出力されるログをひとつのログに集約する を参照してください。

コンテナのログ設定

タスク内で動作するコンテナのログ出力先は、logConfigurationで設定します。

タスク定義の作成

コンテナの出力するログを取得する仕組みはログドライバーと呼ばれ、logConfiguration内のlogDriverでどのようなログドライバーを使うか指定できます。

ストレージとログ記録

⚠️ AWS Fargateを使用し、かつlogConfigurationを設定しない場合はコンテナのログを確認できなくなります。

ログドライバーを適切に設定することで、コンテナのログ出力先を制御できます。

AWS FireLensとは

AWS FireLensは、Fluent BitまたはFluentdと合わせて動作するログドライバーです。

Firelens の発表 – コンテナログの新たな管理方法

カスタムログルーティング

具体的には、以下の手順で導入します。

  • タスク定義内に、Fluent BitまたはFluentdのコンテナを追加
  • 各コンテナのログドライバーとしてawsfirelensを指定し、ログ送信先を設定

ℹ️ 特に理由がなければ、AWSが提供しているAWS for Fluent Bitイメージを利用しましょう。

つまり、awsfirelensログドライバーを使用するために、Fluent BitまたはFluentdのコンテナをタスク定義に追加する必要があります。

コンテナのログをAmazon CloudWatch Logsに送信するだけであれば、awslogsログドライバーで実現可能です。

awslogs ログドライバーを使用する

awsfirelensログドライバーを使用することで、Amazon ECSメタデータの付与、Fluent BitまたはFluentdを使ったログの制御を行えるメリットがあります。

Amazon ECS メタデータの使用

特にDatadogが利用できる場合、AWS FireLensおよびAmazon CloudWatch Logsを経由してのログ集約をおすすめします。
この時、AWS FireLensにより付与されたメタデータも有効に利用できます。

詳細は、次の2つのpatternのドキュメントを参照してください。

タスク定義でAWS FireLensを使い、Amazon CloudWatch Logsにログを送信する

AWS FireLensおよびAWS for Fluent Bitイメージを使い、Amazon CloudWatch Logsにログをルーティングを行う方法を記載します。

基本的な考え方、設定内容は、以下も参考にしてください。

FireLens 設定を使用するタスク定義の作成

必要なAmazon CloudWatch Logsのロググループは、以下の和になります。

  • Fluent Bitコンテナ用のロググループ
  • 他のコンテナ用のロググループ

これらのロググループはpublic_traffic_container_service patternを使い、明示的に作成するよう構成してください。

タスク内に組み込むFluent Bitのコンテナ定義の例は、以下のようになります。

ℹ️ ここでは、利用するリージョンを東京と想定して記載しています。
ℹ️ [...]の部分は、サービスなどに応じてわかりやすい名前を指定してください。
ℹ️ Fluet Bit自身のログは、awslogsログドライバーでAmazon CloudWatch Logsに直接送信してください。

   {
      "essential": true,
      "image": "906394416424.dkr.ecr.ap-northeast-1.amazonaws.com/aws-for-fluent-bit:latest",
      "name": "log_router",
      "firelensConfiguration": {
        "type": "fluentbit"
      },
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "[ロググループ名]",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "[ログストリームの接頭辞]"
        }
      },
      "memoryReservation": 50
    },

AWS for Fluent Bitイメージは、使用するリージョンによって選択すべきAmazon ECRも異なります。
東京リージョン以外で使用する場合は、以下を参照してimageを指定してください。

AWS for Fluent Bit イメージの使用

タスク内で動作する他のコンテナのlogConfigurationは、以下のように設定します。

      "logConfiguration": {
        "logDriver":"awsfirelens",
        "options": {
          "Name": "cloudwatch",
          "region": "ap-northeast-1",
          "log_group_name": "[ロググループ名]",
          "auto_create_group": "false",
          "log_stream_prefix": "[ログストリームの接頭辞]"
        }
      },

logDriverとしてawsfirelensを指定し、optionsNameではcloudwatchを指定します。
これでAWS FireLensと前述のFluent Bitのコンテナを介して、Amazon CloudWatch Logsにログを送信できます。

この定義で指定したoptionsは、以下のドキュメントにも記載がある通り、Fluent Bitのコンテナに連携され設定ファイルの内容に組み込まれます。

FireLens 設定を使用するタスク定義の作成

これで、コンテナのログをAWS FireLensを介してAmazon CloudWatch Logsへ送信できるようになりました。


※ このドキュメントはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。

※ このドキュメントに記載されている会社名、製品名は、各社の登録商標または商標です。

© 2021 TIS Inc.