🔎

FargateのログをfirelensでDatadogに送る

2024/07/11に公開

はじめに

firelensを使ってECSのFargateのコンテナのログをDatadogに送る方法を紹介します!

firelensくんが最強で思ってるより簡単にできるので、ぜひ試してみてください!

Firelensとは

ログルーターであるFluentBit をマネージドで提供してくれるサービスです。
ECSのタスク定義でログをルーティングしたいコンテナのサイドカーにfirelensのコンテナを定義して、 logConfigurationのlogDriverにawsfirelensを指定することで、ログをfirelensに送ることができます。
後ほど具体的な実装を紹介します。

参考

実装

APIキーの取得

https://ap1.datadoghq.com/organization-settings/api-keys で DataDogのAPIキーを取得して,SSM Parameter Storeに保存しておきます。

$ aws ssm put-parameter \
    --name "/prod/DATADOG_API_KEY" \
    --value "${YOUR_API_KEY}" \
    --type SecureString

ECSのタスク定義を作成

Datadogのドキュメントは以下のようになっています。
Image from Gyazo

基本これ通りに実装しますが、apikeyを直接記述するのはセキュリティ的に問題があるので、SSM Parameter Storeから取得するようにします。
secretOptionsでoptionの値をSSM Parameter StoreかSecretManagerから取得することができます。

参考

タスク定義は以下のような感じです

{
  // ...
  containerDefinitions: [
    {
      name: "main-container",
      image: "ubuntu:latest",
      logConfiguration: {
        logDriver: 'awsfirelens',
        options: {
          Name: 'datadog',
          Host: 'http-intake.logs.ap1.datadoghq.com', // Datadogサイトに合わせる(後述)
          TLS: 'on',
          dd_service: 'your-service',
          dd_source: 'your-source',
          dd_tags: 'env:prod',
          provider: 'ecs',
        },
        secretOptions: [{
          name: "apikey",
          valueFrom: "/prod/DATADOG_API_KEY",
        }]
      },
    },
    {
      name: "log-router",
      image: "public.ecr.aws/aws-observability/aws-for-fluent-bit:2.32.2.20240627", // 2024/07/09 時点で最新
      essential: true,
      firelensConfiguration: {
        type: "fluentbit",
        options: {
          "enable-ecs-log-metadata": "true"
        }
      },
      // log-routerのログをcloud watchに出力する場合 *1
      // logConfiguration: {
      //   logDriver: "awslogs",
      //   options: {
      //     "awslogs-group": "/ecs/your-service",
      //     "awslogs-region": "ap-northeast-1",
      //     "awslogs-stream-prefix": "ecs"
      //   }
      // },
      memoryReservation: 50,
    },
  ],
}

firelensのイメージはこちらで公開されております

ハマったところ

上記を設定する際になかなかアプリケーションのログがDatadogに送られないことがありました。
log-routerのコンテナのログをcloud watchに出力するように設定して確認してみると、以下のエラーが出力されていました。 *1

(ググりまくったけど全然できこなかった...)

[error] [output:datadog:datadog.1] http://http-intake.logs.datadoghq.com:80 HTTP status=403

認証まわりで怒られていたのでAPIキーが正しく設定されていないのではと思い、secretOptionsをやめてみたりSSM Parameter Storeの値を確認したりしてみましたが、問題はありませんでした。

結論、送信先のHostが間違っていました。
デフォルトではUS1のホストであるhttp-intake.logs.datadoghq.comが設定されているようです。

ですが、Datadogサイトに合わせて、送信先のホストを変更する必要があるようです。

ホスト一覧は以下の通りです。

Image from Gyazo

自分はap1でアカウントを作成していたので http-intake.logs.ap1.datadoghq.comに変更したところ、正常にログがDatadogに送られるようになりました。

おわりに

シンプルですが、文献が少ないのでハマったので作業ログもかねて書いてみました。

これからもオブザーバビリティを高めてオブオブしていきたいです!

GitHubで編集を提案
ispec inc.

Discussion