FargateのログをfirelensでDatadogに送る
はじめに
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のタスク定義を作成
基本これ通りに実装しますが、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サイトに合わせて、送信先のホストを変更する必要があるようです。
ホスト一覧は以下の通りです。
自分はap1
でアカウントを作成していたので http-intake.logs.ap1.datadoghq.com
に変更したところ、正常にログがDatadogに送られるようになりました。
おわりに
シンプルですが、文献が少ないのでハマったので作業ログもかねて書いてみました。
これからもオブザーバビリティを高めてオブオブしていきたいです!
Discussion