DatadogとAWSの接続方式

# はじめに

Datadog未経験である私が勉強を始めて、最初にAWSとの連携方式が気になったので、それを記事にしてみました。
初学者のため、誤りや不十分な点があるかと思いますがご容赦下さい。


# DatadogとAWSの連携方式
[公式のマニュアル](https://docs.datadoghq.com/ja/integrations/amazon_web_services/?tab=cloudformation)を見ると、DatadogではAWSからのログ収集には下記の4パターンが存在すると記載されている。

- Kinesis Firehose経由
- Lambda→S3経由
- Lambda→Cloudwatch経由
- Datadog Agent経由(この方式であれば遅延をほぼゼロでメトリクスを取得できるとのこと)

上3つの方式については、その伝達のリアルタイム性や、Cloudwatch APIリクエストによる課金が気になるところ。
それぞれの方式のアーキテクチャを調査すると共に、簡単に試してみた。

# まずLambda→S3経由
公式サイトのマニュアルには正確には下記の記載になっている。

> Cloudformation: S3 バケットまたは CloudWatch ロググループにサブスクライブする Datadog Lambda 関数をデプロイし、ログを Datadog に転送します

上記からは「Cloudwatch→Lambda→S3→Datadog」の流れでログが転送されると推測される。
先頭にCloudformationとの記載があるのは、これを作成するCloudformationのテンプレートが提供されるということになる。

というわけで、まずテンプレートを確認してみる。
https://datadog-cloudformation-template.s3.amazonaws.com/aws/
- main.yaml
- datadog_policy_macro.yaml
- datadog_integration_role.yaml
- forwarder/latest.yaml

上記からCloudFormationのスタック、Lambda関数、S3バケット、IAMロールなどが作成されることがわかる。

概要は確認できたので、実際に作ってみる。

## Datadogを実際に適用して作成されたAWSの各種リソースの確認

環境として下記を用意して、Datadogの初期構築を実行。
![20201229.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/785250/7bb652e0-8aa0-f704-4d54-a8f5aa7b54a0.png)

初期構築時にDatadog Agentのインストールが求められたため(それを実行しないと先に進めなかったため)、Datadog AgentをBastionにインストール。

それにより作成されたリソースは下記の通り

- DatadogIntegrationRoleStack

| 論理ID | 物理ID | タイプ |
|:-:|:-:|:-:|
| DatadogIntegrationRole| DatadogIntegrationRole | AWS::IAM::Role |

- DatadogPolicyMacroStack

| 論理ID | 物理ID | タイプ |
|:-:|:-:|:-:|
| DatadogPolicyMacro |DatadogPolicy | AWS::CloudFormation::Macro |
| DatadogPolicyMacroMacroFunction|datadog-DatadogPolicyMacr-DatadogPolicyMacroMacroF-1MHFM8LTJJ8LM|AWS::Lambda::Function|
|DatadogPolicyMacroMacroFunctionRole|datadog-DatadogPolicyMacr-DatadogPolicyMacroMacroF-BQAOWYELIJ1G|AWS::IAM::Role|

- ForwarderStack

| 論理ID | 物理ID | タイプ |
|:-:|:-:|:-:|
|DdApiKeySecret|arn:aws:secretsmanager:us-east-1:679788997248: secret:DdApiKeySecret-9okxwgCIL2yF-yPjRdy|AWS::SecretsManager::Secret|
|Forwarder|datadog-ForwarderStack-1EE5ZCRBBQ2D4-Forwarder-GG5HQDBXXFJY|AWS::Lambda::Function|
|ForwarderBucket|datadog-forwarderstack-1ee5zcrbbq-forwarderbucket-1ixlaivrpw92l|AWS::S3::Bucket|
|ForwarderRole|datadog-ForwarderStack-1EE5ZCRBBQ2D4-ForwarderRole-Z4MWEB3V5N2|AWS::IAM::Role|
|ForwarderZip|2020/12/28/[$LATEST]db58124f3dc84c9cb84dfe881db85978|Custom::ForwarderZip|
|ForwarderZipCopier|datadog-ForwarderStack-1EE5ZCRB-ForwarderZipCopier-XNBKYFQ73HZF|AWS::Lambda::Function|
|ForwarderZipCopierRole|datadog-ForwarderStack-1EE5-ForwarderZipCopierRole-L6M6ICLCUAEK|AWS::IAM::Role|
|LogGroup|/aws/lambda/datadog-ForwarderStack-1EE5ZCRBBQ2D4-Forwarder-GG5HQDBXXFJY|AWS::Logs::LogGroup|
|S3Permission|datadog-ForwarderStack-1EE5ZCRBBQ2D4-S3Permission-1XGAY0HFVJ7L8|AWS::Lambda::Permission|

さっそくS3を確認。
バケットとして「datadog-forwarderstack-1ee5zcrbbq-forwarderbucket-1ixlaivrpw92l」が作成されており、「aws-dd-forwarder-3.27.0.zip」(11.1MB)のみが格納されていた。

<details><summary>zipの中身</summary><div>

```
$ ls -al
total 11690
drwxr-xr-x 1 ec2-user 197121        0 12月 28 23:22 ./
drwxr-xr-x 1 ec2-user 197121        0 12月 28 23:19 ../
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 __pycache__/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 aws_dd_forwarder-0.0.0.dev0.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 aws_xray_sdk/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 aws_xray_sdk-2.4.3.dist-info/
-rw-r--r-- 1 ec2-user 197121 11685066 12月 28 23:17 aws-dd-forwarder-3.27.0.zip
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 bin/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 certifi/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 certifi-2020.12.5.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 chardet/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 chardet-4.0.0.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 datadog/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 datadog_lambda/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 datadog_lambda-2.16.0.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 datadog-0.32.0.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 dateutil/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 ddtrace/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 ddtrace-0.36.0.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 decorator-4.4.2.dist-info/
-rw-r--r-- 1 ec2-user 197121      126 12月 17 12:26 easy_install.py
-rw-r--r-- 1 ec2-user 197121    24595 11月 21 06:53 enhanced_lambda_metrics.py
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 future/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 future-0.18.2.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 idna/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 idna-2.10.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 importlib_metadata/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 importlib_metadata-3.3.0.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 jmespath/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 jmespath-0.10.0.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 jsonpickle/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 jsonpickle-1.4.2.dist-info/
-rw-r--r-- 1 ec2-user 197121    40767 12月 17 01:08 lambda_function.py
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 libfuturize/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 libpasteurize/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 03:27 META_INF/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 msgpack/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 msgpack-1.0.1.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 past/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 pkg_resources/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 python_dateutil-2.8.1.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 requests/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 requests_futures/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 requests_futures-1.0.0.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 requests-2.25.1.dist-info/
-rw-r--r-- 1 ec2-user 197121     8262 12月 17 12:23 settings.py
-rw-r--r-- 1 ec2-user 197121      940 11月 25 04:14 setup.py
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 setuptools/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 setuptools-42.0.2.dist-info/
-rw-r--r-- 1 ec2-user 197121    34159 12月 17 12:26 six.py
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 six-1.15.0.dist-info/
-rw-r--r-- 1 ec2-user 197121    26317 12月 17 12:23 template.yaml
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 tools/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 trace_forwarder/
-rw-r--r-- 1 ec2-user 197121    83727 12月 17 12:26 typing_extensions.py
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 typing_extensions-3.7.4.3.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 urllib3/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 urllib3-1.26.2.dist-info/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 wrapt/
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 wrapt-1.11.2.dist-info/
-rw-r--r-- 1 ec2-user 197121     8089 12月 17 12:26 zipp.py
drwxr-xr-x 1 ec2-user 197121        0 12月 17 12:26 zipp-3.4.0.dist-info/
```

</div></details>

中身を見た感じ、Datadogに吸い上げて欲しい各種リソース情報が含まれている感じがしない。
(zipファイルのtimestampも更新されず、ここ経由でリアルタイムに情報を連携してはいないと思われる)

やはり、初期構築時にDatadog Agentのインストールを強要されたので、基本的にはそこ経由の情報のやり取りになるのか？


<details><summary>Datadog Agentのプロセス</summary><div>

```
$ ps -ef | grep datadog
root     23258     1  0 13:25 ?        00:00:00 su -s /bin/sh -c DD_LOG_TO_CONSOLE=false exec "$0" "$@" dd-agent -- /opt/datadog-agent/bin/agent/agent run -p /opt/datadog-agent/run/agent.pid
dd-agent 23270 23258  0 13:25 ?        00:00:10 /opt/datadog-agent/bin/agent/agent run -p /opt/datadog-agent/run/agent.pid
root     23272     1  0 13:25 ?        00:00:00 su -s /bin/sh -c DD_LOG_TO_CONSOLE=false exec "$0" "$@" dd-agent -- /opt/datadog-agent/embedded/bin/process-agent --config=/etc/datadog-agent/datadog.yaml --sysprobe-config=/etc/datadog-agent/system-probe.yaml --pid=/opt/datadog-agent/run/process-agent.pid
root     23273     1  0 13:25 ?        00:00:00 su -s /bin/sh -c DD_LOG_TO_CONSOLE=false exec "$0" "$@" dd-agent -- /opt/datadog-agent/embedded/bin/trace-agent --config /etc/datadog-agent/datadog.yaml --pid /opt/datadog-agent/run/trace-agent.pid
dd-agent 23274 23272  0 13:25 ?        00:00:03 /opt/datadog-agent/embedded/bin/process-agent --config=/etc/datadog-agent/datadog.yaml --sysprobe-config=/etc/datadog-agent/system-probe.yaml --pid=/opt/datadog-agent/run/process-agent.pid
dd-agent 23275 23273  0 13:25 ?        00:00:04 /opt/datadog-agent/embedded/bin/trace-agent --config /etc/datadog-agent/datadog.yaml --pid /opt/datadog-agent/run/trace-agent.pid
```

</div></details>

# Datadog側を確認

Datadog AgentをインストールしていないEC2インスタンスについても、情報が収集されていることが確認できた。
ただし、AgentをインストールしていないEC2インスタンスについては、その存在は確認できても、CPU使用率などの情報は収集されていない様子。
Datadogの「Infrastructure List」「Host Map」のどちらにもインスタンス自体は表示されている。

![20201228_datadog16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/785250/00265eb2-cd4a-7d2c-8cea-4dd82fd0a049.png)

![20201228_datadog17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/785250/71e1402d-2a3f-9484-80b6-3fcc383ed534.png)



# ドキュメントの確認

ここまで調べて、実装から見て動作を解き明かすのは面倒そうに感じてきたので、ドキュメント調査を開始。
下記のブログ記事がわかりやすかった。

[Ensuring Successful Cloud Migrations with Cross-Platform Visibility from Datadog](https://aws.amazon.com/jp/blogs/apn/ensuring-successful-cloud-migrations-with-cross-platform-visibility-from-datadog/)

上記Figure1より、DatadogAgentがデータを送るもの、Lambda→S3経由となるものの違いについて記載されている。


# まとめ

公式のマニュアルからは複数の転送方式があるとの記載だったが、様々な方式を同じように利用できるわけではなく、
データの種類により、その転送方式が異なるだけということがわかった。

方式によっては転送されないデータもあり、普通に利用するのであれば、EC2やコンテナ等にDatadog Agentをインストールする必要がある前提で考えた方がよさそうであることがわかった。