【AWS re:Invent 2024】AWS PrivateLink を利用した RDS 接続の新手法 — フェイルオーバー時のIPアドレス変更が考慮不要に

記事タイトルとURLをコピーする

EC部の荒井です。年内は暖房を付けずに耐えられると思っていましたがダメでした。

今回は re:Invent2024 で公開された、新しい PrivateLink の接続方法を利用した RDS への接続を試してみます。

aws.amazon.com

この記事で伝えたいこと

新しい実装方式を利用することで、別途 Lambda を作り込む必要なく PrivateLink 経由で RDS に接続可能になりました!

はじめに

今まで PrivateLink 経由で RDS に接続する必要がある場合は、AWS 観点ではいくつか考慮する必要がある点がありました。

その中の1つで、RDS がフェイルオーバーや再起動された際にプライマリインスタンスの IP アドレスが変更された際には通信不可になるというものがあります。 これは PrivateLink 接続には NLB が必須であり、NLB のターゲットには IP アドレスしか設定できないためとなります。

この問題を回避するためにフェイルオーバーイベントをトリガーとして、Lambdaを使って NLB のターゲットを更新する仕組みを用意するなど別途作り込みが必要でした。

aws.amazon.com

今回のアップデートで、NLB の代わりに Resource configurations + Resource gateways という新しいリソースを利用することによって ARN 等を指定して PrivateLink を実装できるようになりました。

つまり、RDS のプライマリインスタンスの IP アドレスが変更になった場合の考慮が不要となりました。

実際に試してみる

構成図

この環境のポイントは以下の通りです。

  • 同一 AWS アカウント上の環境
  • EC2 から RDS に VPC エンドポイントを指定して接続
  • Resource configurations + Resource gateways での PrivateLink を実装

セキュリティグループの設定は以下の通りです。

  • EC2

    • インバウンド:設定なし
    • アウトバウンド:VPCエンドポイントへの MySQL 通信を許可
  • VPC エンドポイント

    • インバウンド:EC2 からの MySQL 通信を許可
    • アウトバウンド:設定なし
  • Resource gateways

    • インバウンド:設定なし
    • アウトバウンド:RDS への MySQL 通信を許可
  • RDS

    • インバウンド:Resource gatewaysからの MySQL 通信を許可
    • アウトバウンド:設定なし

実装の流れ

下記手順にて実装を行っていきます。

① Resource gateway の作成
② Resource configuration の作成
③ VPC エンドポイントの作成
④ 疎通確認

① Resource gateway の作成

VPCのページを開き、左メニューから新しく追加された Resource gateways を選択し、「Create resource gateway」をクリックします。

任意の名前を設定し、Resource gateway を作成したい VPC(=接続先RDSが存在するVPC) を選択します。 2AZ以上にまたがるようにサブネットを設定し、用意したセキュリティグループを選択して作成します。

② Resource configuration の作成

①で作成完了後、画面右上の「Create resource configuration」をクリックします。

任意の名前を選択し Configuration type は Resource を選択します。

今回は RDS を接続先としたいため、Type は ARN を選択し、先程作成した Resource gateway を選択します。

ARN リソース定義箇所では、Resource type を Amazon Relational Database Service を選択し、用意しておいた RDS を設定します。

画面下部の設定箇所では、RAM を利用したリソースの共有やログ出力についての設定が可能です。

今回は同一アカウント内での検証のためリソース共有は設定せず、ログは CloudWatch Logs に出力されるようにしました。

③ VPC エンドポイントの作成

左メニューからエンドポイントを選択し、「エンドポイントの作成」をクリックします。

任意を名前を設定し、タイプは「リソース-新規」を選択します。

リソース設定は先ほど作成した Resource configuration であり、タイプが ARN となっているものをを選択します。

ネットワーク設定では、接続元 EC2 が存在する VPC を選択し、2AZ以上にまたがるようにサブネットを設定します。

セキュリティグループには、用意しておいた VPC エンドポイント用のものを設定します。 これで実装は終了となりますので、疎通確認を行います。

④ 疎通確認

作成した VPC エンドポイントの関連付けタブから、DNS名を確認します。
(通常の VPC エンドポイントの場合は、詳細タブのプライベート DNS 名に記載されているので面食らいました)

この後 RDS をフェイルオーバーさせて IP を変更させて再度確認したいので、現時点での IP を先に確認します。

> nslookup <RDSのエンドポイント名>

権限のない回答:
名前:    <RDSのエンドポイント名>
Address:  192.168.1.140

それではEC2 に任意の方法で接続し、VPC エンドポイントの DNS 名を利用して MySQL に接続できるか確認します。

[ssm-user@ip-192-168-0-12 bin]$ mariadb -u admin -p -h <VPC エンドポイントのDNS 名>
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.39 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

無事に接続できました!それでは RDS をフェイルオーバーさせ、IP 変更後も接続可能か確認します。

> nslookup <RDSのエンドポイント名>

権限のない回答:
名前:    <RDSのエンドポイント名>
Address:  192.168.1.232

IP が変更されたので再度確認を行います。従来の NLB を利用する PrivateLink で作り込みをしていない場合、接続は不可でした。

[ssm-user@ip-192-168-0-12 bin]$ mariadb -u admin -p -h <VPC エンドポイントのDNS 名>
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.39 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

想定通り、Resource configurations + Resource gateways を利用した PrivateLink では、作り込み無しで RDS のフェイルオーバーに対応可能でした!

ログを確認してみますと、RDS のプライマリインスタンス IP を示す resourceIpPort が変わっていることが分かります。

★ フェイルオーバー実行前

★ フェイルオーバー実行後

終わりに

作り込み無しで PrivateLink 経由の RDS 接続・運用が可能になるので、かゆいところに手が届くアップデートだと思います!

本記事がどなたかのお役に立てれば幸いです。

荒井 泰二郎 (記事一覧)

2023年8月入社 最近ジムに通い始めました