0
0

More than 1 year has passed since last update.

EKS on Fargateのdatadogへのログ送信

Posted at

なぜ書くか/何を書くか

なぜ?

Amazon EKS on AWS Fargateを参考にdatadogへのログ送信を設定していたのですが、複数のドキュメントを見なければならなかったのでメモとして残します。
同じ状況にある方の参考になれば幸いです。

何を?

上記ドキュメント内の「ログの収集」について記載しています。
他の収集については書きません。

前提

  • 用語の説明はしません
  • datadog-agentはサイドカーとして実行します
  • Datadog側で以下のインテグレーションをインストールする必要があります
    • Kubernetes
    • AWS
    • EKS
  • 例で使用する名称は以下のとおりです
    • Namespace: myns
    • Serviceaccount: mysa

サンプル

リソースの用意

RBACの用意

ライフサイクル的にClusterRoleとバインディングは分けていいかもしれません。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: datadog-agent
rules:
  - apiGroups:
    - ""
    resources:
    - nodes
    - namespaces
    - endpoints
    verbs:
    - get
    - list
  - apiGroups:
      - ""
    resources:
      - nodes/metrics
      - nodes/spec
      - nodes/stats
      - nodes/proxy
      - nodes/pods
      - nodes/healthz
    verbs:
      - get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: datadog-agent
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: datadog-agent
subjects:
  - kind: ServiceAccount
    name: mysa
    namespace: myns
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mysa
  namespace: myns

Agentをサイドカーとして実行

以下のマニフェストが最小設定のようです。
リソースリクエストはドキュメント同様の設定で問題なく動くはずです。
DD_API_KEYはちゃんと保護しましょう。

※kubectl execなどでagentのコンテナに入り、curl localhost:8126を打つと404 page not foundと出ますが、これは正常です。

apiVersion: apps/v1
kind: Deployment
metadata:
 name: "<APPLICATION_NAME>"
 namespace: myns
spec:
 selector:
   matchLabels:
     app: "<APPLICATION_NAME>"
 replicas: 1
 template:
   metadata:
     labels:
       app: "<APPLICATION_NAME>"
     name: "<POD_NAME>"
   spec:
     serviceAccountName: mysa
     containers:
     - name: "<APPLICATION_NAME>"
       image: "<APPLICATION_IMAGE>"
     ## Agent をサイドカーとして実行
     - image: datadog/agent
       name: datadog-agent
       env:
       - name: DD_API_KEY
         value: "<YOUR_DATADOG_API_KEY>"
       - name: DD_SITE
         value: "datadoghq.com"
       - name: DD_EKS_FARGATE
         value: "true"
       - name: DD_CLUSTER_NAME
         value: "<CLUSTER_NAME>"
       - name: DD_KUBERNETES_KUBELET_NODENAME
         valueFrom:
           fieldRef:
             apiVersion: v1
             fieldPath: spec.nodeName
      resources:
          requests:
            memory: "256Mi"
            cpu: "200m"
          limits:
            memory: "256Mi"
            cpu: "200m"

ログ送信の設定

ドキュメントに乗っ取りCloudwatch logslambdaによる送信をしてみます。

FluentBitの構成

Cloudwatch logsへ送るための設定です。
aws-observablityというNamespaceにConfigMapを置くだけでいいらしい。(EKSがよしなにやってくれるのかな?)
詳しくはFargateのログ記録を参考に。
※aws-observabilityのNamespaceが未作成の場合は作成してください。

 kind: ConfigMap
 apiVersion: v1
 metadata:
   name: aws-logging
   namespace: aws-observability
 data:
   output.conf: |
     [OUTPUT]
         Name cloudwatch_logs
         Match   *
         region us-east-1
         log_group_name awslogs-https
         log_stream_prefix awslogs-firelens-example
         auto_create_group true

datadog-forwardar

実体はlambdaでCloudwatch logsからDatadogへの送信を担っているみたい。

詳細のドキュメントDatadog Forwarder.
こちらはGitHubの実装です.

# DatadogのAPIキー
variable "dd_api_key" {
  type        = string
  description = "Datadog API key"
}
resource "aws_secretsmanager_secret" "dd_api_key" {
  name        = "datadog_api_key"
  description = "Encrypted Datadog API Key"
}
resource "aws_secretsmanager_secret_version" "dd_api_key" {
  secret_id     = aws_secretsmanager_secret.dd_api_key.id
  secret_string = var.dd_api_key
}

# datadog-forwarderのCloudformation
resource "aws_cloudformation_stack" "datadog_forwarder" {
  name         = "datadog-forwarder"
  capabilities = ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"]
  parameters   = {
    DdApiKeySecretArn  = aws_secretsmanager_secret.dd_api_key.arn,
    DdSite             = "datadoghq.com",
    FunctionName       = "datadog-forwarder"
  }
  template_url = "https://datadog-cloudformation-template.s3.amazonaws.com/aws/forwarder/latest.yaml"
}

datadog-forwarderのトリガーを設定

自動と手動による方法があるようですが、自動の方法では再現できなかったので手動でセットアップしました。
参考元: Datadog の Lambda 関数で AWS サービスのログを送信する.

自動

コンソールでIntegration->AWS->Log Collectionタブへ。
datadog-forwarderのlambdaのarnを貼り付けたらできるようです。

手動

cloudwatch_log_subscription_filterを使用してトリガーを管理します。

resource "aws_cloudwatch_log_subscription_filter" "datadog_log_subscription_filter" {
  name            = "datadog_log_subscription_filter"
  log_group_name  = "awslogs-https"
  destination_arn = arn:aws:lambda:<region>:<account_id>:function:datadog-forwarder
  filter_pattern  = ""
}

ここまでの設定でDatadogへ送信がされるはずです。
できない場合、Fargateのログ記録のFargate Podの実行ロールなど確認してみてください。

余談

ドキュメントどおりにCloudwatch logsを使用しましたが、kinesisとかの方が安く済むと思ったり。。

実はagentコンテナの404 page not foundを知らなくて3日くらい使ってしまった...
Datadogなんもわからん状態だから頑張りたい.

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0