VPC Latticeを使ってECSからTiDB Cloud(Serverless)へ接続してみた
こんにちは、ゲームソリューション部のsoraです。
今回は、VPC Latticeを使ってECSからTiDB Cloud(Serverless)へ接続してみたことについて書いていきます。
構成
今回構築するのは以下です。
ECS側はLatticeサービスネットワークへのVPCの関連付けをして、TiDB Cloud側はリソース設定の関連付けで接続します。

通信の流れは以下です。
ユーザーからブラウザでリクエストを送付して、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を使った設定については、以下ブログをご参考ください。
リソースゲートウェイの作成
リソース設定の関連付けを利用する際には、リソースゲートウェイが必須となります。
リソースゲートウェイを外部リソースへの通信の入り口として使用します。
# リソースゲートウェイ用のセキュリティグループ
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になっています。

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

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


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







