Global outage event
If you’re experiencing issues with your AWS services, then please refer to the AWS Health Dashboard. You can find the overall status of ongoing outages, the health of AWS services, and the latest updates from AWS engineers.
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.jsonFargate プロファイルに指定したポッド実行ロールに 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 名前空間を削除してから、ポッドを再デプロイします。
