【Datadog】Private Linkを使用したデータの送信について解説


「AWS PrivateLink を介して Datadog に接続する」

https://docs.datadoghq.com/ja/agent/guide/private-link/?tab=useast1

こちらについて、ドキュメントに書いてある内容の補足や、重要事項の洗い出しをやってみようと思います。
残念ながらオールハンズオン形式ではないので注意してください。
もしこの設定を使用する際にうまくいかなかった人の助けになることを祈っています。

:::note warn
ap-northeast-1向けのendpointが公開されたようです。
記事の内容が古い可能性があるので注意してください。
:::


もくじ
1. Private Linkについて
1. 作成するもののリスト
1. 設定
    1. VPC Endpointの作成
        1. ポイント
    1. VPC Peeringの設定
    1. Route 53の設定
        1. ポイント
    1. VPC association authorizationの設定
    1. Datadog agentの再起動
1. Troubleshooting
1. 最後に

### Private Link
AWSの[Private Link](https://aws.amazon.com/jp/privatelink/)について解説します。もう知ってるよって人は飛ばしてください。

身も蓋もないことをいうと、下記の記事が参考になります。

>- VPCエンドポイント
VPCと他サービス間でプライベートな接続を提供するコンポーネント
サービス利用側のVPC内で作成
>- AWS PrivateLink
プライベート接続を介したサービスを提供するためのサービス
以下の2つがセットとなり、AWS PrivateLinkが提供されている。
　 - VPCエンドポイント（サービス利用側のVPC内で作成）
　 - VPCエンドポイントサービス（サービス提供側のVPC内で作成）

https://dev.classmethod.jp/articles/aws-vpcendpoint-privatelink-beginner/

ちなみに私はPrivate linkについてサービスというよりは、**AWSのサービスを組み合わせた仕組み**という理解をしています。実際AWS consoleの検索画面で「Private link」と検索しても出てこないです。(この辺がPrivate Linkをややこしくしているところだと思ってます。)
なぜこのように捉えているかについては、後に登場する全体図を見ていただけると、なんとなくわかると思います。

### 作成するもののリスト
Private Linkの構築の際に作成するものについて下記に記載します。
データの送信に失敗している場合、まず下記のリソースが作成済みか確認をしてください。

us-east-1
- VPC Endpoint
DatadogのVPC endpoint serviceに接続し、Private Linkを構築するために必要です。
各endpoint serviceに応じて必要なため、現状最大で8個作成することになります。

- VPC(VPC peering時に必要)
defaultで作成されたVPCの場合、VPC peering時にCIDRがかぶってしまい連携に失敗する可能性があります。

- Route53 Hosted Zoneと対応するレコード(VPC peering時に必要)
Endpointと1:1の関係になるように作成します。

- VPC 関連付け承認(リソースというより設定)
VPCとHosted Zoneの紐付けに必要です。
AWS consoleからは設定できないし、そんな大事じゃなさそうに記載されているので見逃している人がいるんじゃないかと思ってます。

ap-northeast-1
- Datadog agent
データの送信には何はともあれこいつが無いと始まりません。
インターネットアクセス制限下でのAgentのインストールは下記ドキュメントを参考にしてください。

https://docs.datadoghq.com/agent/guide/installing-the-agent-on-a-server-with-limited-internet-connectivity/

### 設定
全体図
![Screenshot 2023-03-17 at 20.17.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/8b936a91-a8c2-7d50-28dd-dd7d565362ae.png)
~~この図もね、正直ピンとこないんですよね。~~
![all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/20b071dd-26e2-db17-f973-4c2d86a3170b.png)

詳しく図解するとこんな感じになります。わかりやすい！！
最初にも述べましたが、VPC EndpointとVPC Endpoint serviceを組み合わせた仕組みがAWS Private Linkです。
Route 53君が説明の都合上AWS Private Linkのグループに入っていますが、VPC peeringを使用しない場合は不要です。

さて、ここからはAWS Private Linkを介してDatadogに接続するためにドキュメントの内容を読み解いていきます。
この記事を読んでいる人の多くはデータを送信したいリソース(EC2など)がap-northeast-1に存在していると思うので、[VPC peering](https://docs.datadoghq.com/agent/guide/private-link/?tab=vpcpeering#amazon-vpc-peering)のページを読んでいきます。

#### VPC Endpointの作成

![endpoint1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/efd7e9f1-1dda-f7ac-de39-0b0a4d0ea745.png)
これから説明していくのは最初の図でいうと赤枠の部分ですね。(Route 53君には一時的に消えてもらっています。)


![Screenshot 2023-03-17 at 20.11.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/d2ab03e4-19a1-22c6-1593-cac3eef83378.png)
>Connect the AWS Console to region us-east-1 and create a VPC endpoint.

早速ですが下記に当てはまる人はus-east-1にVPCを作成してください。
- ap-northeast-1のVPCとus-east-1のVPCのCIDRが被っている
- us-east-1にVPCが無い(defaultで作られている気がするのですが忘れました)

実はVPCピアリングにはたくさん制限があったりします。今回の記事の内容で影響しそうなところはCIDRに関するものだと思っていますが、下記ドキュメントの内容を一読しておくと助かるかもしれません。
[VPC peering limitations](https://docs.aws.amazon.com/vpc/latest/peering/vpc-peering-basics.html#vpc-peering-limitations:~:text=connection%20between%20them.-,VPC%20peering%20limitations,-Consider%20the%20following)

続いてVPC Endpointをus-east-1に作成していきます。
このVPC Endpointは**Datadogが持つVPCに存在するVPC Endpoint Serviceに連結します。**
この連結によって、VPC Endpointを通って、サービスを提供するVPC Endpoint Serviceを介してサービス提供元のAPI Endpointにリクエストを送信することができるようになります。

![Screenshot 2023-03-17 at 20.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/2656afaf-09e6-2de9-ad8d-f94d4cc08a18.png)
こちらが現在の設定時のUIです。ドキュメントのスクリーンショットは古いので注意してください。

1. Service categoryで Other endpoint services を選択します。
1. Service settingsで連携先のVPC Endpoint service(PRIVATELINK SERVICE NAME)を入力し、Verify serviceをクリックします。
1. 作成するVPC EndpointをアタッチするVPCの各種設定を追加します。(急に雑)

| DATADOG | PRIVATELINK SERVICE NAME |
|:-:|:-:|
| Metrics  | com.amazonaws.vpce.us-east-1.vpce-svc-09a8006e245d1e7b8  |
| Logs (Agent HTTP intake)  | com.amazonaws.vpce.us-east-1.vpce-svc-025a56b9187ac1f63  |
|  Logs (User HTTP intake) |  com.amazonaws.vpce.us-east-1.vpce-svc-0e36256cb6172439d |
| API  |  com.amazonaws.vpce.us-east-1.vpce-svc-064ea718f8d0ead77 |
| Process  |  com.amazonaws.vpce.us-east-1.vpce-svc-0ed1f789ac6b0bde1 |
| Profiling  | com.amazonaws.vpce.us-east-1.vpce-svc-022ae36a7b2472029  |
| Traces  |	com.amazonaws.vpce.us-east-1.vpce-svc-0355bb1880dfa09c2|
|  Containers | 	com.amazonaws.vpce.us-east-1.vpce-svc-0ad5fb9e71f85fe99  |

ほんとこれスクショで良かったと思う。
それはさておき、これを使用するVPC Endpoint Serviceの数だけ実施します。
ただのトンネルなので全部作っちゃって良いと思います。(AWSのコストだけは気にしてね)

##### ポイント
- Service settingsのService nameのVerifyはap-northeast-1でやるとエラーになるので間違っているのが分かりやすいです。
- Enable DNS nameは選択しないでください。
- セキュリティグループはTCP port 443のインバウンドトラフィックを許可するようにしてください。
- VPC Endpoint作成後はStatusがAvailableに変わるのを確認してください。

実はこの時点でPrivate Linkの作成は完了しています。
なので、us-east-1にリソースがある人はもうデータの送信ができるようになっているはずです。

他のregionにリソースがある人はもう少しだけ頑張りましょう。

#### VPC Peeringの設定
![vpcpeering.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/fc7bbffd-e716-a16f-f870-7cb0a11e0e28.png)
>エンドポイントが作成されたら、VPC ピアリングを使って、別のリージョンでも PrivateLink エンドポイントを利用して PrivateLink 経由で Datadog にテレメトリーを送信できるようにします。詳しくは、AWS の VPC ピアリング接続での作業ページをご覧ください。

Datadogのドキュメントなので当たり前のことなのですが、VPC peeringについては記載が薄いです。
この設定についてはAWSのドキュメントで良さそうなものがあったので下記にリンクを置いておきます。
[Create with VPCs in the same account and different Regions
](https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html#:~:text=the%20peering%20connection.-,Create%20with%20VPCs%20in%20the%20same%20account%20and%20different%20Regions,-To%20create%20a)

VPC Peeringが上手くいかない時はAWSのサポートに相談する方が良いですね。

#### Route 53の設定
![route53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/9db867d8-8cb2-ac57-264a-22a009820929.png)
ここではRoute 53 Private host zoneを作成します。
Private hosted zoneを作成することで、初めに作成したVPC Endpointへのルーティングを設定します。
![Screenshot 2023-03-20 at 8.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/12eff4a9-f9da-c6d5-6b2b-20a4540ee446.png)


##### ポイント
- 正しいVPC EndpointのDNS名を設定する

##### VPC association authorizationの設定
このセクションで行う操作は大きく二つあります。

1. VPC association authorizationをAWS CLIやSDK、APIなどから設定を行う。※AWS Consoleからは設定できないため
1. Route 53のVPCs to associate with the hosted zoneにap-northeast-1のVPCを追加する。

VPC association authorizationの設定について
下記3つの方法で設定できるみたいです。
- Amazon CLI
- AmazonSDK or Amazon Tools for Windows PowerShell
- Amazon Route 53 API

僕があんまりSDKを使った経験が無いからというのもあるかもしれませんが、CLIやAPIを使うのが手っ取り早いように感じます。

![Screenshot 2023-03-20 at 9.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/6b199dc5-7249-8fd2-0827-6de11a14dfd3.png)
設定後はRoute 53のhosted zoneをドキュメントの内容に沿ってVPCを追加します。この時VPCの設定で`enableDnsHostnames`と`enableDnsResolver`(ドキュメント上は`enableDnsSupport`)を有効化されていることを確認してください。

![Screenshot 2023-03-20 at 9.29.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/eaa211d1-0e55-e9d1-9e8b-af39688832ad.png)
VPC上のDNSに関連した設定で変更可能な設定は`enableDnsHostnames`と`enableDnsResolver`です。
AWS上のドキュメントをいくつか見てきたのですが、どれも`enableDnsSupport`表記でした。

>Important
If you use custom DNS domain names defined in a private hosted zone in Amazon Route 53, you must set both the enableDnsHostnames and enableDnsSupport attributes to true.

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#:~:text=a%20VPN%20connection.-,Important,-If%20you%20use

>To use private hosted zones, you must set the following Amazon VPC settings to true:
enableDnsHostnames
enableDnsSupport

https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-considerations.html#hosted-zone-private-considerations-vpc-settings:~:text=Required%20IAM%20permissions-,Amazon%20VPC%20settings,you%20must%20set%20the%20following%20Amazon%20VPC%20settings%20to%20true%3A,-enableDnsHostnames

一方で、下記は2022年の10月31日と比較的新しいAWSのQAなのですが、下記の記載があります。
>Domain Name System (DNS) hostnames and DNS resolution are required settings for private hosted zones.

https://aws.amazon.com/premiumsupport/knowledge-center/vpc-enable-private-hosted-zone/?nc1=h_ls

恐らく、一部のドキュメントでは反映が遅れているんじゃないかと思います。

#### Datadog agentの再起動
最後にAgentを再起動し、Datadog UI上などでAgentからのメトリクスが送信されているかを確認してください。


### Troubleshooting
TroubleshootingのTipsを簡単にあげておこうと思います。

- リソースは全て作成済み？

まずはここからじゃないですかね。作成するもののリストを参考に確認してみてください。

- 設定したけどデータの送信ができない場合

対象のhostからnslookupをしてください。
```
nslookup 7-43-1-app.agent.datadoghq.com
```
7-43-1の部分はAgentのバージョンに置き換えてください。
そこから名前解決ができるのかできないのか、そもそもus-east-1のVPCに行けていないのか、何かと情報が得られると思います。

### 最後に
AWSやDatadogのドキュメントでもそうなのですが、海外プロバイダーのサービスを活用する際、日本語ドキュメントを参考にするのは良いのですが、最新情報はあるとしたら英語のドキュメントにあります。違和感を感じる内容がある場合や、ドキュメント通りに設定したけど上手くいかなった場合は英語のドキュメントと見比べることをお勧めします。

![undraw_Team_up_re_84ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/085acc00-34b0-3022-9855-250f3982f5f9.png)