RDS Proxyを使ったRDSのクロスアカウントアクセスを試してみる

2023.05.25

RDSのクロスアカウントアクセスを "VPC間の接続無しに" 実現したいです。

img

実現したい背景としては、以下を想定しています。

  • AWSのマルチアカウント管理を始めている
  • 「新規ワークロードアカウント(APPアカウント)」から「別アカウント(DBアカウント)のデータベース」へアクセスしたい
  • ただしセキュリティやネットワーク的制約でVPC Peering, Transit Gateway等の接続が難しい

実現のために、本ブログでは RDS Proxy を使ったアクセスを試してみます。

構成図は以下のとおり。 AWS Organizations 環境下が前提です

img

なお、本検証は以下 AWS公式ブログを大いに参考にしています。

また、別の手段である「PrivateLink + NLB を使った接続」についても以前に試しています。 以下ブログにまとめているので、併せてご覧ください。

作ってみる

以下のようなステップで作成します。

  1. [前提] RDS等の準備, Resource Access Manager(RAM) の Organizations 連携有効化
  2. RAMで APPサブネットを共有
  3. RDS Proxy を作成
  4. RDS Proxy の追加エンドポイントを作成

img

1. [前提] RDS 等の準備, RAMのOrganizations 連携有効化

前提として以下環境(VPC, Subnet, RDS など)は作成済みとします。

本ブログでは RDS for MySQL のDBインスタンスをターゲットとします。

img

また、次のステップで Resource Access Manager(RAM)を使用するので、 それの事前準備も済ませておきます。

管理アカウントの [AWS Organizations > サービス > RAM] にて 「信頼されたアクセスが有効」になっている状態にします。 無効になっている場合は、有効化してください。

img

2. サブネットを共有

img

RAMを使って APPサブネットを DBアカウントへ共有します。

このステップは「APPアカウント」での操作です。

[RAM > 自分が共有: リソース共有] にて [リソース共有を作成] を選択します。

img

リソース共有の名前は適当に記載します。

リソースは [サブネット] を選んで、 共有したいサブネット(= RDS Proxy エンドポイントを配置したいサブネット) を選択します。

img

ec2:Subnet のマネージド型アクセス許可 部分は選択できないので、 そのまま [次へ] を選択します。

img

アクセス権限付与先のプリンシパルとして「DBアカウント」を追加します。

img

作成内容を確認して、 [リソース共有を作成] を選択します。

作成後、サブネットのリソース共有ステータスが 関連付け済み となればOKです。

img

以下のようにDBアカウント上でも共有されたサブネットを確認できます。

img

3. RDS Proxy を作成

img

DBアカウントにて RDS Proxy を作成します。 作成はマネジメントコンソールで実施しました。

※言及していないパラメータはデフォルトのものです。

[RDS > プロキシ] にて [プロキシの作成] を選択します。

img

エンジンファミリーはターゲットのものに合わせます。 (今回は MariaDB and MySQL) プロキシ識別子は適当に記載します。

img

次にターゲットグループの設定。 データベースをプルダウンから選択します。

img

認証に使うIAMロールはプロキシ作成時に生成するようにします。 「Secrets Manager のシークレット」にはデータベースへのログインに使う認証情報を渡します。無い場合は新しいシークレットを作成しましょう。

img

今回は検証なので TLS設定は外します。 「サブネット」には RDS Proxy に関連付けるサブネットを選択します。 「セキュリティグループ」には RDS Proxy に関連付けるセキュリティグループを選択します。

  • ※1: ここのサブネット設定では「DBと同じVPCにあるサブネット」しか選択できないので、 適当にVPC内のサブネットを選択しておきます。
  • ※2: セキュリティグループ設定は、後述の補足でまとめて説明します。

img

今回は拡張ログは外します。

img

上記設定で [プロキシの作成] を選択、RDS Proxy を作成します。

4. RDS Proxy の追加エンドポイントを作成

img

先程のステップで RDS Proxy が作成されました。 その RDS Proxy に対して 「 追加のエンドポイント 」を作成することで 他のVPCへの接続も可能になります。

作成した RDS Proxy に対して [プロキシエンドポイントを作成] していきます。

プロキシエンドポイント名は適当に記入します。

img

接続設定にて RAMで共有されたサブネット を選択します。

img

作成後、以下のようにエンドポイントが2種類あることを確認します。

img

追加で作成したエンドポイントのアドレスを利用します。

補足. セキュリティグループ設定

必要なセキュリティグループ(SG)、およびその設定(インバウンドルール)は以下のとおりです。

  • クライアントSG : RDS (RDS Proxy) へ接続したいクライアント(EC2等)
  • RDS Proxy 追加エンドポイントSG : RDS Proxy の追加のエンドポイント
    • クライアントSGからのDBポート許可 を付与する
  • RDS Proxy SG : RDS Proxy
  • RDS SG : RDS
    • RDS Proxy SGからの DBポート許可 を付与する

接続テスト

APPアカウント上にEC2インスタンスを建てて、接続します。

接続には「RDS Proxy 追加のエンドポイント」のアドレスが必要です。事前にメモしておきます。

img

以下のように、DBアカウントのMySQLへ接続できることを確認できました。

db_user="example"
db_password="********"
db_endpoint="proxy-db-test-for-app.endpoint.proxy-example.ap-northeast-1.rds.amazonaws.com"

mysql --host=${db_endpoint} --user=${db_user} --password=${db_password}
# mysql: [Warning] Using a password on the command line interface can be insecure.
# Welcome to the MySQL monitor.  Commands end with ; or \g.
# Your MySQL connection id is 119
# Server version: 8.0.32 Source distribution
#  
# Copyright (c) 2000, 2023, Oracle and/or its affiliates.
#  
# Oracle is a registered trademark of Oracle Corporation and/or its
# affiliates. Other names may be trademarks of their respective
# owners.
#  
# Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#  
# mysql>

考慮点

対応しているエンジンについて

以下公式ドキュメントを確認して、 そもそも RDS Proxy のターゲットにできるかを調査する必要があります。

また 現状(2023/05/25)では、 読み取り専用のエンドポイント(リーダーエンドポイント) は Aurora クラスターのみ対象です。

コストについて

RDS Proxy 自体の料金は以下ページで確認できます。 基となる インスタンスの vCPU に応じた課金体型となっています。

また、「追加のエンドポイント」を作成すると、その分の AWS PrivateLink の料金 が掛かります。併せて確認しておきましょう。

※デフォルトのエンドポイント(RDS Proxy作成時に配置されるエンドポイント)の追加料金はありません

おわりに

RDS Proxy を使ったRDSクロスアカウントアクセスを試してみました。

以前上げた PrivateLink + NLB 版 と比べて、 よりAWSマネージドにクロスアカウントアクセスを実現できて良いと感じました。 もちろん「コスト(vCPU単位)」や「そもそもターゲットにできるか」あたりの考慮点はあるので、 事前に確認・見積もりは必要そうです。

以上、参考になれば幸いです。

参考