Amazon ECSログ

Amazon Elastic Container Service (ECS)はコンテナー管理サービスで、デプロイの自動化、管理、コンテナベースアプリケーションのスケーリングを行えます。

Amazon ECSログ管理の利点:

  • コンテナーアプリケーションの問題を特定しトラブルシュートします。
  • アプリケーションの円滑な動作を確保します。
  • アプリケーションやインフラストラクチャのパフォーマンスを分析します。

目次

ECSではAmazon Elastic Compute Cloud (EC2)とAWS Fargateの2つのローンチタイプをサポートしています。
EC2を用いると、ECSクラスター内のEC2インスタンスで稼働しているコンテナーアプリケーションのインフラへのアクセスと制御を行えます。
Fargateの場合、サーバーレスにアプリケーションを管理し、AWSでインフラとコンテナを管理します。

Amazon ECSからアプリケーションログへログを転送するために、下記いずれかのローンチタイプを選択します。

ローンチタイプ EC2 Fargate
Site24x7サーバー監視エージェントでのログ収集 有効 無効
Lambda関数を使用したCloudWatch経由でのログ収集 有効 有効
FireLensプラグインを使用したログ収集 有効 有効

Site24x7サーバー監視エージェントでのログ収集

設定方法は次のとおりです。

  1. Site24x7にログインします。
  2. Site24x7サーバー監視エージェント(Windows | Linux)をEC2インスタンスにダウンロードし、インストールします。
  3. [管理]→[アプリケーションログ]→[ログプロファイル]→[ログプロファイルを追加]に移動します。
  4. ログの種類のドロップダウンから[AWS ECSログ]を選択します。
  5. デフォルトで、次のパスにログを書き込むようECSコンテナーは設定されています。
    Widows: C:\ProgramData\Docker\containers\*\*.log
    Linux: /var/lib/docker/containers/*/*.log
  6. 「このログプロファイルをこれらのサーバに関連付ける」項目でサーバーを選択します。
  7. [保存]をクリックします。

ログの種類を編集するには、[管理]→[アプリケーションログ]→[ログの種類]に移動し、特定のログの種類名をクリックしてください。

ログパターン

json $log$ $stream$ $time:date:yyyy-MM-dd'T'HH:mm:ss.SSS'Z'$ $container_name$ $container_hostname$ $containerid$ $cluster_name$ $image$ $image_id$ $Labels:json-object$

デフォルトで次のサンプルを基にAWS ECSログを解析します。

サンプルログ
{"log":"Starting image","stream":"stdout","time":"2019-06-04T11:29:54.295671087Z","container_name" : "/ecs-agent","container_hostname" : "3e9ceb8286e3", "containerid": "323e26da-67d4-4ae8-ad17-a30abcb9e007", "image" : "amazon/amazon-ecs-agent:latest", "image_id": "sha256:c3503596a2197b94b7b743544d72260374c8454453553d9da5359146b9e2af98","Labels": {"org.label-schema.build-date": "2022-11-16T20:43:16.419Z","org.label-schema.license": "Elastic License"},"cluster_name":"ECS"}

上記サンプルログは次の項目に分けられて、各値として表示されます。

項目名 項目値
log Starting image
stream stdout
time 2019-06-04T11:29:54.295671087Z
container_name /ecs-agent
container_hostname 3e9ceb8286e3
containerid 323e26da-67d4-4ae8-ad17-a30abcb9e007
cluster_name ECS
image amazon/amazon-ecs-agent:latest
image_id sha256:c3503596a2197b94b7b743544d72260374c8454453553d9da5359146b9e2af98
Labels Labels.key Labels.value
org.label-schema.license Elastic License
org.label-schema.build-date 2022-11-16T20:43:16.419Z

1. Labels情報を表示するには、ログの種類の追加画面で[項目設定の編集]をクリックし、「検索結果からこの項目を隠します」を[いいえ]を選択してください。
詳細はこちらのページをご確認ください。

2. これにより次のコンテナーのメタデータを抽出します。
container_name、container_hostname、cluster_name、image、image_id、Labels

Lambda関数を使用したCloudWatch経由でのログ収集

awslogsログドライバーとLambda関数を使用して、CloudWatchログ経由でSite24x7にコンテナーログを転送します。

この設定には、タスク定義のアプリケーションコンテナー内のログドライバーを、awslogsに設定する必要があります。

awslogsログドライバーに設定するタスク定義は次のとおりです。
{
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "sample-application/container",
"awslogs-region": "us-east-2",
"awslogs-create-group": "true",
"awslogs-stream-prefix": "sample-application"
}
}
}

awslogs-create-groupオプションを使用してロググループを作成には、タスク実行のIAMロールポリシーやEC2インスタンスのロールポリシーにlogs: CreateLogGroup権限を追加する必要があります。また、手動でロググループを作成してください。
この設定の詳細はこちらのページをご確認ください。

その後、次の手順でCloudWatch経由でのログ収集を設定します。

  1. Site24x7にログインし[管理]→[アプリケーションログ]→[ログプロファイル]→[ログプロファイルを追加]に移動後、次の項目を指定します。
    1. プロファイル名にログプロファイルの名前を入力します。
    2. ログの種類の選択ドロップダウンから[AWS ECSログ]を選択します。
    3. ログの種類の選択ドロップダウンの横にあるeditアイコンをクリックします。
    4. これによりログの種類の編集画面に移動します。
      1. サンプルログ項目に次のサンプルログをペーストします。
        {"timestamp":1556785146165,"message":"Starting image"}
      2. ログパターン横のeditアイコンをクリックしログパターンを更新後、tickをクリックしてパターンを保存します。
        json $timestamp:date:unixm$ $message$ $ecs_cluster:config:@filepath:0$ $container_name:config:@filepath:1$
      3. [保存]をクリックしてログタイプを保存します。
    5. ログソースドロップダウンから、[Amazon Lambda]を選択します。
    6. [保存]をクリックしてログプロファイルを保存します。
  2. こちらのドキュメントのAWS設定項目の手順で、CloudWatchログを収集し表示します。
    [AWS ECSログ]とその[logtypeconfig]、[ECSコンテナーロググループ]を選択して手順を行ってください。

FireLensプラグインを使用したログ収集

設定方法は次のとおりです。

  1. Site24x7にログインします。
  2. [管理]→[アプリケーションログ]→[ログの種類]→[ログ種類を追加]に移動します。
  3. ログの種類ドロップダウンより[AWS ECSログ]を選択します。
  4. 表示名を入力します。
  5. 次のサンプルログを、サンプルログ項目へ置換します。
    {
    "date": 1684129842.901607,
    "log": "Starting image",
    "container_id": "e961d005829f458dasd32342377ffec-1159264102",
    "container_name": "sample-fargate-app",
    "source": "stderr",
    "ecs_cluster": "Applog_ECS_CLUSTER",
    "ecs_task_arn": "arn:aws:ecs:us-east-2:12736187623:task/Applog_ECS_CLUSTER/e961d005829f458dasd32342377ffec",
    "ecs_task_definition": "fargate-task-definition:1"
    }
  6. ログパターン項目横のアイコンをクリックし、次のログパターンを更新します。その後、tickアイコンをクリックしてパターンを保存します。
    json $date:date:unixm$ $ecs_task_arn$ $container_name$ $log$ $ecs_cluster$ $source$ $container_id$ $ecs_task_definition$
  7. APIアップロードを有効にします。
  8. URLをメモします。このURLはログドライバーを用いたコンテナー設定を更新する際に必要です。
  9. [保存してログプロファイルに進む]をクリックします。
    ログプロファイルの作成が必要ない場合、下記のAWS FireLens設定を続行してください。

AWS FireLens設定

FireLensでは、FluentBit HTTP outputプラグインを使用して、ECS Fargateからログを収集します。

  1. Fluent Bit FireLensログルーターコンテナーを既存のFargateタスクに追加する必要があります。
    FireLens設定の詳細はこちらのページをご確認ください。

    次のコードをタスク定義に追加します。
    {
    "essential": true,
    "image": "906394416424.dkr.ecr.us-west-2.amazonaws.com/aws-for-fluent-bit:latest",
    "name": "log_router",
    "firelensConfiguration": {
    "type": "fluentbit"
    }
    }
    同じFargateタスクで、コンテナーログ設定を定義しログを送信します。
    この設定ではawsfirelensをログドライバーにし、Fluent Bitにデータを送信する必要があります。

  2. 次のスニペットはFireLensをログドライバーにし、Fluent Bitにデータを出力するコードです。
    "logConfiguration": {
    "logDriver": "awsfirelens",
    "secretOptions": null,
    "options": {
    "tls.verify": "off",
    "net.keepalive": "off",
    "Format": "json",
    "Port": "443",
    "compress": "gzip",
    "Host": "logc.site24x7.com",
    "tls": "on",
    "URI": "/event/receiver?rawLogs=true&token={TOKEN}",
    "Name": "http"
    }
    }
    上記が完了したら、変更をクラスターにデプロイします。
    ホストとURIには、手順8で取得したキーバリューを入力します。URIキーは{TOKEN}を手順8で取得したトークン値に置換します。

    aws-ecs-api-url

ログフォーマットでのログパターンのカスタマイズ

アプリケーションは様々なパターンでログを書き込むため、サンプルログ行を基にログパターンをカスタマイズします。

例として、サービスがログ項目にカスタマイズしたメッセージを書き込む場合、date、log level、log level ID、thread、class name、messageといった項目が次のサンプルログのように書き込まれます。
サンプルログ
{
"date": 1684129842.901607,
"log": "2023-05-16 13:00:16.109 ERROR 1 --- [zylker-thread] zylker.classname : zylkermethod",
"container_id": "e961d005829f458dasd32342377ffec-1159264102",
"container_name": "sample-fargate-app",
"source": "stderr",
"ecs_cluster": "Applog_ECS_CLUSTER",
"ecs_task_arn": "arn:aws:ecs:us-east-2:12736187623:task/Applog_ECS_CLUSTER/e961d005829f458dasd32342377ffec",
"ecs_task_definition": "fargate-task-definition:1"
}

この場合、次のようにログパターンをカスタマイズし、個々の項目を抽出します。詳細はこちらのページをご確認ください。

上記サンプルログを基にしてカスタマイズしたログパターン

json $ecs_task_arn$ $container_name$ $log:pattern:$Date:date:yyyy-MM-dd HH:mm:ss.SSS$ $LogLevel$ $LogLevelId$ --- [$Thread$] $ClassName$ :$Message$$ $ecs_cluster$ $source$ $container_id$ $ecs_task_definition$

ログパターン作成に問題が発生している場合、[問題を報告しますか?]をクリックしてください。これにより、ログパターンとサンプルログが弊社に送信され、サポートを行います。

アラートでエラーを通知

ログをアプリケーションログにプッシュされるようになると、保存検索アラート機能を使用してログを監視できます。

例えば、エラーでフィルターしたログを検索するため、次のクエリを保存します。

logtype="AWS ECS Logs" and loglevel CONTAINS "ERROR"


また、次のクエリですべてのエラーを対象にアラートを通知できます。

Amazon ECS監視連携で、EC2ローンチとFargateローンチ両方のクラスターおよびサービスレベルのメトリックを収集できます。

関連ログの種類