RDSのログをCloudWatch Logsからdatadog logsに流す - terraformを添えて -

# はじめに
この記事は[Datadog Advent Calendar 2019](https://qiita.com/advent-calendar/2019/datadog)の12/9分になります。
今年リリースした弊社のサービスでdatadog logsを初めて使い、その便利さと手軽さにやられてしまった勢になります。
やっぱりサーバーメトリクスとログを一緒に見れるというのは強い。
その中でも

# 書いた事
RDSのログをCloudwatch logsへ出力し、lambdaを経由してDatadog logsへ流す手順。 
terraformで書いているのでついでに晒します。

# slowquery log送信手順
データの流れと作成するもののイメージです。

![module_ RDS slowlog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38286/a25b25b0-5a76-083a-527f-a5eb352bad99.png)

## 1. 転送用のLambdaの用意
[公式マニュアル](https://docs.datadoghq.com/ja/integrations/amazon_web_services/?tab=allpermissions#log-collection)では2つのパターンが書かれています。
1. [Datadog-Log-Forwarder](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:464622532012:applications~Datadog-Log-Forwarder)をデプロイするパターン
2. 手動で作成し、[lambda_function.py](https://github.com/DataDog/datadog-serverless-functions/blob/master/aws/logs_monitoring/lambda_function.py)をuploadするパターン

今回は2.のコードを元にterraformで作成することにしました。
lambdaはterraformで管理するか否か別れるとこだと思いますが、基本変更無いコードでもあるので、
モジュールとして作成し、各アカウント共通で使用するようにしています。

サンプルとして[github](https://github.com/gacha-ru/terraform-aws-datadog-logs-lambda)にあげました。
このサンプルではDatadogのAPIキーをパラメーターストアから取得するようにしています。（こちらの管理の都合上・・・）

## 2. RDSのクラスター設定でCloudWatch Logsにslowqueryを出力する。
手動で作成済みな場合はコンソール、CLI好きなように。
参考: https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html#USER_LogAccess.MySQLDB.PublishtoCloudWatchLogs

terraformでdb作成している場合は`enabled_cloudwatch_logs_exports`を設定するのみ。
https://www.terraform.io/docs/providers/aws/r/rds_cluster.html

### aurora clusterのサンプル
```
resource "aws_rds_cluster" "master" {
  cluster_identifier              = "hoge-master"
  availability_zones              = [var.rds_region.writer, var.rds_region.reader]
  db_cluster_parameter_group_name = "hoge-aurora-cluster"
  vpc_security_group_ids          = ["${aws_security_group.rds.id}"]
  backup_retention_period         = 7
  preferred_backup_window         = "17:00-18:00"
  preferred_maintenance_window    = "sun:19:00-sun:19:30"
  master_username                 = "${var.mysql_user}"
  master_password                 = "${var.mysql_pass}"
  skip_final_snapshot             = "false"
  final_snapshot_identifier       = "hoge-final"
  db_subnet_group_name            = "${aws_db_subnet_group.main.id}"
  enabled_cloudwatch_logs_exports = ["error", "slowquery"]　← ここ

  # Aurora(mysql5.7)
  engine         = "aurora-mysql"
  engine_version = "5.7.mysql_aurora.2.04.6"

  lifecycle {
    ignore_changes = [
      "availability_zones",
    ]
  }

  tags = {
    Env     = var.environment
    Monitor = "datadog"
  }
}
```

## 3. terraformでlambdaのtriggerを作成
公式マニュアルの[MANUALLY SETUP TRIGGERS](https://docs.datadoghq.com/ja/integrations/amazon_web_services/?tab=allpermissions#manually-setup-triggers)の部分になります。
こちらも長くなるので、terraformのサンプルを[github](https://github.com/gacha-ru/terraform-aws-cloudwatch-logs-subscription
)にあげました。
モジュールとしてそのまま使用できます。

CloudWatch Logsのロググループから、指定したLambdaへログを流すというものなので、本件以外での活用も可能です。

# まとめ
ログを流すとこまで、としましたがdatadog側で可視化する手順としては、
[Datadog Log Managementを使ってRDSのSlowQueryを可視化する](
https://qiita.com/syogun/items/643f4f34356c20847262)
の記事を参考にさせていただいた為、これ以上書くと同じことを書いてしまうと思いここまでとします。
Grok Parserでのサンプルは大変有用で助かりました。
この場を借りて@syogunさんへ感謝させていただきたいと思います。

今回公開したgithubのサンプルはいずれterraform registoryにpublishしたいです。
それでは皆さま、良いdatadogライフを！！！