はじめに
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 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をインストールする必要がある前提で考えた方がよさそうであることがわかった。