CloudWatch Logsを使ったDockerアプリのログ監視

はじめに

コンテナ化されたアプリケーションを運用する際、効果的なログ監視は安定性とパフォーマンスを維持するために不可欠です。AWSのCloudWatch Logsは、Dockerコンテナから生成されるログを一元管理し、分析するための強力なソリューションを提供します。この記事では、CloudWatch LogsとDockerを連携させてアプリケーションのログを効率的に監視する方法について解説します。

CloudWatch Logsの概要

Amazon CloudWatch Logsは、さまざまなAWSサービスやアプリケーションからのログファイルを一元管理するためのフルマネージドサービスです。主な特徴は以下の通りです:

  • リアルタイム監視: ログデータをほぼリアルタイムで監視できます
  • 長期保存: ログデータを安全に保存し、必要に応じてアクセス可能
  • 検索と分析: ログデータ内のパターンを検索・分析できる機能
  • アラート設定: 特定のログパターンに基づいてアラートを設定可能
  • AWS他サービスとの統合: Lambda、SNSなどとの連携が容易

Dockerコンテナとログ

Dockerコンテナは通常、標準出力(stdout)と標準エラー出力(stderr)にログを出力します。デフォルトでは、これらのログはJSON形式で保存され、docker logsコマンドで確認できます。しかし、本番環境ではより堅牢なログ管理ソリューションが必要です。

CloudWatch LogsとDockerの連携方法

1. AWS CLIのセットアップ

まず、AWS CLIがインストールされ、適切に設定されていることを確認します。

aws configure

必要なアクセスキーとシークレットキーを入力し、デフォルトリージョンを設定します。

2. IAMロールとポリシーの設定

DockerホストがCloudWatch Logsにログを送信するために必要な権限を持つIAMロールを作成します。以下の権限が必要です:

  • logs:CreateLogGroup
  • logs:CreateLogStream
  • logs:PutLogEvents
  • logs:DescribeLogStreams

AWSマネジメントコンソールでIAMロールを作成するか、以下のようなポリシードキュメントを使用できます:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams"
      ],
      "Resource": [
        "arn:aws:logs:*:*:*"
      ]
    }
  ]
}

3. CloudWatch Logsエージェントの設定(EC2の場合)

EC2インスタンスでDockerを実行している場合、CloudWatch Logsエージェントをインストールして設定します:

sudo yum install -y awslogs

または、Ubuntu/Debianの場合:

curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
sudo python ./awslogs-agent-setup.py --region us-east-1

/etc/awslogs/awslogs.confファイルを編集して、監視するDockerログファイルを追加します:

[/var/lib/docker/containers/*/*-json.log]
file = /var/lib/docker/containers/*/*-json.log
log_group_name = /docker/containers
log_stream_name = {instance_id}/{container_id}
datetime_format = %Y-%m-%dT%H:%M:%S.%f

エージェントを再起動します:

sudo service awslogs restart

4. Docker用のロギングドライバの設定

Dockerには、ログを外部サービスに直接送信するためのログドライバが用意されています。awslogsドライバを使用してCloudWatch Logsに直接ログを送信できます。

単一コンテナの場合

docker run --log-driver=awslogs \
  --log-opt awslogs-region=us-east-1 \
  --log-opt awslogs-group=my-application-logs \
  --log-opt awslogs-stream=my-container \
  -d your-docker-image

Docker Composeでの設定

docker-compose.ymlファイルで以下のように設定します:

version: '3'
services:
  web:
    image: nginx:latest
    logging:
      driver: awslogs
      options:
        awslogs-region: "us-east-1"
        awslogs-group: "nginx-logs"
        awslogs-stream: "web-container"

5. ECS/Fargateでの設定

AWSのElastic Container Service (ECS)またはFargateを使用している場合、タスク定義でログ設定を指定できます:

{
  "containerDefinitions": [
    {
      "name": "my-container",
      "image": "my-docker-image",
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/my-task-definition",
          "awslogs-region": "us-east-1",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ]
}

ログの分析とアラートの設定

ログの検索とフィルタリング

CloudWatch Logsコンソールでは、以下の方法でログを検索できます:

  1. ロググループを選択
  2. 「ログストリーム」タブでストリームを選択
  3. 「フィルタイベント」にキーワードやパターンを入力

メトリクスフィルタの作成

特定のログパターンに基づいてメトリクスを作成できます:

  1. ロググループを選択
  2. 「メトリクスフィルタ」タブを選択
  3. 「メトリクスフィルタの作成」をクリック
  4. フィルタパターンを定義(例:ERRORExceptionなど)
  5. メトリクス名前空間とメトリクス名を設定

CloudWatch Alarmsでアラートを設定

作成したメトリクスに基づいてアラームを設定できます:

  1. CloudWatch Alarmsコンソールで「アラームの作成」をクリック
  2. 先ほど作成したメトリクスを選択
  3. しきい値を設定(例:5分間に3回以上のエラーが発生した場合)
  4. アラーム状態になった際のアクションを設定(SNSトピックへの通知など)

ログの保持と管理

CloudWatch Logsでは、ログの保持期間を設定できます。デフォルトでは無期限に保存されますが、コスト削減のために適切な保持期間を設定することをお勧めします:

  1. ロググループを選択
  2. 「アクション」→「保持設定の編集」を選択
  3. 適切な保持期間(1日~10年、または無期限)を選択

高度な活用法

Insightsによるログ分析

CloudWatch Logs Insightsを使用すると、SQLライクなクエリ言語でログを分析できます:

fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
| limit 20

Lambdaとの連携

特定のログパターンが検出された場合にLambda関数を呼び出すことができます:

  1. CloudWatch Logsサブスクリプションフィルタを作成
  2. 送信先としてLambda関数を指定
  3. Lambda関数内でログを処理し、必要なアクションを実行

Elasticsearch/Kibanaとの連携

より高度な視覚化と分析が必要な場合、CloudWatch LogsからElasticsearchにログをストリーミングできます:

  1. CloudWatch Logsサブスクリプションフィルタを作成
  2. 送信先としてElasticsearchを指定
  3. Kibanaでダッシュボードを作成し、ログを視覚化

ベストプラクティス

  1. 構造化ログの使用: JSON形式など、構造化されたログを出力することで分析がしやすくなります
  2. ログレベルの適切な設定: 本番環境では適切なログレベル(INFO, WARN, ERROR等)を設定し、不要なログで溢れないようにします
  3. コンテキスト情報の付加: トランザクションIDやリクエストIDなどのコンテキスト情報をログに含めることで、関連するログを追跡しやすくなります
  4. 定期的なレビュー: アラートだけでなく、定期的にログを確認してパターンや傾向を把握します
  5. コスト管理: 不要なログは除外し、適切な保持期間を設定してコストを最適化します

まとめ

CloudWatch LogsとDockerの連携により、コンテナ化されたアプリケーションのログを効率的に収集、監視、分析することができます。適切なログ監視体制を構築することで、問題の早期発見と解決が可能になり、アプリケーションの安定性と信頼性が向上します。この記事で紹介した方法を活用して、効果的なログ監視システムを構築してください。

参考リソース

コメント

タイトルとURLをコピーしました