スイッチロール先のアカウントにあるRDSにローカルPCから接続

ローカルPCからスイッチロール先のRDSにSSMポートフォワードを使って接続する
2021.10.15

こんにちは!
AWS事業本部コンサルティング部の繁松です!

お客様から「スイッチロール先アカウントにあるRDSにローカルから接続したい」というお話がありましたので、
ローカルPCからEC2(踏み台サーバ)間をセッションマネージャーポートフォワードを使って、EC2(踏み台サーバ)からRDS間をソケット通信リレーで、ローカルPCからprivate環境にあるRDSへの接続を行います!

構成図

前提

  • アカウントAからアカウントBにスイッチロールができる
  • EC2(踏み台サーバ)はAmazon Linux 2
  • スイッチロール先のアカウントにEC2(踏み台サーバ)からのみアクセスできるRDSがあり、ローカルPCから接続したい

※ロールの権限は必要に応じて変更してください。

今回は以下のように考えて進めます。

アカウント名 用途 アカウントID IAMユーザー名 IAMロール名
アカウントA 踏み台AWSアカウント 999999999999 accountAuser なし
アカウントB システム側のAWSアカウント 000000000000 なし accountBrole

事前準備、確認

IAMユーザー、スイッチロールの設定

アカウントBのロールにセッションマネージャー接続が可能な権限があることを確認します。
今回は以下の権限を追加しました。

  • AmazonSSMFullAccess

MFAが有効化されているユーザーを使用する場合、ローカルPCのAWS CLI configには以下のようにスイッチロール先の設定を記載します。
profile名はaccountBで設定しています。

[profile accountB]
role_arn = arn:aws:iam::<AWSアカウントBのアカウント番号>:role/accountBrole
source_profile = accountA
mfa_serial = arn:aws:iam::<AWSアカウントAのアカウント番号>:mfa/accountAuser

EC2(踏み台サーバ)

アカウントBにあるEC2(踏み台サーバ)へ接続する準備をします。

  • VPCエンドポイント作成
    今回private環境なので、以下のVPCエンドポイントを作成します。

    • com.amazonaws.ap-northeast-1.ssmmessages
    • com.amazonaws.ap-northeast-1.ec2messages
    • com.amazonaws.ap-northeast-1.ssm
  • ロールに権限追加
    EC2(踏み台サーバ)のロールにセッションマネージャー接続が可能な権限を追加します。
    今回は以下の権限を追加しました。

    • AmazonSSMManagedInstanceCore

EC2(踏み台サーバ)に各種インストール

ローカルPCからEC2(踏み台サーバ)に接続しsocatのインストールと、セッションマネージャーのバージョン確認を行います。 ローカルPCのAWS CLIはaccountAのユーザーに切り替え以下のコマンドを実行していきます。

接続コマンド
[ローカルPCから実行]

$ aws ssm start-session --target <踏み台サーバのEC2インスタンスID> --region ap-northeast-1 --profile accountB
  • socatのインストールを実施
    EC2(踏み台サーバ)とRDSのソケット通信リレー用にsocatをインストールします。

[接続先のEC2(踏み台サーバ)から実行]

$ sudo yum install socat -y

  • セッションマネージャーのバージョン確認
    System Managerエージェントのバージョンが 2.3.672.0 以上である必要があります。
    以下のコマンドで確認します。
    [接続先のEC2(踏み台サーバ)から実行]
$ yum info amazon-ssm-agent
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Installed Packages
Name        : amazon-ssm-agent
Arch        : x86_64
Version     : 3.1.338.0

RDS

  • セキュリティグループの確認
    EC2(踏み台サーバ)のセキュリティグループから3306ポートの接続が許可されていることを確認します。

ローカルPC AWS CLI

  • セッションマネージャー用プラグインのインストール ローカルPCのAWS CLIにセッションマネージャー用のプラグインをインストールします。
    こちらは環境にあわせてインストールしてください。

接続

準備が整ったので接続していきます。
各手順毎にコンソールを起動するので、手順1用、2用、3用で計3つ起動します。

1. ローカルPCからEC2(踏み台サーバ)間をセッションマネージャーポートフォワード

まず以下のコマンドでローカルPCからEC2(踏み台サーバ)間をセッションマネージャーポートフォワードさせます。

[ローカルPCから実行]

$ aws ssm start-session --target <踏み台サーバのEC2インスタンスID> --profile accountB --region ap-northeast-1 \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["3306"],"localPortNumber":["33060"]}'

2. EC2(踏み台サーバ)からRDS間をソケット通信リレー

次にEC2(踏み台サーバ)からRDS間をソケット通信リレーさせます。
EC2(踏み台サーバ)に接続します。

接続コマンド
[ローカルPCから実行]

$ aws ssm start-session --target <踏み台サーバのEC2インスタンスID> --region ap-northeast-1 --profile accountB

socatコマンド
[接続先のEC2(踏み台サーバ)から実行]

$ socat tcp4-listen:3306,reuseaddr,fork TCP:RDSのDNS:3306

3. RDSに接続

RDSに接続してみます。
[ローカルPCから実行]

$ mysql -u root -D db -h 127.0.0.1 -P 33060 -p

これで繋がればOKです。

4. MySQL Workbenchを使って接続

MySQL Workbenchを使って接続してみます。

以下の内容で設定します。
hostname:127.0.0.1
ポート:33060

繋がりました

さいごに

ローカル環境からスイッチロール先のprivate環境に接続するセッションマネージャーポートフォワードとsocatを使って接続してみました。
private環境への接続は悩むところだと思うので、お役に立てれば光栄です!

参考

参考にさせて頂きありがとうございます!