Amazon Web Services ブログ

Kinesis Data Firehose と Fluent Bit for Amazon EKS on AWS Fargate によるサードパーティーへのログ送信

この記事は Shipping logs to third-parties with Kinesis Data Firehose and Fluent Bit for Amazon EKS on AWS Fargate (記事公開日: 2022 年 4 月 20 日) を翻訳したものです。

AWS Fargate は EKS クラスターで Pod を動作させるためのキャパシティをオンデマンドで提供するテクノロジーです。Fargate は EC2 インスタンスの管理を必要とせずにコンテナアプリケーションを実行できるようにすることで、より手のかからない体験を提供します。AWS Fargate は Kubernetes の各 Pod を独自の隔離されたセキュリティ境界内で実行します。これは EC2 インスタンス上で動作する Kubernetes Pod とは少し異なる動作モデルであることを意味しています。

この記事では、Amazon EKS の AWS Fargate で動作するコンテナからのアプリケーションログを Splunk にルーティングすることで、 統合ログ管理のコンプライアンスを満たしながら、AWS Fargate の利便性を享受する方法を紹介します。

アプリケーションのメトリクスを取得するには AWS Distro for OpenTelemetry を使用した CloudWatch Container Insights の Amazon EKS Fargate サポート を活用します。Amazon CloudWatch で EKS Fargate Pod の CPU と メモリ使用量を表示することができます。アプリケーションログについては、AWS Fargate が Fluent Bit をベースにしたフルマネージドの組み込みのログルーターを提供しているため、ワークロードのマニフェストに対して追加のコンポーネントを定義する必要はありません。

Fluent Bit ログルーターを使用するためには、Kubernetes ConfigMap を作成し、Fluent Bit の Filter と Parser を定義してください。そしてサポートされる出力先として CloudWatch Logs、Amazon OpenSearch、Amazon Kinesis Data Firehose、Amazon Kinesis Data Streams のいずれかを定義してください。

また多くの組織では SplunkDatadogNew Relic などのサードパーティーのロギングおよびオブザーバビリティソリューションを使用しています。現状は AWS Fargate のログルーターはこれらの出力先を直接サポートしていないため、代わりに Amazon Kinesis Data Firehose を使ってロギングパイプラインを作成します。AWS Fargate は、ログデータをサードパーティーにストリーミングする前に、ログルーターから Kinesis Data Firehose にログデータを送信できます。

上記のアーキテクチャはこの図に沿ったものです。

概要

このウォークスルーは 3 つの大まかなステップに分けることができます。

  1. Splunk デプロイメントを構成する
  2. Kinesis Firehose 配信ストリームを作成する
  3. EKS クラスター、Fargate プロファイル、Fluent Bit ConfigMap を構成する

前提条件

  • EKS クラスターと Kinesis Data Firehose を作成するためのアクセス許可を持つ AWS アカウント
  • AWS CLIkubectleksctlGit がインストールされていること

Splunk デプロイメントを構成する

  1. Splunk サーバーをデプロイします。EC2 Linux インスタンスに Splunk をインストールする場合は、Splunk Manual – Install on Linux を参照してください。既に Splunk デプロイメントが利用可能な場合は、このステップは必要ない可能性があります。
  2. Splunk プラットフォームはパブリックに公開されている必要があります。Kinesis Data Firehose が Splunk デプロイメントに到達できるようにするには、この IP レンジ から Splunk デプロイメントに到達できること、および Splunk デプロイメントでポート番号 8088 が開かれていることを確認します。
  3. Splunk のエンドポイントは TLS 証明書で保護される必要があります。自己署名証明書はサポートされていません。完全に信頼できる証明書を生成するために Let’s Encrypt を検討してください。以下の server.conf の例では /opt/splunk/etc/auth/mycerts/myServerCert.pem が証明書と秘密鍵の両方を含むファイルになります。
    ubuntu@ip-192-168-5-11:~$ sudo cat /opt/splunk/etc/system/local/server.conf
    [general]
    serverName = ip-192-168-5-11
    pass4SymmKey = $7$Ns...
    
    [sslConfig]
    sslKeysfile = /opt/splunk/etc/auth/mycerts/myServerCert.pem
    ...
  4. Splunk のドキュメントに従って、HTTP Event Collector を作成し Indexer acknowledgement が選択されていることを確認します。作成後、トークンの値、例えば BD274822-96AA-4DA6-90EC-18940FB2414C を、ワークステーションのクリップボードにコピーしてください。

  5. Splunk デプロイメントがデータを受信する準備ができているかテストするには、BD274822-96AA-4DA6-90EC-18940FB2414C を先程コピーしたトークンに置き換えてください。テストでのみ使用するため X-Splunk-Request-Channel の値をランダムな UUID に変更します。
    curl "https://mysplunkhost.com:8088/services/collector" \
        -H "X-Splunk-Request-Channel: FE0ECFAD-13D5-401B-847D-77833BD77131" \
        -H "Authorization: Splunk BD274822-96AA-4DA6-90EC-18940FB2414C" \  
        -d '{"event": "Hello, world!", "sourcetype": "manual"}' -v
    
    Bash

