メニュー
Amazon Elastic Container Service
開発者ガイド (API バージョン 2014-11-13)

コンテナインスタンスでの CloudWatch Logs の使用

ログ情報を CloudWatch Logs に送信するように、コンテナインスタンスを設定できます。これにより、1 つの便利な場所でコンテナインスタンスからのさまざまなログを表示できます。このトピックは、Amazon ECS に最適化された AMI で起動されたコンテナインスタンスで CloudWatch Logs を使用し始めるために役立ちます。

タスクのコンテナログを CloudWatch Logs に送信する方法については、「awslogs ログドライバーを使用する」を参照してください。CloudWatch Logs の詳細については、Amazon CloudWatch ユーザーガイドログファイルのモニタリングを参照してください。

CloudWatch Logs IAM ポリシー

コンテナインスタンスが CloudWatch Logs にログデータを送信する前に、コンテナインスタンスに CloudWatch Logs API の使用を許可する IAM ポリシーを作成し、そのポリシーを ecsInstanceRole にアタッチする必要があります。

ECS-CloudWatchLogs IAM ポリシーを作成するには

  1. https://console.aws.amazon.com/iam/ にある IAM コンソールを開きます。

  2. ナビゲーションペインで、[Policies] を選択します。

  3. [Create policy] を選択します。

  4. [ポリシーの作成] ページで [JSON] タブを選択し、次のポリシーを入力します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ] }
  5. [ポリシーの確認] を選択します。

  6. [ポリシーの確認] ページで、[名前] に ECS-CloudWatchLogs を入力し、[ポリシーの作成] を選択します。

ecsInstanceRoleECS-CloudWatchLogs ポリシーをアタッチするには

  1. https://console.aws.amazon.com/iam/ にある IAM コンソールを開きます。

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

  3. ecsInstanceRole を選択します。ロールが存在しない場合は、「Amazon ECS コンテナインスタンスの IAM ロール」の手順に従ってロールを作成します。

  4. [Permissions] タブで [Attach policy] を選択します。

  5. [Filter] ボックスに「ECS-CloudWatchLogs」と入力して、アタッチする使用可能なポリシーを絞り込みます。

  6. [ECS-CloudWatchLogs] ポリシーの左側にあるチェックボックスをオンにし、[ポリシーのアタッチ] を選択します。

CloudWatch Logs エージェントのインストール

ecsInstanceRoleECS-CloudWatchLogs ポリシーを追加した後、コンテナインスタンスに CloudWatch Logs エージェントをインストールできます。

注記

この手順は、Amazon ECS に最適化された AMI 用に書かれたもので、他のオペレーティングシステムには使用できない場合があります。他のオペレーティングシステムへのエージェントのインストールについては、『Amazon CloudWatch ユーザーガイド』の「CloudWatch Logs の開始方法」を参照してください。

CloudWatch Logs エージェントをインストールするには

  • 以下のコマンドを実行して、CloudWatch Logs エージェントをインストールします。

    [ec2-user ~]$ sudo yum install -y awslogs

エージェントをインストールしたら、以下のセクションに進んでエージェントを設定します。

CloudWatch Logs エージェントの設定と開始

CloudWatch Logs エージェント設定ファイル (/etc/awslogs/awslogs.conf) では、CloudWatch Logs に送信するログファイルが定義されています。エージェント設定ファイルの [general] セクションでは、すべてのログストリームに適用される共通設定を定義し、モニタリングするコンテナインスタンスのファイルごとに個別のログストリームセクションを追加できます。詳細については、Amazon CloudWatch ユーザーガイド の「CloudWatch Logs エージェントリファレンス」を参照してください。

以下の例の設定ファイルでは、Amazon ECS に最適化された AMI 用に設定されており、共通のログファイルのログストリームを指定しています。

/var/log/dmesg

Linux カーネルのメッセージバッファ。

/var/log/messages

グローバルシステムメッセージ。

/var/log/docker

Docker デーモンからのログメッセージ。

/var/log/ecs/ecs-init.log

ecs-init upstart ジョブからのログメッセージ。

/var/log/ecs/ecs-agent.log

Amazon ECS コンテナエージェントからのログメッセージ。

/var/log/ecs/audit.log

タスク認証情報プロバイダーの IAM ロールからのログメッセージ。

