Fargate ログ記録 - Amazon EKS

このページの改善にご協力ください

本ユーザーガイドの改善にご協力いただけませんか? このページの下部までスクロールし、[GitHub でこのページの編集] を選択します。皆さまにご協力いただくことで、あらゆる人々に使いやすいユーザーガイドになります。

Fargate ログ記録

重要

Amazon EKS を使用した AWS Fargate は、AWS GovCloud (米国東部) および AWS GovCloud (米国西部) ではご利用いただけません。

Fargate の Amazon EKS では、Fluent Bit をベースにした組み込みのログルーターが利用できます。Fluent Bit コンテナをサイドカーとして明示的に実行する必要はなく、この実行は Amazon によって行われます。必要となるのは、ログルーターの設定だけです。設定は専用の ConfigMap を介して行い、その際は以下の基準を満たす必要があります。

  • 名前のついた aws-logging

  • aws-observability と呼ばれる専用の名前空間での作成

  • 5,300 文字以内にしてください。

ConfigMap を作成すると、Fargate の Amazon EKS は自動的にそれを検出しログルーターの設定を行います。Fargate は、Fluent Bit の AWS のバージョンを使用しています。これは、AWS によって管理される Fluent Bit の上流対応のディストリビューションです。詳細については、GitHub の「AWS 用の Fluent Bit」を参照してください。

ログルーターを使用すると、AWS のさまざまなサービスをログの分析と保管に使用できます。Fargate からは、Amazon CloudWatch、Amazon OpenSearch Service に対し直接ログをストリーミングできます。また、Amazon Data Firehose 経由で Amazon S3Amazon Kinesis Data Streams、およびパートナーツールなどの送信先にログをストリーミングすることも可能です。

前提条件

ログルーターの設定

ログルーターを設定するには

