Amazon GameLift ServersとTiDB Cloud DedicatedをPrivateLink + VPCピアリングで安全に接続してみた
こんにちは、ゲームソリューション部の入井です。
今回の記事では、Amazon GameLift Serversで作成したゲームサーバーから、TiDB Cloud Dedicatedクラスタに安全に接続する方法を解説します。
全体像
今回は、以下のような構成で検証しました。
図の通り、GameLift ServersとTiDB Cloudの間に、中継役となるVPCを挟んでいます。遠回りな接続をする形になっていますが、GameLift Serversの制約上このような構成にする必要がありました。
GameLift ServersはVPCピアリング機能を持っており、これを使うことでゲームサーバーインスタンスが起動するVPCと他のVPCを接続させることができます。しかし、この機能はあくまで通常のVPCと接続することが前提となっており、TiDBとのVPCピアリングのような特殊な設定には対応していませんでした。
そのため、GameLift ServersとTiDB Cloudの間に中継用のVPCを配置することにしました。このVPCは、GameLift ServersとはVPCピアリングで、TiDB CloudとはPrivateLinkを使って接続しています。GameLift Serversインスタンス内からTiDB Cloudへアクセスする時は、中継用VPC上のProxyサーバーを経由して通信する形となっていてます。
Proxyサーバー稼働分のコストが増えてしまいますが、この構成によってGameLift ServersのVPCピアリングの制約を気にすることなく、GameLiftからTiDB Cloudへのプライベート接続を実現できました。
設定方法
ここからは具体的な設定方法について紹介していきます。
中継用VPCとSubnetの作成
最初に、GameLift ServersとTiDB Cloudの中継をするVPCとSubnetを作成します。Subnetは、後の工程でProxy ServerインスタンスやPrivateLinkエンドポイントを紐づけます。
特別な設定は必要ありませんが、Private LinkでTiDB Cloudにアクセスする際の名前解決のため、以下の画像のようにDNS関係の設定を有効化する必要があります。
GameLift ServersフリートのVPCピアリング設定
今回の検証では、マネージドEC2フリートを使ってVPCピアリング設定を進めます。(具体的な作成方法は省略します)
通常のVPCピアリングとは少し手順が異なり、対象のゲームサーバーが起動するフリートを作成後、以下のような流れで設定していく必要があります。
- VPCピアリング接続の許可を予約
- VPCピアリング接続のリクエスト
最初に、create-vpc-peering-authorization
コマンドを使ってGameLift ServersからのVPCピアリング接続リクエストを、VPC側が受け入れるよう事前に承認します。
--game-lift-aws-account-id
オプションで GameLift Serversを使用しているAWSアカウントIDを指定し、--peer-vpc-id
オプションで接続先となる中継VPCのIDを指定します。
aws gamelift create-vpc-peering-authorization --game-lift-aws-account-id 11111111111 --peer-vpc-id vpc-01aaaaaaa
実行に成功すると、承認結果がレスポンスとして得られます。
{
"VpcPeeringAuthorization": {
"GameLiftAwsAccountId": "11111111111",
"PeerVpcAwsAccountId": "11111111111",
"PeerVpcId": "vpc-01aaaaaaa",
"CreationTime": "2025-08-12T09:31:18.099000+00:00",
"ExpirationTime": "2025-08-13T09:31:18+00:00"
}
}
続いて、create-vpc-peering-connection
コマンドを使って、先ほど承認を得たVPCへのピアリング接続を作成します。
--peer-vpc-aws-account-id
オプションで対象のVPCのAWSアカウントIDを指定し、--peer-vpc-id
オプションで接続先となる中継VPCのIDを指定、更に--fleet-id
オプションで実際に接続するGameLift ServersのフリートIDを指定します。
aws gamelift create-vpc-peering-connection --fleet-id fleet-99999999 --peer-vpc-aws-account-id 11111111111 --peer-vpc-id vpc-01aaaaaaa
接続に成功すると、aws gamelift describe-vpc-peering-connections
コマンドで以下のように接続中のピアリング接続の情報を得られます。
{
"VpcPeeringConnections": [
{
"FleetId": "fleet-99999999",
"FleetArn": "arn:aws:gamelift:ap-northeast-1:11111111111:fleet/fleet-99999999",
"IpV4CidrBlock": "11.11.111.1/18",
"VpcPeeringConnectionId": "pcx-07777777777",
"Status": {
"Code": "active",
"Message": "Active"
},
"PeerVpcId": "vpc-01aaaaaaaaa",
"GameLiftVpcId": "vpc-02bbbbbbbb"
}
]
}
参考ドキュメント
TiDB Cloud DedicatedのPrivateLink設定
続いて、TiDB Cloudと先ほど作成した中継VPCとのPrivateLinkを確立するための設定を行います。(Clusterは既に作成済の前提で進めます)
なお、PrivateLinkはDedicated Clusterでのみ利用可能です。Serverles Clusterでは利用できないためご注意ください。
TiDB Cloudのプロジェクト管理画面でProject Settings->Network Accessをクリックし、Private Endpoint
とAWS
タブを選択した状態で、Create Private Endpoint Connection
ボタンをクリックします。
ダイアログが表示されたら、VPCと接続するClusterを選択し、「TiDB Private Link Service is ready」が表示されているのを確認したうえで、中継VPCとSubnetのIDをそれぞれの項目に入力します。
すると、VPCエンドポイントを作成するためのaws cliコマンドが生成されるので、これを中継VPCのAWSアカウント上で実行し、レスポンスで得られたVPC Endpoint IDもダイアログに入力したうえで「Create Private Endpoint Connection」をクリックします。
最後に、作成したVPCエンドポイントでプライベートDNS機能を有効化するコマンドが表示されるので、これも実行します。
ここまでの手順を行うことで、中継VPCとTiDB CloudとのPrivateLink設定は完了となります。
参考ドキュメント
Proxy用EC2インスタンスやセキュリティグループの設定
続いて、中継VPC上のSubnetでProxy Serverとして使用するためのEC2インスタンスを起動します。
インスタンス作成の際、セキュリティグループは以下のように設定します。
- インバウンドルール
- タイプ カスタムTCP
- ポート範囲: 4000(TiDBの標準ポート)
- ソース: GameLift Servers VPCのCIDR(VPCピアリング接続の設定から確認可能)
- アウトバウンドルール
- タイプ: カスタムTCP
- ポート範囲: 4000
- 送信先: PrivateLinkエンドポイントのプライベートIPアドレス
これにより、GameLift Serversインスタンスからの4000ポートへのアクセス受付と、PrivateLinkの4000ポートへの送信が可能となります。
その他、EC2インスタンスにSSHでアクセスするための設定しておきます。
また、OSについては使用したいProxyツールに応じて選択します。私はAmazon Linux2023で進めました。
EC2インスタンスにSSHアクセスしたうえで、Proxyツールを実行します。今回、私はsocatというツールを使用しました。
以下のようにインストールの上でコマンド実行することで、外部からの4000ポートへのアクセスをTiDB Hostの4000ポートへ転送します。TiDBのHost情報は、TiDBのCluster設定画面の接続ダイアログから取得できます。
sudo dnf install socat -y
socat TCP-LISTEN:4000,fork TCP:[TiDBのHost情報]:4000
また、PrivateLinkエンドポイントに紐づいているセキュリティグループは以下のように設定しておきます。
- インバウンドルール
- タイプ カスタムTCP
- ポート範囲: 4000
- ソース: Proxy Server EC2インスタンスのプライベートIPアドレス
- アウトバウンドルール: 設定不要
GameLift Serversインスタンスからの接続テスト
準備が整ったため、GameLift ServersインスタンスからTiDB Cloudへの接続テストを行います。
今回の検証ではインスタンスからMySQLコマンドを直打ちしてテストしますが、実際の利用時はゲームサーバープログラムからアクセスする形になると思います。なお、インスタンス内でMySQLコマンドを使う場合、ゲームサーバービルドのインストールスクリプトでmysqlのインストールコマンドを記載しておく必要があります。
GameLift Serversインスタンスへのログインは、以下のドキュメントに記載の手順で可能です。
ログイン後、以下のようにmysqlコマンドを打ってTiDB CloudのDBサーバーへアクセスします。
sh-5.2$ mysql --comments -u [ユーザー名] -h [Proxy ServerのIP] -P 4000 -D 'test' -p[パスワード]
すると、Proxy ServerからTiDB Cloudへリクエストが転送され、以下のようにDBサーバーへのログインが成功します。
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 11111
Server version: 8.0.11-TiDB-v8.5.2 TiDB Server (Apache License 2.0) Enterprise Edition, MySQL 8.0 compatible
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
最後に
今回のような構成を使用することにより、Amazon GameLift Serversで稼働するゲームサーバーからTiDBへのセキュアな接続が実現できます。
また、今回は簡単に検証を進めるためEC2インスタンスをProxy Serverとして利用しましたが、AWS Fargateなどでサーバーレス化することで手間やコストを削減したり、可用性を上げたりできると思います。