VPC Latticeを使ってECSからTiDB Cloud(Serverless)へ接続してみた

VPC Latticeを使ってECSからTiDB Cloud(Serverless)へ接続してみた

2025.12.03

こんにちは、ゲームソリューション部のsoraです。
今回は、VPC Latticeを使ってECSからTiDB Cloud(Serverless)へ接続してみたことについて書いていきます。

構成

今回構築するのは以下です。
ECS側はLatticeサービスネットワークへのVPCの関連付けをして、TiDB Cloud側はリソース設定の関連付けで接続します。

ecs-lattice-tidbcloud-01

通信の流れは以下です。
ユーザーからブラウザでリクエストを送付して、ECSからLattice経由でTiDB Cloudへ接続し、レスポンスを返す形です。

ユーザー (ブラウザ)
    ↓ http://<ECSのPublic IP>:8080/data?id=1
ECS (VPC, port 8080)
    ↓ Lattice経由でTiDB Cloudへ接続
    ↓ <TiDB CloudのDNS>:4000
TiDB Cloud (port 4000) ※受け取ったidに該当するデータを返却

Latticeサービスネットワークに接続先を公開する方法は「サービスの関連付け」と「リソース設定の関連付け」の2つがあります。
自身のAWS VPC内のターゲットを指定する場合は「サービスの関連付け」を利用しますが、今回のTiDB Cloudはユーザー管理外のVPCにあるリソースなため、「リソース設定の関連付け」を使用します。
リソース設定の関連付けであれば、オンプレや今回のようなTiDB Cloudなどの外部DNSをターゲットとして指定可能です。

Terraformでの構築

AWS部分をTerraformで構築します。
ECS上で動くイメージも作成していますが、TiDB Cloudに対して簡単なSQLクエリを実行しているだけのため割愛します。

Terraformコードの中でLatticeのリソース設定の関連付けに関する部分を抜粋して説明していきます。
※説明の都合上、コードの順番は前後します。

Latticeサービスネットワークの作成・VPCの関連付け・サービスの関連付けのTerraformを使った設定については、以下ブログをご参考ください。
https://dev.classmethod.jp/articles/vpc-lattice-terraform-ecs-to-ecs/

リソースゲートウェイの作成

リソース設定の関連付けを利用する際には、リソースゲートウェイが必須となります。
リソースゲートウェイを外部リソースへの通信の入り口として使用します。

# リソースゲートウェイ用のセキュリティグループ
resource "aws_security_group" "resource_gateway_sg" {
  name        = "tidb-app-resource-gateway-sg"
  description = "Security group for Resource Gateway"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 4000
    to_port     = 4000
    protocol    = "tcp"
    cidr_blocks = [aws_vpc.main.cidr_block]
    description = "Allow TiDB traffic from VPC"
  }

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

  tags = { Name = "tidb-app-resource-gateway-sg" }
}

# Resource Gateway
resource "aws_vpclattice_resource_gateway" "main" {
  name       = "tidb-resource-gateway"
  vpc_id     = aws_vpc.main.id
  subnet_ids = [aws_subnet.public_a.id, aws_subnet.public_c.id]

  security_group_ids = [aws_security_group.resource_gateway_sg.id]

  tags = { Name = "tidb-resource-gateway" }
}

リソース設定の作成・関連付け

外部リソースへの接続定義であるリソース設定を作成し、Latticeサービスネットワークへリソース設定の関連付けをします。
リソース設定の関連付けであれば、外部リソースをターゲットとして指定することができます。
今回はDNSターゲットでTiDB Cloudを指定します。

# リソース設定(外部DNSを指定可能)
resource "aws_vpclattice_resource_configuration" "tidb" {
  name     = "tidb-cloud-config"
  type     = "SINGLE"
  protocol = "TCP"

  resource_gateway_identifier = aws_vpclattice_resource_gateway.main.id  # リソースゲートウェイと紐付け

  port_ranges = ["4000"]  # TiDB のポート

  resource_configuration_definition {
    dns_resource {
      domain_name     = var.tidb_host  # 外部DNS(TiDB Cloudのホスト名)
      ip_address_type = "IPV4"
    }
  }
}

# リソース設定の関連付け
resource "aws_vpclattice_service_network_resource_association" "tidb" {
  resource_configuration_identifier = aws_vpclattice_resource_configuration.tidb.id
  service_network_identifier        = aws_vpclattice_service_network.main.id
}

作成したリソースの確認

作成したリソースをAWSマネジメントコンソールで確認していきます。
まずLatticeサービスネットワークを確認すると、想定通り、ECSのあるVPCの関連付けとTiDB Cloudのリソース設定の関連付けがそれぞれ1になっています。

ecs-lattice-tidbcloud-02

次にリソース設定を見てみると、宛先のドメイン名とポート範囲が設定されていることがわかります。

ecs-lattice-tidbcloud-03

動作確認

前提として、TiDB Cloud側のクラスタや参照するデータは登録済みとします。
ブラウザ上でhttp://<ECSのPublic IP>:8080/data?id=1にアクセスしてみると、以下のように事前にTiDB Cloudに登録したidに紐づくデータが表示されました。

ecs-lattice-tidbcloud-04
ecs-lattice-tidbcloud-05

最後に

今回は、VPC Latticeを使ってECSからTiDB Cloud(Serverless)へ接続してみたことを記事にしました。
どなたかの参考になると幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事