以下の例のファイルを Amazon ECS コンテナインスタンスに使用できますが、{cluster} エントリと {container_instance_id} エントリをクラスターの名前と各コンテナインスタンスの ID に置き換えて、ログストリームをクラスター名でグループ化し、コンテナインスタンス ID によって識別する必要があります。以下の設定ファイルの例で、この後、クラスター名とコンテナインスタンス ID のプレースホルダーを置き換えます。

[general] state_file = /var/lib/awslogs/agent-state [/var/log/dmesg] file = /var/log/dmesg log_group_name = /var/log/dmesg log_stream_name = {cluster}/{container_instance_id} [/var/log/messages] file = /var/log/messages log_group_name = /var/log/messages log_stream_name = {cluster}/{container_instance_id} datetime_format = %b %d %H:%M:%S [/var/log/docker] file = /var/log/docker log_group_name = /var/log/docker log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%S.%f [/var/log/ecs/ecs-init.log] file = /var/log/ecs/ecs-init.log log_group_name = /var/log/ecs/ecs-init.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ [/var/log/ecs/ecs-agent.log] file = /var/log/ecs/ecs-agent.log.* log_group_name = /var/log/ecs/ecs-agent.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ [/var/log/ecs/audit.log] file = /var/log/ecs/audit.log.* log_group_name = /var/log/ecs/audit.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ

CloudWatch Logs エージェントを設定するには

  1. 既存の CloudWatch Logs エージェント設定ファイルをバックアップします。

    [ec2-user ~]$ sudo mv /etc/awslogs/awslogs.conf /etc/awslogs/awslogs.conf.bak
  2. 空の設定ファイルを作成します。

    [ec2-user ~]$ sudo touch /etc/awslogs/awslogs.conf
  3. テキストエディターで /etc/awslogs/awslogs.conf ファイルを開き、上記の例のファイルをコピーします。

  4. jq JSON クエリユーティリティをインストールします。

    [ec2-user ~]$ sudo yum install -y jq
  5. Amazon ECS イントロスペクション API を照会してクラスター名を見つけ、環境変数に設定します。

    [ec2-user ~]$ cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster')
  6. ファイル内の {cluster} プレースホルダーを、前の手順で設定した環境変数の値に置き換えます。

    [ec2-user ~]$ sudo sed -i -e "s/{cluster}/$cluster/g" /etc/awslogs/awslogs.conf
  7. Amazon ECS イントロスペクション API を照会してコンテナインスタンス ID を見つけ、環境変数に設定します。

    [ec2-user ~]$ container_instance_id=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $2}' )
  8. ファイル内の {container_instance_id} プレースホルダーを、前の手順で設定した環境変数の値に置き換えます。

    [ec2-user ~]$ sudo sed -i -e "s/{container_instance_id}/$container_instance_id/g" /etc/awslogs/awslogs.conf

CloudWatch Logs エージェントのリージョンを設定するには

デフォルトでは、CloudWatch Logs エージェントは us-east-1 リージョンにデータを送信します。クラスターが存在するリージョンなど、別のリージョンにデータを送信する場合は、/etc/awslogs/awscli.conf ファイルでリージョンを設定できます。

  1. テキストエディターで /etc/awslogs/awscli.conf ファイルを開きます。

  2. [default] セクションで、us-east-1 を、ログデータを表示するリージョンに置き換えます。

  3. ファイルを保存し、テキストエディタを終了します。

CloudWatch Logs エージェントを開始するには

  1. 以下のコマンドを使用して CloudWatch Logs エージェントを開始します。

    [ec2-user ~]$ sudo service awslogs start

    出力:

    Starting awslogs: [ OK ]
  2. chkconfig コマンドを使用して、システム起動時に CloudWatch Logs エージェントが開始されるようにします。

    [ec2-user ~]$ sudo chkconfig awslogs on

CloudWatch Logs の表示

CloudWatch Logs にログを送信するための適切なアクセス権限をコンテナインスタンスロールに付与し、エージェントを設定して開始した後、コンテナインスタンスからそのログデータが CloudWatch Logs に送信されるようになります。これらのログは AWS マネジメントコンソール で表示および検索できます。

注記

新しいインスタンスの起動では、CloudWatch Logs へのデータの送信に数分かかることがあります。

