🌩️
Private Endpoint経由でTiDB Serverlessに接続する - Terraform編 -
TL;DR
- Private Endpoint経由でTiDB Serverlessに接続するの設定をTerraformで実装
- 接続の際に気になった部分を軽く補足(主にAZとSubnet周り)
Terraformで実装
前提
- AWS上に構築
- VPCとVPCに紐づくSubnetは構築済み
- 今回、作成するのはSecurityGroupとVPC Endpoint
構成図
Private Endpoint経由でTiDB Serverlessに接続するより参照
0. TiDB Serverlessの接続情報をメモ
-
Service Name
・Availability Zone ID
・Region 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でブランチ機能があるんですが、これがわりと革命的な気がして早く使いこなしたい。
レバテック開発部の公式テックブログです! レバテック開発部 Advent Calendar 2024 実施中: qiita.com/advent-calendar/2024/levtech
Discussion