🌩️

Private Endpoint経由でTiDB Serverlessに接続する - Terraform編 -

2024/04/02に公開

TL;DR

Terraformで実装

前提

  • AWS上に構築
  • VPCとVPCに紐づくSubnetは構築済み
  • 今回、作成するのはSecurityGroupとVPC Endpoint

構成図


Private Endpoint経由でTiDB Serverlessに接続するより参照

0. TiDB Serverlessの接続情報をメモ

  • Service NameAvailability Zone IDRegion IDをメモしてください

    参考:TiDB Cloudのコンソール画面

1. 必要なデータリソースを定義

  • TiDB Serverlessと同じAZにあるSubnetを用意してください
data.tf
variable "vpc_id" {}

data "aws_vpc" "selected" {
  id = var.vpc_id
}

# TiDB Serverlessと同じAZにあるSubnetを用意
variable "subnet_id" {}

data "aws_subnet" "selected" {
  id = var.subnet_id
}

2. Security Groupを作成

  • TiDBはデフォルトで4000番ポートを開放します
  • IngressのCIDRは各環境に合わせて設定してください
resource "aws_security_group" "tidb_serverless" {
  name   = "tidb-serverless-for-vpc-endpoint"
  vpc_id = data.aws_vpc.selected.id

  tags = {
    Name = "tidb-serverless-for-vpc-endpoint"
  }
}

resource "aws_security_group_rule" "tidb_serverless_ingress" {
  security_group_id = aws_security_group.tidb_serverless.id
  description       = "for tidb serverless"
  type              = "ingress"
  from_port         = 4000
  to_port           = 4000
  protocol          = "tcp"

  # IngressのCIDRは各環境に合わせて設定
  cidr_blocks = [
    data.aws_vpc.selected.cidr_block
  ]
}

resource "aws_security_group_rule" "tidb_serverless_egress" {
  security_group_id = aws_security_group.tidb_serverless.id
  type              = "egress"
  from_port         = 0
  to_port           = 0
  protocol          = "-1"

  cidr_blocks = [
    "0.0.0.0/0"
  ]

  ipv6_cidr_blocks = [
    "::/0"
  ]
}

3. VPC Endpointを作成

  • TiDB Serverlessの接続情報をメモしたService Nameを利用
resource "aws_vpc_endpoint" "tidb_serverless" {
  vpc_id       = data.aws_vpc.selected.id
  service_name = "0. TiDB Serverlessの接続情報をメモしたService Nameを入力"

  vpc_endpoint_type   = "Interface"
  private_dns_enabled = true

  security_group_ids = [
    aws_security_group.tidb_serverless.id,
  ]

  subnet_ids = [data.aws_subnet.selected.id]

  tags = {
    Name = "tidb-serverless"
  }
}

4. デプロイして動作確認

  • 以上で設定は完了です
  • 後はterraform planで確認してterraform applyでデプロイするのみです
  • 動作確認は踏み台からMySQL CLIを使って接続確認をしました

設定で気になったこと

TiDB ServerlessはAZが1つしかないように見えるけど、別のAZから接続できるのか?

TiDB ServerlessでAZが1つしかないように見えるし、基本的にap-northeast-1a (apne1-az4)が割り当てられている。

なので、VPC Endpointを設定するのはap-northeast-1a (apne1-az4)に対してのみ行うことになる。
そのため、設定するSubnetもap-northeast-1a (apne1-az4)にあるSubnetのみ行う。

なんとなく繋がらないようにも思えるが、VPC EndpointはVPC上に構築され、1aでも1c/1dからでもアクセスは可能です(そうだったんだ笑)


AWS PrivateLink で AZ の異なる EC2 インスタンス同士を疎通させる構成についてより参照

ついでに、VPC Endpointを設定するためにap-northeast-1a (apne1-az4)上にSubnetは必要です。
なので、ap-northeast-1a (apne1-az4)上にSubnetが無い場合は作成が必要です。

さいごに

TiDBのベクトル検索機能を早く試してみたいなぁ〜
あと、TiDB Serverlessでブランチ機能があるんですが、これがわりと革命的な気がして早く使いこなしたい。

レバテック開発部

Discussion