

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

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# クラスターの AWS Fargate ログ記録を開始する
<a name="fargate-logging"></a>

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 for Fluent Bit](https://github.com/aws/aws-for-fluent-bit)」を参照してください。

ログルーターを使用すると、AWS のさまざまなサービスをログの分析と保管に使用できます。Fargate からは、Amazon CloudWatch、Amazon OpenSearch Service に対し直接ログをストリーミングできます。また、[Amazon Data Firehose](https://aws.amazon.com/kinesis/data-firehose/) 経由で [Amazon S3](https://aws.amazon.com/s3/)、[Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams/)、およびパートナーツールなどの送信先にログをストリーミングすることも可能です。
+ Fargate Pod をデプロイする既存の Kubernetes 名前空間を指定する既存の Fargate プロファイル。詳細については、「[ステップ 3: クラスターの Fargate プロファイルを作成する](fargate-getting-started.md#fargate-gs-create-profile)」を参照してください。
+ 既存の Fargate Pod 実行ロール。詳細については、「[ステップ 2: Fargate Pod 実行ロールを作成する](fargate-getting-started.md#fargate-sg-pod-execution-role)」を参照してください。

## ログルーターの設定
<a name="fargate-logging-log-router-configuration"></a>

**重要**  
ログを正常に公開するには、そのクラスターが属している VPC からログの送信先までの、ネットワークアクセスが必要になります。これには、ユーザーによる VPC の出力ルールの、カスタマイズが関係します。詳細については、「*Amazon CloudWatch Logs ユーザーガイド*」の「[Using CloudWatch Logs with interface VPC endpoints](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)」を参照してください。

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

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

   1. 名前空間を作成します。

      ```
      kubectl apply -f aws-observability-namespace.yaml
      ```

1. データ値 `Fluent Conf` を使用して `ConfigMap` を作成し、コンテナログを送信先に送ります。Fluent Conf とは Fluent Bit であり、コンテナログを任意のログ送信先にルーティングするために使用される、高速で軽量なログプロセッサ構成言語です。詳細については、Fluent Bit ドキュメントの「[Configuration File](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file)」を参照してください。
**重要**  
典型的な `Fluent Conf` に含まれている主なセクションは、`Service``Input`、`Filter` および `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.conf`、`output.conf`、および `parsers.conf` の中で、ディレクティブまたはキーと値のペアで同じである必要があります。キーと値のペアは、ディレクティブよりも深いインデントにする必要があります。
   + Fargate は、サポートされている次のフィルターに対して検証します。`grep`、`parser`、`record_modifier`、`rewrite_tag`、`throttle`、`nest`、`modify`、および `kubernetes`。
   + Fargate は、サポートされている次の出力に対して検証します。`es`、`firehose`、`kinesis_firehose`、`cloudwatch`、`cloudwatch_logs`、および `kinesis`。
   + ログ記録を有効にするには、サポートされている `Output` プラグインが少なくとも 1 つ `ConfigMap` にあることが必要です。`Filter` および `Parser` は、ログ記録を有効にするために必要ありません。

     また、希望の設定を使用して Amazon EC2 で Fluent Bit を実行し、検証によって発生する問題をトラブルシューティングすることもできます。以下のいずれかの例に従って、`ConfigMap` を作成します。
**重要**  
Amazon EKS Fargate のログ記録では、`ConfigMap` での動的設定をサポートしていません。`ConfigMap` に対する任意の変更は、新しい Pod に対してのみ適用されます。既存の Pod には、これらの変更は適用されません。

     例を使用して、必要なログ送信先用に `ConfigMap` を作成します。
**注記**  
また、Amazon Kinesis Data Streams をログの宛先として使用できます。Kinesis Data Streams を使用する場合は、ポッド実行ロールに `kinesis:PutRecords` 権限が付与されていることを確認してください。詳細については、「*Fluent Bit: 公式マニュアル*」の Amazon Kinesis Data Streams の「[許可](https://docs.fluentbit.io/manual/pipeline/outputs/kinesis#permissions)」を参照してください。  
**Example**  

------
#### [ CloudWatch ]

   CloudWatch を使用する場合、次の 2 つの出力オプションがあります。
   +  [C で記述された出力プラグイン](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/cloudwatch) 
   +  [Golang で記述された出力プラグイン](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit) 

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

   1. 次の内容を `aws-logging-cloudwatch-configmap.yaml` という名前のファイルに保存します。*地域コード* を、クラスターのある 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
      ```

   1. マニフェストをクラスターに適用します。

      ```
      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
      ```

------
#### [ Amazon OpenSearch Service ]

   ログを Amazon OpenSearch Service に送信したい場合、C で書かれたプラグインである、[es](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/elasticsearch) 出力を使用することができます。以下の例では、OpenSearch にログを送信するためにプラグインを使用する方法について説明します。

   1. 次の内容を `aws-logging-opensearch-configmap.yaml` という名前のファイルに保存します。各*サンプル値*は独自の値に置き換えます。

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

   1. マニフェストをクラスターに適用します。

      ```
      kubectl apply -f aws-logging-opensearch-configmap.yaml
      ```

------
#### [ Firehose ]

   Firehose にログを送信する場合、次の二つの出力オプションがあります。
   +  [kinesis\$1firehose](https://docs.fluentbit.io/manual/pipeline/outputs/firehose) – C 言語で記述された出力プラグイン。
   +  [firehose](https://github.com/aws/amazon-kinesis-firehose-for-fluent-bit) — Go 言語で記述された出力プラグイン。

     次の例は、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
        ```

     1. マニフェストをクラスターに適用します。

        ```
        kubectl apply -f aws-logging-firehose-configmap.yaml
        ```

------

1. 目的の宛先にログを送信できるように Fargate Pod 実行ロールに対するアクセス許可を設定します。

   1. 送信先の IAM ポリシーをコンピュータにダウンロードします。  
**Example**  

------
#### [ CloudWatch ]

      CloudWatch IAM ポリシーをコンピュータにダウンロードします。GitHub で[ポリシーの表示](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json)をすることもできます。

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

------
#### [ Amazon OpenSearch Service ]

      OpenSearch IAM ポリシーをコンピュータにダウンロードします。GitHub で[ポリシーの表示](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json)をすることもできます。

      ```
      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` ロールに対しても必要です。以前のマッピングを追加するには、`Menu`、`Security`、`Roles` の順にクリックした後、それぞれに対応するロールを選択します。詳細については、「[CloudWatch Logs が Amazon ES ドメインにストリーミングされるようにトラブルシューティングする方法を教えてください。](https://aws.amazon.com/tr/premiumsupport/knowledge-center/es-troubleshoot-cloudwatch-logs/)」を参照してください。

------
#### [ Firehose ]

      Firehose IAM ポリシーをコンピュータにダウンロードします。GitHub で[ポリシーの表示](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json)をすることもできます。

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

------

   1. ダウンロードしたポリシーファイルから IAM ポリシーを作成します。

      ```
      aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
      ```

   1. 次のコマンドを使用して、Fargate プロファイルに指定されたポッド実行ロールに IAM ポリシーを添付します。*111122223333* は、ご自分のアカウント ID に置き換えます。*AmazonEKSFargatePodExecutionRole* を Pod 実行ロールに置き換えます (詳細については、「[ステップ 2: Fargate Pod 実行ロールを作成する](fargate-getting-started.md#fargate-sg-pod-execution-role)」を参照してください)。

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

### Kubernetes フィルターのサポート
<a name="fargate-logging-kubernetes-filter"></a>

Fluent Bit Kubernetes フィルターを使用すると、Kubernetes メタデータをログファイルに追加できます。フィルターの詳細については、Fluent Bit ドキュメントの [Kubernetes](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes) を参照してください。API サーバーエンドポイントを使用して、フィルターを適用できます。

```
filters.conf: |
    [FILTER]
        Name             kubernetes
        Match            kube.*
        Merge_Log           On
        Buffer_Size         0
        Kube_Meta_Cache_TTL 300s
```

**重要**  
 `Kube_URL`、`Kube_CA_File`、`Kube_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 プロセスログをアカウントに送付するには
<a name="ship-fluent-bit-process-logs"></a>

必要に応じて、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 が起動に失敗するのは、通常、起動中に `ConfigMap` が Fluent Bit によって解析または受け入れられていないためです。

### Fluent Bit プロセスログの送信を停止するには
<a name="stop-fluent-bit-process-logs"></a>

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

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

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

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

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

## アプリケーションをテストする
<a name="fargate-logging-test-application"></a>

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

   1. マニフェストをクラスターに適用します。

      ```
      kubectl apply -f sample-app.yaml
      ```

1. `ConfigMap` で設定した送信先を使用して、NGINX ログを表示します。

## サイズに関する考慮事項
<a name="fargate-logging-size-considerations"></a>

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

## トラブルシューティング
<a name="fargate-logging-troubleshooting"></a>

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

```
[...]
Annotations:          CapacityProvisioned: 0.25vCPU 0.5GB
                      Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
[...]
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 のアノテーションを表示することもできます。Pod アノテーションには、ロギング機能が有効か無効かとその理由に関する情報があります。