Fargate ログ記録 - Amazon EKS

Fargate ログ記録

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

  • 名前のついた aws-logging

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

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

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

Prerequisites

ログルーターの設定

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

次に示す手順は、<example values> (<> を含む) を、自分が使用している値に置き換え使用ます。

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

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

      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 セクションを受け入れ、Service および Input セクションは内部で管理します。

    • Parser セクション。

    FilterOutputおよび Parser 以外のセクションを導入しても拒否されます。

    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_tagthrottlenest、および modify

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

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

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

    重要

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

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

    CloudWatch

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

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

    1. 次の内容を aws-logging-cloudwatch-configmap.yaml という名前のファイルに保存します。[OUTPUT] のパラメータは必須です。

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: output.conf: | [OUTPUT] Name cloudwatch_logs Match * region us-east-1 log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- 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 filters.conf: | [FILTER] Name parser Match * Key_name log Parser crio Reserve_Data On Preserve_Key On
    2. マニフェストをクラスターに適用します。

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

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

    Amazon Elasticsearch Service にログを送信する場合。C で書かれたプラグインである、[es] 出力を使用することができます。以下の例では、Elasticsearch にログを送信するためにプラグインを使用する方法について説明します。

    1. 次の内容を aws-logging-elasticsearch-configmap.yaml という名前のファイルに保存します。

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

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

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

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

    Kinesis Data Firehose

    Kinesis Data Firehose にログを送信します。Kinesis Data Firehose を使用する場合、次の 2 つの出力オプションがあります。

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

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

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

    1. 次の内容を aws-logging-firehose-configmap.yaml という名前のファイルに保存します。

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

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

      curl -o permissions.json 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. IAM ポリシーを、Fargate プロファイルに指定されたポッド実行ロールにアタッチします。111122223333 をアカウント ID に置き換えます。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \ --role-name your-pod-execution-role

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

  1. サンプルポッドをデプロイします。

    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 を想定して計画する必要があります。

Troubleshooting

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

... 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

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