Kinesis Data Firehose で AWS EKS Fargate のログを送信する 概要 AWS Fargate on EKS は、Kubernetes ワークロードを実行するためのフルマネージドエクスペリエンスを提供します。Kinesis Data Firehose は、EKS の Fluent Bit ログルーターと併用することで、Datadog でログを収集することができます。このガイドでは、Kinesis Data Firehose と CloudWatch ログによるログ転送の比較、および Kinesis Data Firehose を通じて Datadog にログを送信する EKS Fargate アプリケーションのサンプルについて説明します。
Kinesis Data Firehose と CloudWatch のログ転送 Kinesis Data Firehose と CloudWatch のログ転送を使用した場合の主な違いは以下の通りです。
メタデータとタグ付け : Kinesis Data Firehose でログを送信する際に、Kubernetes ネームスペースやコンテナ ID などのメタデータを構造化された属性としてアクセスできます。
AWS のコスト : AWS のコストは個々のユースケースによって異なりますが、Kinesis Data Firehose の取り込みは、同等の Cloudwatch Log の取り込みよりも一般的に安価です。
要件 kubectl
と aws
のコマンドラインツールを使用します。Fargate プロファイル と Fargate ポッドの実行ロールを持つ EKS クラスター。このガイドでは、クラスターは fargate-cluster
という名前で、fargate-profile
という名前の Fargate プロファイルが fargate-namespace
というネームスペースに適用されているものとします。これらのリソースがまだない場合は、Amazon EKS の概要 でクラスターを作成し、Amazon EKS を使った AWS Fargate の概要 で Fargate プロファイルとポッドの実行ロールを作成します。セットアップ 以下の手順は、Fluent Bit と Kinesis Data Firehose デリバリーストリームを通じて、EKS クラスターにデプロイされたサンプルアプリケーションから Datadog にログを送信するプロセスの概要を説明するものです。Datadog の標準的な Kubernetes タグとの一貫性を最大化するために、選択した属性をタグキーに再マップする手順も含まれています。
ログ配信に失敗した場合の S3 バックアップとともに、メトリクスを Datadog に配信する Kinesis Data Firehose 配信ストリームを作成 します。 EKS Fargate で Fluent Bit for Firehose を構成しました。 。サンプルアプリケーションをデプロイします 。Kubernetes タグと container_id
タグを使った相関のために、リマッパープロセッサーの適用 を行います。 Kinesis 配信ストリームの作成 Kinesis Firehose Delivery の設定方法は、Datadog Kinesis Firehose の宛先を使用して AWS サービスログを送信する のガイドをご参照ください。
注 : Source を Direct PUT
に設定します。
EKS Fargate クラスターで Fluent Bit for Firehose を構成する aws-observability
ネームスペースを作成します。Copy
kubectl create namespace aws-observability
Fluent Bit 用の Kubernetes ConfigMap を以下のように aws-logging-configmap.yaml
として作成します。配信ストリームの名前を代入してください。 Copy
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 <REGION>
delivery_stream <YOUR-DELIVERY-STREAM-NAME>
ConfigMap マニフェストを適用するには、kubectl
を使用します。 Copy
kubectl apply -f aws-logging-configmap.yaml
AWS Fargate 上で動作するログルーターが Kinesis Data Firehose に書き込めるように、IAM ポリシーを作成し、ポッドの実行ロールにアタッチします。以下の例のように、Resource フィールドの ARN を配信ストリームの ARN に置き換え、リージョンとアカウント ID も指定します。 allow_kinesis_put_permission.json
Copy
{
"Version" : "2012-10-17" ,
"Statement" : [
{
"Sid" : "VisualEditor0" ,
"Effect" : "Allow" ,
"Action" : [
"firehose:PutRecord" ,
"firehose:PutRecordBatch"
],
"Resource" :
"arn:aws:firehose:<REGION>:<ACCOUNTID>:deliverystream/<DELIVERY-STREAM-NAME>"
}
]
}
a. ポリシーを作成します。
Copy
aws iam create-policy \
--policy-name FluentBitEKSFargate \
--policy-document file://allow_kinesis_put_permission.json
b. Fargate Pod Execution Role を取得し、IAM ポリシーをアタッチします。
Copy
POD_EXEC_ROLE = $( aws eks describe-fargate-profile \
--cluster-name fargate-cluster \
--fargate-profile-name fargate-profile \
--query 'fargateProfile.podExecutionRoleArn' --output text | cut -d '/' -f 2)
aws iam attach-role-policy \
--policy-arn arn:aws:iam::<ACCOUNTID>:policy/FluentBitEKSFargate \
--role-name $POD_EXEC_ROLE
サンプルアプリケーションをデプロイする ログを生成して Kinesis パイプラインをテストするには、EKS Fargate クラスターにサンプルワークロードをデプロイします。
デプロイメントマニフェスト sample-deployment.yaml
を作成します。 Copy
apiVersion : apps/v1
kind : Deployment
metadata :
name : sample-app
namespace : fargate-namespace
spec :
selector :
matchLabels :
app : nginx
replicas : 1
template :
metadata :
labels :
app : nginx
spec :
containers :
- name : nginx
image : nginx
ports :
- containerPort : 80
fargate-namespace
ネームスペースを作成します。Copy
kubectl create namespace fargate-namespace
デプロイメントマニフェストを適用するには、kubectl
を使用します。 Copy
kubectl apply -f sample-deployment.yaml
検証 ネームスペース fargate-namespace
で sample-app
ポッドが動作していることを確認します。 Copy
kubectl get pods -n fargate-namespace
期待される出力:
NAME READY STATUS RESTARTS AGE
sample-app-6c8b449b8f-kq2qz 1/1 Running 0 3m56s
sample-app-6c8b449b8f-nn2w7 1/1 Running 0 3m56s
sample-app-6c8b449b8f-wzsjj 1/1 Running 0 3m56s
kubectl describe pod
を使用して、Fargate のログ機能が有効であることを確認します。Copy
kubectl describe pod <POD-NAME> -n fargate-namespace | grep Logging
期待される出力:
Logging: LoggingEnabled
Normal LoggingEnabled 5m fargate-scheduler Successfully enabled logging for pod
デプロイのログを検査します。 Copy
kubectl logs -l app = nginx -n fargate-namespace
期待される出力:
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/01/27 16:53:42 [ notice] 1#1: using the "epoll" event method
2023/01/27 16:53:42 [ notice] 1#1: nginx/1.23.3
2023/01/27 16:53:42 [ notice] 1#1: built by gcc 10.2.1 20210110 ( Debian 10.2.1-6)
2023/01/27 16:53:42 [ notice] 1#1: OS: Linux 4.14.294-220.533.amzn2.x86_64
2023/01/27 16:53:42 [ notice] 1#1: getrlimit( RLIMIT_NOFILE) : 1024:65535
2023/01/27 16:53:42 [ notice] 1#1: start worker processes
...
Datadog の UI でログを確認します。Kinesis Data Firehose からのログをフィルターするために、source:aws
を選択します。 ログ相関のための属性のリマップ この構成からのログは、Datadog の標準的な Kubernetes タグとの一貫性を最大化するために、いくつかの属性をリマップする必要があります。
Datadog Log Pipelines のページに移動します。
Name EKS Fargate Log Pipeline
と Filter service:aws source:aws
で新しいパイプラインを作成します。
以下の属性をタグキーにリマップするための Remapper プロセッサー を 4 つ作成します。
リマップする属性 ターゲットタグキー kubernetes.container_name
kube_container_name
kubernetes.namespace_name
kube_namespace
kubernetes.pod_name
pod_name
kubernetes.docker_id
container_id
このパイプラインを作成すると、サンプルアプリが出力するログは、この例のようにログ属性が Kubernetes タグにリマップされてタグ付けされるようになります。
その他の参考資料