Kinesis Firehose 配信ストリームを作成する

  1. Amazon Kinesis コンソールのページで「Delivery Streams」ページの「Create delivery stream」をクリックします。
  2. Source」フィールドは「Direct PUT」を選択します。「Destination」フィールドは「Splunk」を選択します。
  3. Splunk クラスターのエンドポイント (http://mysplunkhost.com:8088 など) と認証トークン (例えば BD274822-96AA-4DA6-90EC-18940FB2414C) を入力します。
  4. その他の項目はデフォルト値のまま「Create delivery stream」を選択します。

これで作成した新しい配信ストリームを操作できるようになりました。「Start sending demo data」を実行すると、Splunk 環境にテストデータが表示されるはずです。Splunk 環境にログが表示されない場合、CloudWatch メトリクスの「DeliverytoSplunk.success」と「Destination error logs」を確認することでトラブルシュートできます。

EKS クラスター、Fargate プロファイル、Fluent Bit を構成する

セットアップの最後の部分では、Fargate で EKS クラスターを作成し、組み込みのログルーターで Kinesis Data Firehose にログを送信するよう設定します。

1. Fargate プロファイルと EKS クラスターを定義する eksctl YAML マニフェストを作成します。

cat > eks-cluster-config.yaml << EOF apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: fluentbit region: us-west-2 iam: withOIDC: true fargateProfiles: - name: defaultfp selectors: - namespace: fargate EOF
Bash

2. eksctl コマンドを実行して EKS クラスターを作成します。EKS クラスターと Fargate プロファイルの作成が完了するまで数分かかることに注意してください。

$ eksctl create cluster -f eks-cluster-config.yaml
Bash

3. Fluent Bit のための aws-observability namespaceConfigMap を作成します。PUT-SPK-k0itr を先ほど作成した Kinesis Firehose 配信ストリームの名前に置き換え、以下のコマンドを使用して Fluent Bit の設定を作成します。


# Create the Kubernetes Namespace
$ kubectl create ns aws-observability

# Create the Config Map File
$ cat > fluentbit-config.yaml << EOF apiVersion: v1 kind: ConfigMap metadata: name: aws-logging namespace: aws-observability data: filters.conf: | [FILTER] Name kubernetes Match kube.* Merge_Log On Buffer_Size 0 Kube_Meta_Cache_TTL 300s flb_log_cw: 'true' output.conf: | [OUTPUT] Name kinesis_firehose Match kube.* region us-west-2 delivery_stream PUT-SPK-k0itr EOF

# Create the Config Map in the Cluster
$ kubectl apply -f fluentbit-config.yaml

4. AWS Fargate で動作するログルーターによる Kinesis Data Firehose への書き込みを許可するために、Pod 実行ロールに IAM ポリシーをアタッチします。これにより、Kubernetes Pod で実行されているワークロードではなく、基盤となる Fargate のリソースが、Kinesis Data Firehose に書き込む権限を得ることができます。まず allow_kinesis_put_permission.json というポリシーを定義します。ファイルを作成する際に、ARN を Firehose 配信ストリームの ARN に置き換えてください。

$ cat > allow_kinesis_put_permission.json << EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch" ], "Resource": "arn:aws:firehose:<region>:<accountid>:deliverystream/<firehose>" } ] } EOF

# Create the IAM Policy
$ aws iam create-policy \
        --policy-name FluentBitEKSFargate \
        --policy-document file://allow_kinesis_put_permission.json 

# Retrieve the Fargate Pod Execution Role
$ POD_EXEC_ROLE=$(aws eks describe-fargate-profile \ --cluster-name fluentbit \ --fargate-profile-name defaultfp | jq -r '.fargateProfile.podExecutionRoleArn')

# Attach the IAM Policy to the Pod Execution Role
$ aws iam attach-role-policy \
        --policy-arn arn:aws:iam::123456789012:policy/FluentBitEKSFargate \
        --role-name $POD_EXEC_ROLE
Bash

サンプルアプリケーションをデプロイする

ログを生成し、ログパイプラインが機能していることをテストするために、AWS Fargate 上で動作する Nginx Pod をデプロイします。

$ cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace: Fargate spec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 EOF
Bash

Pod が動作したら、kubectl コマンドでログを取得し、Splunk 内のログを比較します。

$ kubectl logs -n fargate --selector app=nginx

/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2022/03/09 08:21:06 [notice] 1#1: using the "epoll" event method
2022/03/09 08:21:06 [notice] 1#1: nginx/1.21.6
2022/03/09 08:21:06 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2022/03/09 08:21:06 [notice] 1#1: OS: Linux 4.14.262-200.489.amzn2.x86_64
2022/03/09 08:21:06 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1024:65535
2022/03/09 08:21:06 [notice] 1#1: start worker processes
2022/03/09 08:21:06 [notice] 1#1: start worker process 31
2022/03/09 08:21:06 [notice] 1#1: start worker process 32
Bash

理想としては、同じログの行が Splunk に表示され、Kubernetes Filter によって追加のメタデータが含まれます。

クリーンアップ

今後の課金を避けるため、以下のコマンドを使用して Kinesis Firehose 及び EKS クラスターを含む全てのリソースを削除してください。

# Delete Kinesis Data Firehose
$ aws firehose delete-delivery-stream --delivery-stream-name PUT-SPK-hixCS

# Delete the EKS Cluster
$ aws iam detach-role-policy \
    --role-name eksctl-fluentbit-cluster-FargatePodExecutionRole-XXXXXXXXXX \
    --policy-arn arn:aws:iam::123456789012:policy/FluentBitEKSFargate
    
$ eksctl delete cluster -f eks-cluster-config.yaml
Bash

結論

この記事では、Splunk を最終的なターゲットとして、Kinesis Data Firehose を用いて Fargate からサードパーティーのロギングソリューションにログを送信する方法を紹介しました。

このアーキテクチャでは、Fargate の使いやすさを享受しつつ、統合ログ管理の要件を満たすことができます。

EKS Fargate ロギング、Kinesis Data Firehose、Splunk の詳細については、以下のリンクを参照してください。

翻訳はプロフェッショナルサービスの後藤が担当しました。原文はこちらです。