awslogs ログドライバーを使用する - Amazon Elastic Container Service

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

タスクのコンテナを設定して CloudWatch Logs にログ情報を送信できます。タスクで Fargate 起動タイプを使用すると、コンテナからログを表示できます。EC2 起動タイプを使用すると、コンテナからの異なるログを 1 か所で便利に表示できます。また、コンテナインスタンスのディスク容量をコンテナログが占有してしまうことも防止できます。このトピックでは、タスク定義で awslogs ログドライバーの使用を開始する方法を説明します。

注記

タスクのコンテナによってログ記録される情報のタイプは、ENTRYPOINT コマンドによって大きく異なります。デフォルトでは、キャプチャされるログには、コンテナをローカルに実行した場合に通常はインタラクティブターミナルに表示されるコマンド出力 (STDOUT および STDERR I/O ストリーム) が表示されます。awslogs ログドライバーは、これらのログを Docker から CloudWatch Logs に渡します。Docker ログの処理方法 (ファイルデータやストリームをキャプチャする別の方法) の詳細については、Docker ドキュメントの「コンテナまたはサービスのログを表示する」を参照してください。

Amazon ECS コンテナインスタンスから CloudWatch Logs にシステムログを送信するには、「コンテナインスタンスのモニタリング」を参照してください。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 ポリシーに 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 をプレフィックスとするタスク定義ファミリー名を使用して、自動的にロググループが作成されます。

Amazon ECS コンソールでロググループの自動設定オプションを使用するには
  1. Amazon ECS コンソール (https://console.aws.amazon.com/ecs/) を開きます。

  2. 左のナビゲーションペインで、[Task Definitions]、[Create new Task Definition] の順に選択します。

  3. 互換性オプションを選択し、[次のステップ] を選択します。

  4. [Add container] を選択します。

  5. [Storage and Logging (ストレージとログ記録)] の [Log configuration (ログ設定)] で、[Auto-configure CloudWatch Logs (CloudWatch Logs の自動設定)] を選択します。

  6. awslogs ログドライバーのオプションを入力します。詳細については、「タスク定義でログ設定を指定する」を参照してください。

  7. タスク定義ウィザードの残りの手順を完了します。

使用できる awslogs ログドライバーのオプション

awslogs ログドライバーは、Amazon ECS タスク定義で以下のオプションをサポートします。詳細については、「CloudWatch Logs ロギングドライバー」を参照してください。

awslogs-create-group

必須: いいえ

ロググループを自動的に作成させるかどうかを指定します。このオプションを指定しない場合、デフォルトは [false] です。

注記

logs:CreateLogGroup を使用しようとする前に、IAM ポリシーには awslogs-create-group アクセス権限が含まれている必要があります。

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-formatawslogs-multiline-pattern の両方が設定されている場合、このオプションは常に優先されます。

注記

複数行のログ記録は、すべてのログメッセージの正規表現の解析とマッチングを実行します。これによりログ記録のパフォーマンスに悪影響が及ぶ可能性があります。

awslogs-multiline-pattern

必須: いいえ

このオプションでは、正規表現を使用する複数行起動パターンを定義します。ログメッセージは、パターンに一致する 1 行と、それに続くパターンに一致しない行で構成されます。一致する 1 行とは、ログメッセージ間の区切りです。

詳細については、「awslogs-multiline-pattern」を参照してください。

awslogs-datetime-format も設定されている場合は、このオプションは無視されます。

注記

複数行のログ記録は、すべてのログメッセージの正規表現の解析とマッチングを実行します。これによりログ記録のパフォーマンスに悪影響が及ぶ可能性があります。

mode

必須: いいえ

有効な値: non-blocking | blocking

デフォルト値: blocking

コンテナから awslogs へのログメッセージの配信モード。詳細については、「ログドライバーを設定する」を参照してください。

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" } } } ], "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 データを表示するには
  1. Amazon ECS コンソール (https://console.aws.amazon.com/ecs/) を開きます。

  2. [Clusters] ページで、表示するタスクを含むクラスターを選択します。

  3. [Cluster: cluster_name] ページで、[Tasks] を選択して表示するタスクを選択します。

  4. [Task: task_id] ページで、コンテナ名の左にある矢印を選択してコンテナビューを展開します。

  5. [Log Configuration (ログ設定)] セクションで、[CloudWatch のログを表示] を選択します。CloudWatch コンソールに関連ログストリームが開きます。

    
							ログ設定のタスク定義ビュー
CloudWatch コンソールで CloudWatch Logs データを表示するには
  1. CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/) を開きます。

  2. 左のナビゲーションペインで [Logs] (ログ) を選択します。

  3. 表示するロググループを選択します。「ロググループを作成する」で作成したロググループが表示されます。

    
							awslogs コンソールのメトリクスビュー
  4. 表示するログストリームを選択します。

    
							awslogs コンソールのメトリクスビュー