以下のステップでは、すべての example value を独自の値に置き換えます。

  1. aws-observability という名前の専用の Kubernetes 名前空間を作成します。

    1. 次の内容をコンピュータ上の aws-observability-namespace.yaml という名前のファイルに保存します。name の値は aws-observability である必要があり、aws-observability: enabled ラベルが必須です。

      kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled
    2. 名前空間を作成します。

      kubectl apply -f aws-observability-namespace.yaml
  2. データ値 Fluent Conf を使用して ConfigMap を作成し、コンテナログを送信先に送ります。Fluent Conf とは Fluent Bit であり、コンテナログを任意のログ送信先にルーティングするために使用される、高速で軽量なログプロセッサ設定言語です。詳細については、Fluent Bit ドキュメントの「Configuration File」(設定ファイル) を参照してください。

    重要

    典型的な Fluent Conf に含まれている主なセクションは、ServiceInputFilter および Output です。ただし、Fargate のログルータでは、以下だけを受け入れます。

    • Filter および Output セクション。

    • Parser セクション。

    他のセクションを提供した場合、拒否されます。

    Fargate ログルーターは Service および Input セクションを管理します。次の Input セクションがありますが、これらは変更できず、ConfigMap には必要ありません。ただし、メモリバッファー制限やログに適用されるタグなどの洞察は得られます。

    [INPUT] Name tail Buffer_Max_Size 66KB DB /var/log/flb_kube.db Mem_Buf_Limit 45MB Path /var/log/containers/*.log Read_From_Head On Refresh_Interval 10 Rotate_Wait 30 Skip_Long_Lines On Tag kube.*

    ConfigMap の作成時は、以下の (Fargate がフィールドの検証に使用する) ルールを考慮に入れます。

    • [FILTER][OUTPUT]および [PARSER] は、それぞれが対応するキーにより指定する必要があります。例: [FILTER]filters.conf の下にある必要があります。filters.conf には、複数の [FILTER] を含められます。また、[OUTPUT] および [PARSER] セクションは、それぞれと対応するキーの下に置く必要があります。複数の [OUTPUT] セクションを指定することで、ログを異なる送信先に同時にルーティングできます。

    • Fargate は各セクションに必要なキーを検証します。Name および match がそれぞれの [FILTER] および [OUTPUT] に必要です。Name および format がそれぞれの [PARSER] に必要です。キーの大文字と小文字は区別されません。

    • ${ENV_VAR} などの環境変数は ConfigMap では許可されていません。

    • インデントは、それぞれの filters.confoutput.conf、および parsers.conf の中で、ディレクティブまたはキーと値のペアで同じである必要があります。キーと値のペアは、ディレクティブよりも深いインデントにする必要があります。

    • Fargate は、サポートされている次のフィルターに対して検証します。grepparserrecord_modifierrewrite_tagthrottlenestmodify、および kubernetes

    • Fargate は、サポートされている次の出力に対して検証します。esfirehosekinesis_firehosecloudwatchcloudwatch_logs、および kinesis

    • ログ記録を有効にするには、サポートされている Output プラグインが少なくとも 1 つ ConfigMap にあることが必要です。Filter および Parser は、ログ記録を有効にするために必要ありません。

    また、希望の設定を使用して Amazon EC2 で Fluent Bit を実行し、検証によって発生する問題をトラブルシューティングすることもできます。以下のいずれかの例に従って、ConfigMap を作成します。

    重要

    Amazon EKS Fargate のログ記録では、ConfigMaps での動的設定をサポートしていません。ConfigMaps に対する変更はすべて、新しい Pods に対してのみ適用されます。既存の Pods に変更は適用されません。

    例を使用して、必要なログ送信先用に ConfigMap を作成します。

    注記

    また、Amazon Kinesis Data Streams をログの宛先として使用できます。Kinesis Data Streams を使用する場合は、ポッド実行ロールに kinesis:PutRecords 権限が付与されていることを確認してください。詳細については、Fluent Bit: 公式マニュアルの Amazon Kinesis Data Streams の「アクセス許可」を参照してください。

    CloudWatch

    CloudWatch の ConfigMap を作成するには

    CloudWatch を使用する場合、次の 2 つの出力オプションがあります。

    次の例は、cloudwatch_logs プラグインを使用して CloudWatch にログを送信する方法を示しています。

    1. 次の内容を aws-logging-cloudwatch-configmap.yaml という名前のファイルに保存します。region-code をクラスターのある AWS リージョン に置き換えます。[OUTPUT] のパラメータは必須です。

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: flb_log_cw: "false" # Set to true to ship Fluent Bit process logs to CloudWatch. filters.conf: | [FILTER] Name parser Match * Key_name log Parser crio [FILTER] Name kubernetes Match kube.* Merge_Log On Keep_Log Off Buffer_Size 0 Kube_Meta_Cache_TTL 300s output.conf: | [OUTPUT] Name cloudwatch_logs Match kube.* region region-code log_group_name my-logs log_stream_prefix from-fluent-bit- log_retention_days 60 auto_create_group true 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
    2. マニフェストをクラスターに適用します。

      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
    3. CloudWatch IAM ポリシーをコンピュータにダウンロードします。GitHub でポリシーの表示をすることもできます。

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
    Amazon OpenSearch Service

    Amazon OpenSearch Service の ConfigMap を作成するには

    Amazon OpenSearch Service にログを送信するには、es 出力を使用します。これは C で書かれたプラグインです。次の例は、プラグインを使用して OpenSearch にログを送信する方法を示しています。

    1. 次の内容を aws-logging-opensearch-configmap.yaml という名前のファイルに保存します。example value をすべて自分の値に置き換えてください。

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name es Match * Host search-example-gjxdcilagiprbglqn42jsty66y.region-code.es.amazonaws.com Port 443 Index example Type example_type AWS_Auth On AWS_Region region-code tls On
    2. マニフェストをクラスターに適用します。

      kubectl apply -f aws-logging-opensearch-configmap.yaml
    3. OpenSearch IAM ポリシーをコンピュータにダウンロードします。GitHub でポリシーの表示をすることもできます。

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json

      OpenSearch Dashboards のアクセスコントロールが適切に設定されていることを確認します。OpenSearch Dashboards の all_access role には、Fargate Pod の実行ロールと IAM ロールがマッピングされている必要があります。同様のマッピングが、security_manager ロールに対しても必要です。以前のマッピングを追加するには、MenuSecurityRoles の順にクリックした後、それぞれに対応するロールを選択します。詳細については、「CloudWatch Logs が Amazon ES ドメインにストリーミングされるようにトラブルシューティングする方法を教えてください。」を参照してください。

    Firehose

    Firehose 用の ConfigMap を作成するには

    Firehose にログを送信する場合、次の二つの出力オプションがあります。

    • kinesis_firehose — C で記述された出力プラグイン。

    • firehose — Golang で記述された出力プラグイン。

    次の例は、Firehose にログを送信するために kinesis_firehose プラグインを使用する方法を示しています。

    1. 次の内容を aws-logging-firehose-configmap.yaml という名前のファイルに保存します。region-code をクラスターのある AWS リージョン に置き換えます。

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name kinesis_firehose Match * region region-code delivery_stream my-stream-firehose
    2. マニフェストをクラスターに適用します。

      kubectl apply -f aws-logging-firehose-configmap.yaml
    3. Firehose IAM ポリシーをコンピュータにダウンロードします。GitHub でポリシーの表示をすることもできます。

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
  3. 前のステップでダウンロードしたポリシー ファイルを使用して、IAM ポリシーを作成します。

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
  4. 次のコマンドを使用して、Fargate プロファイルに指定されたポッド実行ロールに IAM ポリシーを添付します。111122223333 をアカウントID に置き換えます。AmazonEKSFargatePodExecutionRole を Pod の実行ロールに置き換えます (詳細については、「Fargate Pod 実行ロールを作成する」を参照してください)。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \ --role-name AmazonEKSFargatePodExecutionRole

Kubernetes フィルターのサポート

この機能には、最低限、次の Kubernetes バージョンとプラットフォームレベル以上が必要です。

Kubernetes バージョン プラットフォームレベル
1.23 以降 eks.1

Fluent Bit Kubernetes フィルターを使用すると、ログファイルに Kubernetes メタデータを追加できます。フィルターの詳細については、「Fluent Bit ドキュメント」の「Kubernetes」を参照してください。API サーバーエンドポイントを使用して、フィルターを適用できます。

filters.conf: | [FILTER] Name kubernetes Match kube.* Merge_Log On Buffer_Size 0 Kube_Meta_Cache_TTL 300s
重要
  • Kube_URLKube_CA_FileKube_Token_Command、および Kube_Token_File はサービス所有の設定パラメータであるため、指定しないでください。Amazon EKS Fargate がこれらの値を設定します。

  • Kube_Meta_Cache_TTL は、Fluent Bit が最新のメタデータを取得するために API サーバーと通信するまで待機する時間です。Kube_Meta_Cache_TTL が指定されていない場合、Amazon EKS Fargate は API サーバーの負荷を軽減するためにデフォルト値である 30 分を追加します。

Fluent Bit プロセスログをアカウントに送付するには

オプションで、Fluent Bit プロセスログを、次の ConfigMap を使用して Amazon CloudWatch に送付できます。Fluent Bit プロセスログを CloudWatch に送信するには、追加のログの取り込みおよびストレージのコストがかかります。region-code をクラスターのある AWS リージョン に置き換えます。

kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: # Configuration files: server, input, filters and output # ====================================================== flb_log_cw: "true" # Ships Fluent Bit process logs to CloudWatch. output.conf: | [OUTPUT] Name cloudwatch Match kube.* region region-code log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true

ログは CloudWatch でクラスターが存在する AWS リージョン にあります。ロググループ名は my-cluster-fluent-bit-logs で、Fluent Bit のログストリーム名は fluent-bit-podname-pod-namespace です。

注記
  • プロセスログは、Fluent Bit プロセスが正常に開始された場合にのみ送付されます。Fluent Bit の起動中に障害が発生すると、プロセスログを取得できません。プロセスログは CloudWatch にのみ送付できます。

  • プロセスログのアカウントへの送付をデバッグするには、前に使用した ConfigMap を適用して、プロセスログを取得します。Fluent Bit が起動に失敗するのは通常、開始時に Fluent Bit が ConfigMap を解析しないか、受け付けないためです。

Fluent Bit プロセスログの送信を停止するには

Fluent Bit プロセスログを CloudWatch に送信するには、追加のログの取り込みおよびストレージのコストがかかります。既存の ConfigMap 設定でプロセスログを除外するには、次のステップを実行します。

  1. Fargate ログ記録を有効にした後、Amazon EKS クラスターの Fluent Bit プロセスログ用に自動的に作成された CloudWatch ロググループを見つけます。これはフォーマット {cluster_name}-fluent-bit-logs に従います。

  2. CloudWatch ロググループ内の各 Pod's のプロセスログ用に作成された既存の CloudWatch ログストリームを削除します。

  3. ConfigMap を編集して flb_log_cw: "false" を設定します。

  4. クラスター内の既存の Pods を再起動します。

アプリケーションをテストする

  1. サンプル Pod をデプロイします。

    1. 次の内容をコンピュータ上の sample-app.yaml という名前のファイルに保存します。

      apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace: same-namespace-as-your-fargate-profile spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - name: http containerPort: 80
    2. マニフェストをクラスターに適用します。

      kubectl apply -f sample-app.yaml
  2. ConfigMap で設定した送信先を使用して、NGINX ログを表示します。

サイズに関する考慮事項

ログルーター用のメモリは、最大 50 MBに収まるようにすることをお勧めします。アプリケーションで非常に高いスループットでログが生成されることが予想される場合は、最大 100 MB を想定して計画する必要があります。

トラブルシューティング

ログ記録の機能が有効か無効かを確認するには、Pod イベントを kubectl describe pod pod_name でチェックしてください。ConfigMap が無効になっているなど何らかの理由で無効の場合は、その理由を確認できます。出力には、次の出力例のように、ログ記録が有効かどうかを明確にする Pod イベントが含まれる場合があります。

[...] Annotations: CapacityProvisioned: 0.25vCPU 0.5GB Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND kubernetes.io/psp: eks.privileged [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning LoggingDisabled <unknown> fargate-scheduler Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found

Pod イベントは一時的なもので、その期間は設定によります。kubectl describe pod pod-name を使用して、Pod's アノテーションを表示することもできます。Pod アノテーションには、ログ記録機能が有効か無効か、またその理由に関する情報があります。