DatadogとAWSの接続方式


はじめに

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

DatadogとAWSの連携方式

公式のマニュアルを見ると、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の初期構築を実行。

初期構築時に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)のみが格納されていた。

zipの中身
$ 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/

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

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

Datadog Agentのプロセス
$ 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

Datadog側を確認

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

ドキュメントの確認

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

Ensuring Successful Cloud Migrations with Cross-Platform Visibility from Datadog

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

まとめ

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

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