awslogs ログドライバーを使用する
タスクのコンテナを設定して CloudWatch Logs にログ情報を送信できます。タスクで Fargate 起動タイプを使用すると、コンテナからログを表示できます。EC2 起動タイプを使用すると、コンテナからの異なるログを 1 か所で便利に表示できます。また、コンテナインスタンスのディスク容量をコンテナログが占有してしまうことも防止できます。このトピックでは、タスク定義で awslogs
ログドライバーの使用を開始する方法を説明します。
注記
タスクのコンテナによってログ記録される情報のタイプは、ENTRYPOINT
コマンドによって大きく異なります。デフォルトでは、キャプチャされるログには、コンテナをローカルに実行した場合に通常はインタラクティブターミナルに表示されるコマンド出力 (STDOUT
および STDERR
I/O ストリーム) が表示されます。awslogs
ログドライバーは、これらのログを Docker から CloudWatch Logs に渡します。Docker ログの処理方法 (ファイルデータやストリームをキャプチャする別の方法) の詳細については、Docker ドキュメントの「コンテナまたはサービスのログを表示する
your Amazon ECS コンテナインスタンスから CloudWatch Logs にシステムログを送信するには、Amazon CloudWatch Logs ユーザーガイドの「ログファイルをモニタリングする」と「CloudWatch Logs クォータ」を参照してください。
コンテナ用の awslogs ログドライバーを有効にする
タスクで Fargate 起動タイプを使用する場合、awslogs
ログドライバーを有効化するには、必要な logConfiguration
パラメータをタスク定義に追加する必要があります。詳細については、「タスク定義でログ設定を指定する」を参照してください。
タスクで EC2 起動タイプを使用する場合、awslogs
ログドライバーをオンにするには、Amazon ECS コンテナインスタンスに、コンテナエージェントのバージョン 1.9.0 以降が必要です。エージェントのバージョンの確認と最新バージョンへの更新については、「Amazon ECS コンテナエージェントをアップデートする」を参照してください。
注記
コンテナインスタンスで Amazon ECS 最適化 AMI (ecs-init
パッケージのバージョンが最低でも 1.9.0-1) を使用していない場合は、以下の環境変数を docker run ステートメントか環境変数ファイル内で使用することで、エージェントの起動時に awslogs
ロギングドライバーがコンテナインスタンスで使用できることを指定する必要があります。詳細については、「Amazon ECS コンテナエージェントをインストールする」を参照してください。
ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","
awslogs
"]
Amazon ECS コンテナインスタンスでは、コンテナインスタンスで起動する IAM ロールに logs:CreateLogStream
および logs:PutLogEvents
アクセス許可も必要になります。Amazon ECS で awslogs
ログドライバーのサポートを有効にする前に Amazon ECS コンテナインスタンスを作成した場合は、このアクセス許可の追加が必要となる場合があります。ecsTaskExecutionRole
はタスクに割り当てられた時点で使用され、また、正しいアクセス許可が含まれている必要があります。タスク実行ロールの確認については、「IAM コンソールでのタスク実行 (ecsTaskExecutionRole) ロールの確認」を参照してください。コンテナインスタンスでコンテナインスタンス用の管理 IAM ポリシーを使用している場合、通常そのコンテナインスタンスには、適切なアクセス許可が付与されています。Amazon ECS コンテナインスタンスのロールの確認とコンテナインスタンスへのマネージド IAM ポリシーのアタッチについては、「IAM コンソールでのコンテナインスタンス (ecsInstanceRole) の確認」を参照してください。
ロググループを作成する
awslogs
ログドライバーでは、CloudWatch Logs の既存のロググループにログストリームを送信することも、ユーザーに代わって新しいロググループを作成することも可能です。AWS Management Console には、ecs
をプレフィックスとするタスク定義ファミリー名を使用して自動的にロググループを作成する、自動設定オプションが用意されています。または、手動でログ設定オプションを指定し、awslogs-create-group
オプションに値 true
を指定することもできます。これにより、ロググループが自動的に作成されます。
注記
awslogs-create-group
オプションを使用してロググループを作成するには、タスク実行 IAM ロールポリシーまたは EC2 インスタンスロールポリシーに logs:CreateLogGroup
許可が含まれている必要があります。
次のコードは、awslogs-create-group
オプションの設定方法を示しています。
{ "containerDefinitions": [ { "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "firelens-container", "awslogs-region": "us-west-2", "awslogs-create-group": "true", "awslogs-stream-prefix": "firelens" } } ] }
自動設定機能を使用してロググループを作成する
Amazon ECS コンソールでタスク定義を登録する際、Amazon ECS による CloudWatch Logs の自動設定を許可することができます。この設定を行うと、ecs
をプレフィックスとするタスク定義ファミリー名を使用して、自動的にロググループが作成されます。詳細については、「コンソールを使用したタスク定義の作成」を参照してください。
使用できる awslogs ログドライバーのオプション
awslogs
ログドライバーは、Amazon ECS タスク定義で以下のオプションをサポートします。詳細については、「CloudWatch Logs ロギングドライバー
awslogs-create-group
-
必須: いいえ
ロググループを自動的に作成させるかどうかを指定します。このオプションを指定しない場合、デフォルトは [
false
] です。注記
awslogs-create-group
を使用する前に、IAM ポリシーにはアクセス許可logs:CreateLogGroup
が含まれている必要があります。 awslogs-region
-
必須: はい
awslogs
ログドライバが Docker ログを送信する先の、AWS リージョン を指定します。CloudWatch Logs では、異なるリージョンのクラスターからすべてのログを 1 つのリージョンに送信するように選択できます。これにより、すべてのログを一元的な場所で確認できるようになります。他にも、リージョンごとにそれらを分離して、より細分化することが可能です。このオプションで指定するリージョンに、対象のロググループが存在することを確認してください。 awslogs-group
-
必須: はい
awslogs
ログドライバーがログストリームを送信する先の、ロググループを指定する必要があります。詳細については、「ロググループを作成する」を参照してください。 awslogs-stream-prefix
-
必須:EC2 launch タイプの場合はオプション。Fargate 起動タイプの場合は必須。
指定したプレフィックス、コンテナ名、コンテナが属する Amazon ECS タスクの ID にログストリームを関連付けるには、
awslogs-stream-prefix
オプションを使用します。このオプションでプレフィックスを指定した場合、ログストリームの形式は以下のようになります。prefix-name
/container-name
/ecs-task-id
このオプションでプレフィックスを指定しない場合、ログストリームには、コンテナインスタンスの Docker デーモンによって割り当てられたコンテナ ID に基づいた名前が付けられます。Docker コンテナ ID (コンテナインスタンスでのみ使用可能) だけでそのログを送信したコンテナを追跡するのは難しいため、このオプションでプレフィックスを指定することをお勧めします。
Amazon ECS サービスでは、サービス名をプレフィックスとして使用できます。これにより、コンテナが属するサービスへのログストリームと、それを送信したコンテナの名前、そのコンテナが所属するタスクの ID を追跡できます。
Amazon ECS コンソールを使用する際に [Log] ペインにログを表示するためには、ログのストリームプレフィックスを指定する必要があります。
awslogs-datetime-format
-
必須: いいえ
このオプションは、Python
strftime
形式で複数行起動パターンを定義します。ログメッセージは、パターンに一致する 1 行と、それに続くパターンに一致しない行で構成されます。一致する 1 行とは、ログメッセージ間の区切りです。この形式を使用する場合のユースケースの例としては、スタックダンプなどの解析された出力があり、これを使用しなければ、複数のエントリに記録されることになります。適切なパターンにより、単一のエントリにキャプチャさせます。
詳細については、「awslogs-datetime-format
」を参照してください。 awslogs-datetime-format
とawslogs-multiline-pattern
オプションの両方を設定することはできません。注記
複数行のログ記録は、すべてのログメッセージの正規表現の解析とマッチングを実行します。これによりログ記録のパフォーマンスに悪影響が及ぶ可能性があります。
awslogs-multiline-pattern
-
必須: いいえ
このオプションでは、正規表現を使用する複数行起動パターンを定義します。ログメッセージは、パターンに一致する 1 行と、それに続くパターンに一致しない行で構成されます。一致する 1 行とは、ログメッセージ間の区切りです。
詳細については、「awslogs-multiline-pattern
」を参照してください。 awslogs-datetime-format
も設定されている場合は、このオプションは無視されます。awslogs-datetime-format
とawslogs-multiline-pattern
オプションの両方を設定することはできません。注記
複数行のログ記録は、すべてのログメッセージの正規表現の解析とマッチングを実行します。これによりログ記録のパフォーマンスに悪影響が及ぶ可能性があります。
mode
-
必須: いいえ
有効な値:
non-blocking
|blocking
デフォルト値:
blocking
このオプションは、コンテナから CloudWatch Logs へのログメッセージの配信モードを定義します。選択した配信モードは、コンテナから CloudWatch へのログの流れが中断されたときのアプリケーションの可用性に影響します。
デフォルト の
blocking
モードを使用し、CloudWatch へのログのフローが中断された場合、stdout
およびstderr
ストリームに書き込むコンテナコードからの呼び出しはブロックされます。その結果、アプリケーションのロギングスレッドがブロックされます。これにより、アプリケーションが応答しなくなり、コンテナのヘルスチェックが失敗する可能性があります。non-blocking
モードを使用する場合、コンテナのログは代わりにmax-buffer-size
オプションで設定されたメモリ内の中間バッファに保存されます。これにより、ログを CloudWatch に送信できない場合にアプリケーションが応答しなくなるのを防ぎます。サービスの可用性を確保したいが、多少のログ損失があっても問題ない場合は、このモードを使用することをおすすめします。 max-buffer-size
-
必須: いいえ
デフォルト値:
1m
non-blocking
モードが使用されている場合、max-buffer-size
ログオプションは、中間メッセージ用のストレージに使用されるバッファのサイズを制御します。アプリケーションに基づいて、必ず適切なバッファサイズを指定してください。バッファがいっぱいになると、それ以上ログを保存できなくなります。保存できないログは失われます。
タスク定義でログ設定を指定する
コンテナがログを CloudWatch に送信する前に、タスク定義でコンテナの awslogs
ログドライバーを指定する必要があります。このセクションでは、コンテナが awslogs
ログドライバーを使用するためのログ設定について説明します。詳細については、「コンソールを使用したタスク定義の作成」を参照してください。
下にあるタスク定義 JSON には、各コンテナに指定された logConfiguration
オブジェクトが含まれています。その 1 つは、awslogs-wordpress
というロググループにログを送信する WordPress コンテナ用です。もう 1 つは、awslogs-mysql
というロググループにログを送信する MySQL コンテナ用です。どちらのコンテナも awslogs-example
ログストリームプレフィックスを使用します。
{ "containerDefinitions": [ { "name": "wordpress", "links": [ "mysql" ], "image": "wordpress", "essential": true, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "
awslogs-wordpress
", "awslogs-region": "us-west-2
", "awslogs-stream-prefix": "awslogs-example
" } }, "memory": 500, "cpu": 10 }, { "environment": [ { "name": "MYSQL_ROOT_PASSWORD", "value": "password" } ], "name": "mysql", "image": "mysql", "cpu": 10, "memory": 500, "essential": true, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "awslogs-mysql
", "awslogs-region": "us-west-2
", "awslogs-stream-prefix": "awslogs-example
", "mode": "non-blocking", "max-buffer-size": "25m" } } } ], "family": "awslogs-example" }
awslogs
ログドライバーを使用するタスク定義をコンテナ定義ログ設定に登録すると、タスク定義を使用してタスクを実行またはサービスを作成し、CloudWatch Logs へのログの送信を開始できます。詳細については、クラシック Amazon ECS コンソールを使用してスタンドアロンタスクを実行する方法 および クラシックコンソール内の Amazon ECS サービスの作成 を参照してください。
CloudWatch Logs での コンテナログの表示
EC2 起動タイプを使用するタスクの場合、コンテナインスタンスロールに CloudWatch Logs にログを送信するために必要な正しいアクセス権限を付与すると、コンテナエージェントは 1.9.0 バージョン以降に更新されます。awslogs
ログドライバーを使用するコンテナでタスクを設定し、開始しているので、設定済みコンテナはログデータを CloudWatch Logs に送信しているはずです。これらのログはコンソールで表示および検索できます。
Amazon ECS コンソールからコンテナの CloudWatch Logs データを表示するには
コンソール (https://console.aws.amazon.com/ecs/v2
) を開きます。 -
[Clusters] ページで、表示するタスクを含むクラスターを選択します。
-
[Cluster:
cluster_name
] ページで、[タスク] を選択して表示するタスクを選択します。 -
[タスク:
task_id
] ページの [コンテナの詳細] で、[ログ設定] を選択してログを表示します。 -
[Log Configuration (ログ設定)] セクションで、[CloudWatch のログを表示] を選択します。CloudWatch コンソールに関連ログストリームが開きます。
CloudWatch コンソールで CloudWatch Logs データを表示するには
CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/
) を開きます。 -
左のナビゲーションペインで [Logs] (ログ) を選択します。
-
表示するロググループを選択します。「ロググループを作成する」で作成したロググループが表示されます。
-
表示するログストリームを選択します。