View a markdown version of this page

Amazon CloudWatch へのログの送信 - Amazon CloudWatch

Amazon CloudWatch へのログの送信

OTel Container Insights は、OpenTelemetry Collector のログパイプラインを使用してコンテナログを収集し、Amazon CloudWatch Logs に送信します。Amazon CloudWatch Observability EKS アドオンは、OpenTelemetry Collector を DaemonSet としてデプロイします。これは、ファイルログレシーバーを使用してコンテナログファイルをテーリングし、Kubernetes メタデータで充実化し、CloudWatch Logs エクスポーターを介して CloudWatch Logs にエクスポートします。

基本的なログ収集に追加のセットアップは必要ありません。ログ収集は、クイックスタート: Amazon EKS での OTel Container Insights に従うとデフォルトで有効になります。

前提条件

ログ収集を設定する前に、次の要件を満たしていることを確認してください。

  • OTel Container Insights がインストールされ、クラスターで amazon-cloudwatch-observability アドオンがアクティブになっている

  • IAM アクセス許可: logs:CreateLogGrouplogs:CreateLogStreamlogs:PutLogEventslogs:DescribeLogGroups、および logs:DescribeLogStreams (CloudWatchAgentServerPolicy 管理ポリシーに含まれる)

  • ノードアクセス: コレクターは各ノードの /var/log/pods にアクセスする必要があります

ロググループとソース

次の表は、OTel Container Insights が作成するロググループと、その収集元のソースを示しています。

ロググループ ソース 内容
/aws/containerinsights/cluster-name/application /var/log/pods/**/*.log すべてのコンテナの stdout ログと stderr ログ
注記

ホストとデータプレーンのログは、今後のリリースで利用可能になります。

OTel ログパイプラインの仕組み

アドオンの OpenTelemetry Collector は、次のコンポーネントを含むログパイプラインを実行します。

  • レシーバーfilelog レシーバーは /var/log/pods/ からコンテナログファイルをテーリングします。

  • プロセッサk8sattributes プロセッサは Kubernetes メタデータでログを充実化します。batch プロセッサは、エクスポート前にログレコードをバッチ処理します。resource プロセッサはリソース属性を追加します。

  • エクスポーターawscloudwatchlogs エクスポーターは CloudWatch Logs にログレコードを送信します。

ログエンリッチメント

パイプラインは、すべてのログレコードを次の属性で充実化します。

  • Kubernetes リソース属性k8s.pod.namek8s.namespace.namek8s.container.namek8s.node.name、および k8s.deployment.name

  • ポッドラベルk8s.pod.label.* 属性としてのすべてのポッドラベル

  • クラウド属性cloud.regioncloud.account.id、および cloud.platform

  • クラスター属性k8s.cluster.name

ログ収集のカスタマイズ

アドオン設定値を更新することで、ログ収集をカスタマイズできます。以下のセクションでは、一般的なカスタマイズオプションについて説明します。

ログ収集を無効にする

ログ収集を完全に無効にするには、コンテナログを無効にしてアドオン設定を更新します。

ログ収集を無効にするには
  • 以下のコマンドを実行してください。cluster-name は、自分の Amazon EKS クラスターに置き換えます。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":false}}' \ --resolve-conflicts OVERWRITE

ログ収集から名前空間を除外する

ログ収集から特定の名前空間を除外するには、excludeNamespaces 設定オプションを使用します。

ログ取集から名前空間を除外するには
  • 以下のコマンドを実行してください。cluster-name は、自分の Amazon EKS クラスターに置き換えます。名前空間の値を、除外する名前空間に置き換えます。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":true,"excludeNamespaces":["kube-system","load-testing","monitoring"]}}' \ --resolve-conflicts OVERWRITE

特定の名前空間のみを含める

特定の名前空間のみからログを収集するには、includeNamespaces 設定オプションを使用します。

