Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Amazon EKS で CloudWatch にコンテナログをストリーミングする方法を教えてください。
Fluent Bit または Fluentd を使用して、Amazon Elastic Kubernetes Service (Amazon EKS) で実行しているコンテナのログを Amazon CloudWatch Logs にストリーミングしようとしています。
簡単な説明
Fluent Bit が CloudWatch Container Insights のデフォルトのログソリューションであるため、Fluentd ではなく Fluent Bit を使用することをおすすめします。Amazon は、Amazon Elastic Container Registry (Amazon ECR) に Fluent Bit のコンテナイメージを提供しています。詳細については、「Amazon ECS 用の AWS for Fluent Bit イメージリポジトリ」を参照してください。
Fluent Bit をダウンロードする方法については、Fluent Bit のウェブサイトで「Fluent Bit の始め方」を参照してください。Fluentd については、Fluentd のウェブサイトで「Fluentd のダウンロード」を参照してください。
ログを CloudWatch に送信するために Fluent Bit を DaemonSet として設定する際、Fluent Bit は次のロググループおよびソースを作成します。
- /aws/containerinsights/Cluster_Name/application ログのソースは、/var/log/containers 内のすべてのログファイルです。
- /aws/containerinsights/Cluster_Name/host ログのソースは、/var/log/dmesg、/var/log/secure、/var/log/messages 内のログです。
- /aws/containerinsights/Cluster_Name/dataplane ログのソースは、kubelet.service、kubeproxy.service、docker.service に関する /var/log/journal 内のログです。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Amazon EC2 クラスター上の Amazon EKS で実行するコンテナのログをストリーミングする
次の手順を実行します。
-
amazon-cloudwatch という名前の名前空間を作成するには、次のコマンドを実行します。
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
-
クラスター名とログの送信先の AWS リージョンを含む、fluent-bit-cluster-info という名前の ConfigMap を作成するには、次のコマンドを実行します。
ClusterName=my-cluster-name RegionName=my-cluster-region FluentBitHttpPort='2020' FluentBitReadFromHead='Off' [[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On' [[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' || FluentBitHttpServer='On' kubectl create configmap fluent-bit-cluster-info \ --from-literal=cluster.name=${ClusterName} \ --from-literal=http.server=${FluentBitHttpServer} \ --from-literal=http.port=${FluentBitHttpPort} \ --from-literal=read.head=${FluentBitReadFromHead} \ --from-literal=read.tail=${FluentBitReadFromTail} \ --from-literal=logs.region=${RegionName} -n amazon-cloudwatch
注: 実際のものでそれぞれ、my-cluster-name と my-cluster-region をクラスター名とリージョンに置き換えます。
-
Fluent Bit を使用して Amazon Elastic Compute Cloud (Amazon EC2) クラスターにログを送信するには、次の DaemonSet コマンドを実行します。
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
-
(オプション) Amazon ECR で Fluent Bit を使用するには、次の DaemonSet コマンド aws-for-fluent-bit を実行します。
kubectl patch ds fluent-bit -n amazon-cloudwatch -p \'{"spec":{"template":{"spec":{"containers":[{"name":"fluent-bit","image":"public.ecr.aws/aws-observability/aws-for-fluent-bit:latest"}]}}}}'
-
サービスアカウント用の AWS Identity and Access Management ロール (IRSA) を作成するには、次の eksctl コマンドを実行します。
eksctl create iamserviceaccount \ --name fluent-bit \ --namespace amazon-cloudwatch \ --cluster $CLUSTER \ --attach-policy-arn "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy" \ --approve \ --override-existing-serviceaccounts
詳細については、「Fluent Bit を DaemonSet として設定し、CloudWatch Logs にログを送信する」を参照してください。
Fluent Bit のデプロイに関するトラブルシューティング
次の手順を実行します。
-
amazon-cloudwatch 名前空間のポッド名を一覧表示するには、次のコマンドを実行します。
kubectl get pods -n amazon-cloudwatch
注: ポッド名は、fluent-bit-***** と返されます。
-
イベントの出力を確認するには、次のコマンドを実行します。
kubectl describe pod POD_NAME -n amazon-cloudwatch
注: POD_NAME は、実際のポッド名に置き換えます。
-
ログを確認するには、次のコマンドを実行します。
kubectl logs pod-name -n amazon-cloudwatch
注: POD_NAME は、実際のポッド名に置き換えます。
Fluent Bit のデプロイを削除する
Fluent Bit のデプロイを削除するには、次のコマンドを実行します。
kubectl delete configmap fluent-bit-cluster-info -n amazon-cloudwatch kubectl delete -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
Fargate クラスター上の Amazon EKS で実行するコンテナのログをストリーミングする
AWS Fargate クラスター上の Amazon EKS には、Fluent Bit をベースにしたログルーターが組み込まれています。AWS はユーザーに代わって自動的に Fluent Bit を実行します。詳細については、「クラスターで AWS Fargate のログ記録を開始する」を参照してください。
コンテナログを CloudWatch Logs にストリーミングするには、次の手順を実行します。
-
次のコマンドを実行し、aws-observability という専用の Kubernetes 名前空間を作成します。
cat <<EOF > aws-observability-namespace.yaml kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled EOF kubectl apply -f aws-observability-namespace.yaml
-
Fluent Conf のデータ値を使用してConfigMap を作成し、コンテナログを CloudWatch Logs にストリーミングするには、次のコマンドを実行します。
cat <<EOF > aws-logging-cloudwatch-configmap.yaml kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name cloudwatch_logs Match * region region-code log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true log_key log parsers.conf: | [PARSER] Name crio Format Regex Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$ Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%L%z filters.conf: | [FILTER] Name parser Match * Key_name log Parser crio EOF kubectl apply -f aws-logging-cloudwatch-configmap.yaml
-
CloudWatch 用の AWS マネージドポリシーを作成します。次に、Fargate プロファイルに指定したポッド実行ロールに IAM ポリシーをアタッチします。
IAM ポリシーファイルをダウンロードするには、次のコマンドを実行します。
curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
ポリシーファイルから IAM ポリシーを作成するには、次の create-policy コマンドを実行します。
aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
Fargate プロファイルに指定したポッド実行ロールに IAM ポリシーをアタッチするには、次の attach-role-policy コマンドを実行します。
aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \ --role-name your-pod-execution-role
注: 111122223333 は、実際の アカウント ID に置き換えます。
詳細については、「トラブルシューティング」を参照してください。
Fargate ポッドで EKS ログのストリーミングを無効にする
Fargate ポッドで EKS ログのストリーミングを無効にするには、次のコマンドを実行します。
kubectl delete namespace aws-observability
ポッドを削除し、aws-observability 名前空間を削除してから、ポッドを再デプロイします。

関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 4ヶ月前lg...