• 作成:

AWSのPrivate Subnetに配置したRDSになるべく持続的リソースを使わずに直接コマンドラインからアクセスする

大変混乱したのでメモします。

助言ありがとうございます!

踏み台サーバを建てる

class BastionHostLinux (construct) · AWS CDK

と言う誂え向きのものがあるのでこれにvpcを他のスタックから持ってきて設定すると良さそう。最初からSSMの管理下になってくれます。

AWS System Managerセッションマネージャーだけではフォワーディングできない

これ大変混乱したのですが、

リモートサーバーからアクセス可能な別サーバーのポートはフォワードできないことにご注意ください(SSH ポートフォワードで言うところの $ ssh -L 9999:MySQL:3306 user@SERVER)。例えば、EC2を踏み台にして、RDS に接続することはできません。

AWS System Managerセッションマネージャーでポートフォワードする | Developers.IO

とあるように、 SSMではRDSに接続出来ません。

下手にAWS-StartPortForwardingSessionがあるから使おうと頑張ってしまいました。

Starting session with SessionId: ncaq-0b20c944783c081b8
Port 33133 opened for sessionId ncaq-0b20c944783c081b8.
Session: ncaq-0b20c944783c081b8 timed out.

みたいなことを延々言われるだけでエラーメッセージも得られません…

sshを実行する必要があります。

クライアントPCにSession Manager Pluginをインストール

(オプション) AWS CLI 用の Session Manager Plugin をインストールする - AWS Systems Manager

にはGentoo用の設定が書かれていませんが、 app-arch/rpmを使って、 rpm -Uvh --nodeps session-manager-plugin.rpm のように実行すれば普通にインストール出来ます。

ssh設定を記述

ステップ 8: (オプション) Session Manager を通して SSH 接続を有効にする - AWS Systems Manager に書いているように、 ~/.ssh/config

host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

などと記述しましょう。

公開鍵を送りつける

CDK(CloudFormation)で作成したサーバの証明書を得ることは出来ません。

ssh-keygenなどで作った公開鍵を送りつけることが出来るのでsshする前に毎回送りつけましょう。有効期限は1分ほどのようです。

aws ec2-instance-connect send-ssh-public-key --instance-os-user ec2-user --availability-zone ap-northeast-1a --ssh-public-key file:///鍵.pub --instance-id 作成したインスタンスid

sshポートフォワーディングする

ssh -i 鍵 ec2-user@作成したインスタンスid -L 5432:RDSのエンドポイント:5432

接続する

これで接続できます。

psql -h localhost --port=5432 --username=username