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:CreateLogGroup、logs:CreateLogStream、logs:PutLogEvents、logs:DescribeLogGroups、およびlogs:DescribeLogStreams(CloudWatchAgentServerPolicy管理ポリシーに含まれる) -
ノードアクセス: コレクターは各ノードの
/var/log/podsにアクセスする必要があります
ロググループとソース
次の表は、OTel Container Insights が作成するロググループと、その収集元のソースを示しています。
| ロググループ | ソース | 内容 |
|---|---|---|
/aws/containerinsights/ |
/var/log/pods/**/*.log |
すべてのコンテナの stdout ログと stderr ログ |
注記
ホストとデータプレーンのログは、今後のリリースで利用可能になります。
OTel ログパイプラインの仕組み
アドオンの OpenTelemetry Collector は、次のコンポーネントを含むログパイプラインを実行します。
-
レシーバー –
filelogレシーバーは/var/log/pods/からコンテナログファイルをテーリングします。 -
プロセッサ –
k8sattributesプロセッサは Kubernetes メタデータでログを充実化します。batchプロセッサは、エクスポート前にログレコードをバッチ処理します。resourceプロセッサはリソース属性を追加します。 -
エクスポーター –
awscloudwatchlogsエクスポーターは CloudWatch Logs にログレコードを送信します。
ログエンリッチメント
パイプラインは、すべてのログレコードを次の属性で充実化します。
-
Kubernetes リソース属性 –
k8s.pod.name、k8s.namespace.name、k8s.container.name、k8s.node.name、およびk8s.deployment.name -
ポッドラベル –
k8s.pod.label.*属性としてのすべてのポッドラベル -
クラウド属性 –
cloud.region、cloud.account.id、およびcloud.platform -
クラスター属性 –
k8s.cluster.name
ログ収集のカスタマイズ
アドオン設定値を更新することで、ログ収集をカスタマイズできます。以下のセクションでは、一般的なカスタマイズオプションについて説明します。
ログ収集を無効にする
ログ収集を完全に無効にするには、コンテナログを無効にしてアドオン設定を更新します。
ログ収集を無効にするには
-
以下のコマンドを実行してください。
cluster-nameは、自分の Amazon EKS クラスターに置き換えます。aws eks update-addon \ --cluster-namecluster-name\ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":false}}' \ --resolve-conflicts OVERWRITE
ログ収集から名前空間を除外する
ログ収集から特定の名前空間を除外するには、excludeNamespaces 設定オプションを使用します。
ログ取集から名前空間を除外するには
-
以下のコマンドを実行してください。
cluster-nameは、自分の Amazon EKS クラスターに置き換えます。名前空間の値を、除外する名前空間に置き換えます。aws eks update-addon \ --cluster-namecluster-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-namecluster-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-namecluster-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-days30
検証
ログ収集が動作していることを確認するには、予想されるロググループが存在し、データが含まれていることを確認します。
ログ収集を確認するには
-
以下のコマンドを実行してください。
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/ ロググループが CloudWatch Logs に表示されません。cluster-name/application
原因: コレクターに、ロググループとログストリームを作成するために必要な IAM アクセス許可がないためです。
解決策: コレクターに関連付けられた IAM ロールに CloudWatchAgentServerPolicy 管理ポリシーがアタッチされていることを確認します。このポリシーには、logs:CreateLogGroup および logs:CreateLogStream アクセス許可が含まれます。
アプリケーションロググループは存在するが、中身がない
症状: アプリケーションロググループは CloudWatch Logs に存在しますが、ログストリームやログイベントが何も含まれません。
原因: この問題は、コンテナが stdout や stderr に書き込んでいない場合、またはファイルログレシーバーがノードで /var/log/pods/ にアクセスできない場合に発生します。
解決策: この問題を解決するには、次の手順に従います。
-
アプリケーションコンテナが stdout または stderr にログを書き込むことを確認します。
-
コレクター DaemonSet ポッドに
/var/log/podsのボリュームマウントがあることを確認します。kubectl get daemonset -n amazon-cloudwatch -o yaml | grep -A 5 "var/log/pods" -
コレクターログでファイルアクセスエラーを確認します。
kubectl logs -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent --tail=50 | grep -i "error\|permission"
CloudWatch Logs のコストが高い
症状: CloudWatch Logs の取り込みまたはストレージコストが予想以上に高い。
原因: 大量の名前空間 (負荷テストやモニタリングの名前空間など) は、大量のログを生成するためです。
解決策: コストを削減するには、次の手順を実行します。
-
ログ収集から大量の名前空間を除外します。手順については、「ログ収集から名前空間を除外する」を参照してください。
-
ロググループに保持ポリシーを設定して、古いログを自動的に削除します。手順については、「ログの保持を設定する」を参照してください。