🐶

AWS PrivateLink クロスリージョン接続を活用して AWS と Datadog の通信を閉域網に閉じる

に公開

概要

弊社では USリージョンの Datadog サービスと、ap-northeast-1リージョンの AWS 環境上に起動している Datadog Agent の通信を NAT Gateway 経由のインターネット通信で行っていたのですが、セキュリティ上の理由からインターネットではなく AWS PrivateLink に閉じた接続に切り替えたいと考えていました。
ただ、AWS PrivateLink がクロスリージョン接続に対応する前は、Datadog と AWS のリージョンを揃えるか、AWS VPC のリージョン間 VPC ピアリングを使って通信を確立する必要がありました。
どちらの方法も以下のデメリットがあり気軽に導入できるものではありませんでした。

  • リージョンを揃える方法
    • そもそもリージョンを後から変えるのが大変
    • Datadog は US より AP1 が料金的に割高
  • リージョン間 VPC ピアリングを使う方法
    • VPC ピアリングを用意するためにリソースが増えて運用コストが上がる
    • リージョン間の通信料金が発生する

ですが、2024年11月26日に「AWS PrivateLink のクロスリージョン接続」が公開されたことで、リージョン間 VPC ピアリングを用意しなくても AWS PrivateLink によるクロスリージョン接続が実装できるようになったため、これを機に インターネット接続から AWS PrivateLink に切り替えることにしました。

構成図としての Before/After は以下の通りです。

Before(NAT Gateway 経由のインターネット通信の場合)

前提条件

本記事では以下の環境を前提としています。

実装

GUI で行う場合は、下記 Datadog 公式の Cross-region PrivateLink endpoints の手順を実施すれば OK です。
https://docs.datadoghq.com/ja/agent/guide/private-link/?tab=crossregionprivatelinkendpoints#他のリージョンからの接続

Terraform で実装する場合は以下の通りです。
使う resource は aws_vpc_endpointaws_security_group のみなので非常にシンプルです。

# Datadog Logs(Agent HTTP インテーク)
resource "aws_vpc_endpoint" "datadog_logs" {
  # Datadog Agent が動作している VPC を指定する
  vpc_id              = aws_vpc.main.id
  vpc_endpoint_type   = "Interface"
  # Datadog(US) で公開されている AWS PrivateLink のサービス毎のエンドポイントを入力する
  service_name        = "com.amazonaws.vpce.us-east-1.vpce-svc-025a56b9187ac1f63"
  # Datadog Agent が Datadog のサービスエンドポイントに DNS 名でアクセスする為に有効化する
  private_dns_enabled = true
  # クロスリージョン接続する先のリージョン名を入力する
  service_region      = "us-east-1"
  # Datadog Agent が動作しているサブネットを指定する(AZ障害を考慮しないなら1つのサブネットに配置するだけでも動作する)
  subnet_ids          = [
    aws_subnet.private_1a.id,
    aws_subnet.private_1c.id,
    aws_subnet.private_1d.id,
  ]
  security_group_ids = [
    aws_security_group.datadog_privatelink.id,
  ]
  tags = {
    Name = "privatelink-datadog-logs"
  }
}

resource "aws_security_group" "datadog_privatelink" {
  name   = "datadog-privatelink-sg"
  vpc_id = aws_vpc.main.id

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "TCP"
    cidr_blocks = ["10.0.0.0/16"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "datadog-privatelink-sg"
  }
}

導入した結果

メリット

  • Datadog と Datadog Agent の通信がインターネットに露出しなくなったのでセキュアになった
  • NAT Gateway を経由しなくて済むようになったので、NatGateway-Bytes($0.062/GB) にかかるコストが削減された

デメリット

  • 新たに PrivateLink を起動したため、各 AZ の VPC エンドポイント 1 つあたりに VpcEndpoint-Hours($0.014/hour)が発生する
  • PrivateLink 経由の通信に VpcEndpoint-Bytes($0.01/GB)が発生する

損益分岐点について

セキュリティ面でメリットがあるのは間違いないのですが、コスト面ではどうなのかも気になると思うので損益分岐点を計算します。
条件は Terraform サンプルコードの内容とします。

まず、PrivateLink にすることで発生するコストを計算します。
各 AZ の VPC エンドポイント 1 つあたりに VpcEndpoint-Hours($0.014/hour)が発生するため、新たに発生するコストは $0.042/hour となり、1ヶ月あたりだと 約$30 となります。

それに対して、削減できるコストは NatGateway-Bytes($0.062/GB)が VpcEndpoint-Bytes($0.01/GB)に置き換わることによる差額なので、1GB あたり $0.052 のコスト削減となります。

PrivateLink の方が通信量が安いのですが、追加でかかる月額 $30 の固定費を取り戻すには、月に 576GB(30 / 0.052)の通信量が必要です。
とはいえ、セキュリティを重視するなら損益分岐点を超えていなくても PrivateLink にしてしまうのがベストプラクティスだと思います。

まとめ

  • 以前は、Datadog(US) と AWS(ap-northeast-1) など異なるリージョン間で PrivateLink を使うには、以下のいずれかが必要でした
    • リージョンを揃える(膨大な作業コスト)
    • リージョン間の VPC ピアリング設定(構築・運用が面倒)
  • 2024年11月に登場した 「AWS PrivateLink のクロスリージョン接続」により、シンプルな構成で PrivateLink を導入できるようになりました
Social PLUS Tech Blog

Discussion