Firehose を Destination として指定した CloudWatch Logs の Subscription Filter で Datadog にログを送る

datadogaws

Datadog に AWS サービスのログを送る方法の一つに Firehose がある。公式のテンプレートでスタックを作成すると指定したエンドポイントに向いた Firehose や IAM ロール、失敗時のログを保存する S3 Bucket が作成される。

$ export DD_API_KEY=*****

$ export DD_INTAKE_LOG_ENDPOINT=https://aws-kinesis-http-intake.logs.datadoghq.com/v1/input

$ aws cloudformation create-stack \
  --stack-name datadog-kinesis-logs \
  --template-body "$(curl -sL --compressed https://docs.datadoghq.com/resources/json/kinesis-logs-cloudformation-template.json)" \
  --capabilities CAPABILITY_IAM \
  --region ap-northeast-1 \
  --parameters \
    ParameterKey=DatadogAPIKey,ParameterValue=$DD_API_KEY \
    ParameterKey=DatadogHttpEndpointUrl,ParameterValue=$DD_INTAKE_LOG_ENDPOINT

この Firehose を Destination として指定した CloudWatch Logs の Subscription Filter を作成するとログが送られるようになる。

$ export DELIVERY_STREAM_ARN=$(aws cloudformation describe-stacks \
  --stack-name datadog-kinesis-logs \
  --query "Stacks[0].Outputs[?OutputKey=='DatadogDeliveryStreamARN'].OutputValue" \
  --output text)

$ export ROLE_ARN=$(aws cloudformation describe-stacks \
  --stack-name datadog-kinesis-logs \
  --query "Stacks[0].Outputs[?OutputKey=='CloudWatchLogsRoleARN'].OutputValue" \
  --output text)

$ aws logs put-subscription-filter \
    --filter-name datadog-kinesis-logs \
    --log-group-name "/aws/lambda/helloworld" \
    --filter-pattern "\"REPORT RequestId:\"" \
    --destination-arn $DELIVERY_STREAM_ARN \
    --role-arn $ROLE_ARN

Datadog に AWS インテグレーションや Forwarder で Lambda のメトリクスを送ると Serverless 課金 が発生するが、これでログを送っただけでは対象にならない。