CloudWatch Logs のデータを表示するには

  1. https://console.aws.amazon.com/cloudwatch/にある CloudWatch コンソールを開きます。

  2. 左側のナビゲーションで [Logs] を選択します。

  3. CloudWatch Logs エージェントの設定と開始」で設定したロググループが表示されます。

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

  5. 表示するログストリームを選択します。ストリームは、ログの送信元のクラスター名とコンテナインスタンス ID によって識別されます。

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

起動時にユーザーデータを渡して CloudWatch Logs を設定する

Amazon EC2 で Amazon ECS コンテナインスタンスを起動するとき、そのインスタンスにユーザーデータを渡して、一般的な自動設定タスクを実行したり、インスタンスの開始後にスクリプトを実行したりできます。シェルスクリプト、cloud-init ディレクティブ、Upstart ジョブなど、複数タイプのユーザーデータをインスタンスに渡すことができます。また、このデータはプレーンテキスト、ファイル (コマンドラインツールでインスタンスを起動する場合に便利です)、または base64 でエンコードされたテキスト (API 呼出の場合) として、起動ウィザードに渡すこともできます。

この例のユーザーデータブロックは以下のタスクを実行します。

  • CloudWatch Logs エージェントを含む awslogs パッケージをインストールする

  • jq JSON クエリユーティリティをインストールする

  • CloudWatch Logs エージェントの設定ファイルを書き込み、データの送信先のリージョン (コンテナインスタンスがあるリージョン) を設定する

  • Amazon ECS コンテナエージェントの開始後にクラスター名とコンテナインスタンス ID を取得し、それらの値を CloudWatch Logs エージェント設定ファイルのログストリームに書き込む

  • CloudWatch Logs エージェントを開始する

  • システムの起動ごとに CloudWatch Logs エージェントを開始するように設定する

Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Install awslogs and the jq JSON parser yum install -y awslogs jq # Inject the CloudWatch Logs configuration file contents cat > /etc/awslogs/awslogs.conf <<- EOF [general] state_file = /var/lib/awslogs/agent-state [/var/log/dmesg] file = /var/log/dmesg log_group_name = /var/log/dmesg log_stream_name = {cluster}/{container_instance_id} [/var/log/messages] file = /var/log/messages log_group_name = /var/log/messages log_stream_name = {cluster}/{container_instance_id} datetime_format = %b %d %H:%M:%S [/var/log/docker] file = /var/log/docker log_group_name = /var/log/docker log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%S.%f [/var/log/ecs/ecs-init.log] file = /var/log/ecs/ecs-init.log log_group_name = /var/log/ecs/ecs-init.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ [/var/log/ecs/ecs-agent.log] file = /var/log/ecs/ecs-agent.log.* log_group_name = /var/log/ecs/ecs-agent.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ [/var/log/ecs/audit.log] file = /var/log/ecs/audit.log.* log_group_name = /var/log/ecs/audit.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ EOF --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Set the region to send CloudWatch Logs data to (the region where the container instance is located) region=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region) sed -i -e "s/region = us-east-1/region = $region/g" /etc/awslogs/awscli.conf --==BOUNDARY== Content-Type: text/upstart-job; charset="us-ascii" #upstart-job description "Configure and start CloudWatch Logs agent on Amazon ECS container instance" author "Amazon Web Services" start on started ecs script exec 2>>/var/log/ecs/cloudwatch-logs-start.log set -x until curl -s http://localhost:51678/v1/metadata do sleep 1 done # Grab the cluster and container instance ARN from instance metadata cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster') container_instance_id=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $2}' ) # Replace the cluster name and container instance ID placeholders with the actual values sed -i -e "s/{cluster}/$cluster/g" /etc/awslogs/awslogs.conf sed -i -e "s/{container_instance_id}/$container_instance_id/g" /etc/awslogs/awslogs.conf service awslogs start chkconfig awslogs on end script --==BOUNDARY==--

ECS-CloudWatchLogs ポリシーを作成し、「CloudWatch Logs IAM ポリシー」で説明するようにそのポリシーを ecsInstanceRole にアタッチする場合、手動で起動するすべてのコンテナインスタンスに上記のユーザーデータブロックを追加することができます。また、Auto Scaling 起動設定にこのポリシーを追加することもできます。このユーザーデータで起動するコンテナインスタンスは、起動するとすぐに CloudWatch Logs にログデータの送信を開始します。詳細については、「Amazon ECS コンテナインスタンスの起動」を参照してください。