Datadog integrations Deep Dive - AWS 編

## はじめに
こんにちは、Datadog Japan で Sales Engineer をしている [**AoTo**](https://qiita.com/AoTo0330) です。

この投稿は **[<font color="#6495ED">AoTo Advent Calendar 2024</font>](https://qiita.com/advent-calendar/2024/aoto) 2日目**の記事です。


本記事は『[【完全解説】4大クラウドの Datadog integrations アーキテクチャ【2024年版】](https://qiita.com/AoTo0330/items/33d7b58a3cfddcbd3fe2)』で解説仕切れなかった、<INS>Datadog AWS integration の細かな仕様と注意点</INS>を解説します。

主にメトリクス・ログ収集に関する AWS integration の様々なオプションについて解説しているので、参考にしていただけると幸いです🐶

## AWS integration の全体像
### デフォルトのデータ送信
![ Datadog-AWS-Integration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/00ef181a-7861-eb50-9a73-725f968d5668.png)

Datadog AWS integration は主に Amazon CloudWatch からのメトリクス・ログ情報の収集と、各リソースのメタデータの参照と監視情報への紐付けを行います。


### AWS integration のネットワーク接続
AWS integration はメトリクス・ログを Datadog Organization 毎に用意された API Key による認証でデータを適切な Datadog Org に収集します。この時、Datadog Site として **US1, AP1** を選択することで、<INS>暗黙的に AWS グローバルネットワークを介した通信</INS>が行われ、安全性と効率性が高い状態での監視データ連携ができます。

https://aws.amazon.com/jp/vpc/faqs/

加えて、ログ収集は **Datadog Lambda Forwareder** を利用しますが、[AWS PrivateLink を介して Datadog に接続する](https://docs.datadoghq.com/ja/agent/guide/private-link/)ことで、<INS>明示的にプライベートネットワークを介した通信</INS>を強制できます。

 - **Datadog Lambda Forwareder** ドキュメント「[AWS PrivateLink サポート](https://docs.datadoghq.com/ja/logs/guide/forwarder/?tab=cloudformation#aws-privatelink-サポート)」

### ストリーミングデータ送信
![Datadog-AWS-Integration-Stream.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/9e8aee9b-8e70-923a-6ad6-b5bff7be23c5.png)

メトリクス・ログ収集は上記の方法以外に、<INS>Amazon Data Firehose を用いたストリーミングでの連携</INS>ができます。これらはデフォルトのデータ送信のデメリットを許容できない場合に選択するオプションの方式です。

メトリクス・ログのストリーミング転送用の CloudFormation テンプレートは Datadog から提供されています。

## メトリクス収集

- デフォルト方式
![ Datadog-AWS-Integration-Metrics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/af9f2551-457a-0adb-89f6-82d61f9bdce0.png)
 - ストリーミング方式
![ Datadog-AWS-Integration-Metrics-Streaming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/1cf4e2e1-1ab7-3e7e-4c31-9af4aa2ea808.png)


### 複数メトリクス収集方式の併用
前述の通り、CloudWatch メトリクスの収集は <INS>Datadog クローラーが **CloudWatch Metrics API** を利用する**デフォルト方式**</INS>と、<INS>**CloudWatch Metrics Stream** と **Data Firehose** を利用する**ストリーミング方式**</INS>があります。

これらの2つの方式は**併用可能**です。デフォルト方式が設定された上で、ストリーミング方式を特定のメトリクスで有効化すると、Datadog クローラーは<INS>自動的にそのメトリクスへの API リクエストを除外</INS>します。さらに、<INS>デフォルト方式によりカスタムタグや他のメタデータを収集する</INS>ため、**併用することが推奨**されます。

### メトリクス収集方式の選択
特定の方式でしか Datadog に連携できない CloudWatch メトリクスが存在します。

 - **デフォルト方式**: `aws.s3.bucket_size_bytes` や `aws.billing.estimated_charges` などの**2時間以上遅れて報告されるメトリクス**
 - **ストリーミング方式**: [CloudWatch cross-account observability](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html) による他アカウントのメトリクス[^1]
[^1]: 他アカウントのメトリクスのメタデータは、メトリクスのソースアカウント自体にデフォルト方式の設定を行うことで収集できます。

両方式のメリット・デメリットを見比べると、<INS>互いにトレードオフ</INS>であることがわかります。メトリクスの特性と利用用途に合わせて連携方式を決定しましょう。

| 方式 | メリット | デメリット |
|:-|:-|:-|
| デフォルト方式 | 柔軟な除外設定 <br> メタデータの付与| 15~20分の遅延 |
| ストリーミング方式 | 2~3分の遅延 <br>  | メタデータの欠如 <br> 課金の増加 |

詳細はそれぞれの設定ガイドを併せてご参照ください。

 - [Amazon Data Firehose を使用した AWS CloudWatch メトリクスストリーム](https://docs.datadoghq.com/ja/integrations/guide/aws-cloudwatch-metric-streams-with-kinesis-data-firehose/)
 - [Datadog Amazon Data Firehose Destination を使用して AWS サービスログを送信する](https://docs.datadoghq.com/ja/logs/guide/send-aws-services-logs-with-the-datadog-kinesis-firehose-destination/)

### 収集メトリクスの除外・制限
メトリクスの連携が不要な場合は[名前空間](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Namespace)や [AWS リソースタグ](https://docs.aws.amazon.com/ja_jp/tag-editor/latest/userguide/tagging.html#intro-tag-methods)に基づく除外ができます。

Datadog の [AWS integration タイル](https://app.datadoghq.com/integrations/amazon-web-services)から、AWS のサービス名毎に用意される CloudWatch のメトリクス名前空間(`AWS/<サービス名>/`) ごとに収集を無効化できます。[Metric Collection] タブを選択し各サービス名のトグルをオフにすることで、Datadog クローラーは対象のメトリクス名前空間への API リクエストを行わなくなります。 

さらに、**EC2, Lambda, ELB(ALB, NLB), RDS, SQS, カスタムメトリクス** の場合は、**ホワイト/ブラックリスト**の両形式で<INS>リソースタグに応じたメトリクス収集の限定</INS>ができます。これにより、EC2, Lambda, カスタムメトリクス数に応じた Datadog 上の課金を制限できます。(ELB, RDS, SQS メトリクスの取り込みは Datadog の課金には影響しません)

詳細は「[AWS インテグレーションの請求](https://docs.datadoghq.com/ja/account_management/billing/aws/)」ガイドを併せてご参照ください。


## ログ収集
 - デフォルト方式
![ Datadog-AWS-Integration-Logs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/1a0b5855-eb7f-085d-ac99-9254a3b0f779.png)

 - ストリーミング方式
![ Datadog-AWS-Integration-Logs-Streaming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/9343107c-d79f-feb9-3218-93061b8e48c1.png)

### デフォルトのログ収集
デフォルトではログ転送には **Datadog Lambda Forwarder** を利用することが推奨されます。

Lambda Forwarder は転送だけではなく<INS>ログのマスキング・フィルタリング・圧縮・タグ付け</INS>などを行えます。Datadog Lambda Forwarder は **AWS CloudFormation(Cfn)** で作成時に [CloudFormation パラメーター](https://docs.datadoghq.com/ja/logs/guide/forwarder/?tab=cloudformation#cloudformation-パラメーター)でこれらのオプションを制御できます。作成後も、**Lambda 環境変数**に `DD_SITE` のように**アッパースネークケース**で値を指定し、これらの機能を有効化できます。

これは、Lambda Forwarder には内部的に Datadog Agent と同様の機能を備えており、Datadog Agent のログ転送オプション同様の制御ができるためです。内部的な仕組みは [GitHub](https://github.com/DataDog/datadog-serverless-functions/tree/master/aws) にも公開されています。

そのため、Lambda Forwarder は Lambda 関数のトレースやメトリクスを転送する機能も備えていますが、現在この利用方法は**非推奨**となっています。Lambda Forwarder の代わりに、**Lambda Extension(拡張機能)** で Lambda 関数ごとに転送機能を用意することが推奨されます。

#### auto-subscription 機能

![Datadog-AWS-Logs-subscription.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/7ff676ab-de13-b59f-1db7-6b43ac2ed690.png)

Lambda Forwarder を利用する大きな利点は、**auto-subscription 機能**です。これは、AWS integration で設定された IAM role を利用して、<INS>Datadog 上の AWS integration タイルからログ収集を制御できる機能</INS>です。特定の CloudWatch ログ名前空間の<INS>サブスクリプションフィルターの作成</INS>と、特定のログを保管する S3 の<INS>トリガーの作成</INS>ができます。

### ストリーミングのログ収集
<INS>アカウント・リージョンごとの Lambda の同時実行制限に影響を与えたくない</INS>場合や、<INS>複数リージョンからのログを転送したい</INS>際には Data Firehose を利用したログのストリーミングが可能です。

![Datadog-AWS-Logs-Full-Stack-Architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/67d43214-1c2f-7b58-7205-5f5391190055.png)

ただし、<INS>ストリーミングでログ送信を制御したい場合にも Lambda Forwarder の作成は**推奨**</INS>されます。これはストリーミング転送に失敗した際、そのログを <INS>S3 に保管して再送するため</INS>です。

Data Firehose は CloudWatch ログから直接宛先として指定でき、他に Data Streams の宛先としても指定できます。そのため、CloudWatch ログ以外のデータソースからログを直接転送したい場合に有効な選択肢です。

### ログ収集方式の選択
両方式のメリット・デメリットを見比べると、<INS>基本はデフォルト方式で問題ない</INS>ことが分かります。デフォルト方式のデメリットが許容できない場合にストリーミング方式を検討しましょう。

| 方式 | メリット | デメリット |
|:-|:-|:-|
| デフォルト方式 | マスキング・フィルタリング <br> ・圧縮・タグ付け <br> auto-subscription 機能| Lambda 同時実行制限への影響 <br> リージョンの制限 |
| ストリーミング方式 | マルチリージョン対応 <br> 多様な転送元の選択 | タグ付けの制限 <br> 再送構成の手間 |

詳細はそれぞれの設定ガイドも併せてご参照ください。

 - [Datadog の Lambda 関数で AWS サービスのログを送信する](https://docs.datadoghq.com/ja/logs/guide/send-aws-services-logs-with-the-datadog-lambda-function/)
 - [Datadog Amazon Data Firehose Destination を使用して AWS サービスログを送信する](https://docs.datadoghq.com/ja/logs/guide/send-aws-services-logs-with-the-datadog-kinesis-firehose-destination)


## AWS integration × CloudFormation 
![AWSIntegration_CloudFormation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/c0c8fbf6-5b22-65fb-a593-9dd534e985f0.png)

AWS integration を CloudFormation(Cfn) で作成すると、多数のリソースが作成されます。図中の「**Lambda Forwarder Cfn Stack**」ログ収集に利用される Lambda Forwarder と必要なリソースが含まれ、「**AWS integration Cfn Stack**」はメトリクス・コスト・メタデータ・X-ray トレース収集や auto-subscription 機能・ログアーカイブに利用される IAM role を作成します。

さらに利用者が意識しない範囲として、「**Datadog API Call Cfn Stack**」があります。これは [Datadog API for AWS integration](https://docs.datadoghq.com/api/latest/aws-integration/)を呼び出し、Datadog 内の AWS integration に必要な設定・リソースの作成・変更・削除を行うための `DatadogAPICall` Lambda 関数とその権限である IAM role を作成するものです。

この Lambda 関数は、[**Cfn のカスタムリソース**](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-custom-resources.html)として機能し、Cfn の作成・変更・削除に伴って Datadog API を呼び出して Datadog 内の設定やリソースを作成・変更・削除を行います。そのため、AWS integration を停止したい場合は、<INS>Cfn スタックの削除を行うだけで Datadog 上の設定も自動的に削除</INS>されます。

## おわりに
本記事では Datadog AWS integration を使いこなすための情報を**オリジナルの図**と共に説明しました。

Datadog の AWS integration には、X-ray トレースの連携やログアーカイブとしての S3 の利用、EventBridge と Datadog Event Management の統合など触れられていない機能もたくさんあります。

基本的な機能については『[【完全解説】4大クラウドの Datadog integrations アーキテクチャ【2024年版】](https://qiita.com/AoTo0330/items/33d7b58a3cfddcbd3fe2)』でも説明しているため、こちらも是非ご参照ください。