AWSのPrivate Subnetに配置したRDSになるべく持続的リソースを使わずに直接コマンドラインからアクセスする
大変混乱したのでメモします。
助言ありがとうございます!
@ncaq
— 窓際じゃなくなった眼鏡さん (@calkinos) October 12, 2020
aws上のec2に
ec2-instance-connect とssm-agentがインストールされていて、
AmazonEC2RoleForSSMあたりがアタッチされたroleをinstance profileとして設定されていれば
できました(試したのは amazon-linux2ですが)https://t.co/qd40m7PBgN
踏み台サーバを建てる
class BastionHostLinux (construct) · AWS CDK
と言う誂え向きのものがあるのでこれにvpcを他のスタックから持ってきて設定すると良さそう。最初からSSMの管理下になってくれます。
AWS System Managerセッションマネージャーだけではフォワーディングできない
これ大変混乱したのですが、
リモートサーバーからアクセス可能な別サーバーのポートはフォワードできないことにご注意ください(SSH ポートフォワードで言うところの $ ssh -L 9999:MySQL:3306 user@SERVER)。例えば、EC2を踏み台にして、RDS に接続することはできません。
とあるように、 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