特定の名前空間のみを含めるには
  • 以下のコマンドを実行してください。cluster-name は、自分の Amazon EKS クラスターに置き換えます。名前空間の値を、含める名前空間に置き換えます。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":true,"includeNamespaces":["production","staging"]}}' \ --resolve-conflicts OVERWRITE

複数行のログ解析を設定する

複数行のログエントリ (スタックトレースなど) を単一のログレコードに結合するには、複数行解析を 1 行目のパターンで設定します。

複数行のログ解析を設定するには
  • 以下のコマンドを実行してください。cluster-name は、自分の Amazon EKS クラスターに置き換えます。firstLinePattern の値を、各ログエントリの最初の行と一致する正規表現パターンに置き換えます。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":true,"multilineConfig":{"firstLinePattern":"^\\d{4}-\\d{2}-\\d{2}|^\\[\\d{4}","parseFormat":"auto"}}}' \ --resolve-conflicts OVERWRITE

ログの保持を設定する

デフォルトでは、ログデータは CloudWatch Logs に無期限に保持されます。ストレージコストを制御するために、ロググループに保持ポリシーを設定できます。

ログの保持を設定するには
  • 以下のコマンドを実行してください。cluster-name は、自分の Amazon EKS クラスターに置き換えます。30 をログを保持する日数に置き換えます。

    aws logs put-retention-policy \ --log-group-name "/aws/containerinsights/cluster-name/application" \ --retention-in-days 30

検証

ログ収集が動作していることを確認するには、予想されるロググループが存在し、データが含まれていることを確認します。

ログ収集を確認するには
  • 以下のコマンドを実行してください。cluster-name は、自分の Amazon EKS クラスターに置き換えます。

    aws logs describe-log-groups \ --log-group-name-prefix "/aws/containerinsights/cluster-name" \ --query "logGroups[].{Name:logGroupName,StoredBytes:storedBytes}" \ --output table

    出力には、ロググループ名と保存されたバイト数が表示されます。StoredBytes の値がゼロ以外であることで、パイプラインがログを配信していることが確認されます。

トラブルシューティング

一般的なログ収集の問題を解決するには、次のガイダンスを使用します。

5 分経過してもロググループが作成されない

症状: 5 分経過しても /aws/containerinsights/cluster-name/application ロググループが CloudWatch Logs に表示されません。

原因: コレクターに、ロググループとログストリームを作成するために必要な IAM アクセス許可がないためです。

解決策: コレクターに関連付けられた IAM ロールに CloudWatchAgentServerPolicy 管理ポリシーがアタッチされていることを確認します。このポリシーには、logs:CreateLogGroup および logs:CreateLogStream アクセス許可が含まれます。

アプリケーションロググループは存在するが、中身がない

症状: アプリケーションロググループは CloudWatch Logs に存在しますが、ログストリームやログイベントが何も含まれません。

原因: この問題は、コンテナが stdout や stderr に書き込んでいない場合、またはファイルログレシーバーがノードで /var/log/pods/ にアクセスできない場合に発生します。

解決策: この問題を解決するには、次の手順に従います。

  1. アプリケーションコンテナが stdout または stderr にログを書き込むことを確認します。

  2. コレクター DaemonSet ポッドに /var/log/pods のボリュームマウントがあることを確認します。

    kubectl get daemonset -n amazon-cloudwatch -o yaml | grep -A 5 "var/log/pods"
  3. コレクターログでファイルアクセスエラーを確認します。

    kubectl logs -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent --tail=50 | grep -i "error\|permission"

CloudWatch Logs のコストが高い

症状: CloudWatch Logs の取り込みまたはストレージコストが予想以上に高い。

原因: 大量の名前空間 (負荷テストやモニタリングの名前空間など) は、大量のログを生成するためです。

解決策: コストを削減するには、次の手順を実行します。

  1. ログ収集から大量の名前空間を除外します。手順については、「ログ収集から名前空間を除外する」を参照してください。

  2. ロググループに保持ポリシーを設定して、古いログを自動的に削除します。手順については、「ログの保持を設定する」を参照してください。