背景: MySQL8へのアップグレードに合わせてSequelProからSequelAceに変更したら接続できなくなった話
1. VPCのプライベートサブネットにあるEC2インスタンスを踏み台にしてssh/ssmでRDSに接続していた。(SequelPro)
.ssh/config
# SSH over Session Manager
Host AWSEC2
HostName インスタンスID
User ec2-user
IdentityFile ~/.ssh/キーペア.pem
ProxyCommand sh -c "PATH=$PATH:/usr/local/bin/ && aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
2. MySQL5.7を8.0.28へアップグレード
3. SequelProがMySQL8に対応していないため、[SequelAce](https://github.com/Sequel-Ace)に変更
4. aws cliの権限がなく接続できず…
エラー
Used command: /usr/bin/ssh -v -N -S none -o ControlMaster=no -o ExitOnForwardFailure=yes -o ConnectTimeout=10 -o NumberOfPasswordPrompts=3 -o UserKnownHostsFile="/Users/ユーザー名/.ssh/known_hosts" -F /Users/ユーザー名/.ssh/config -o TCPKeepAlive=no -o ServerAliveInterval=60 -o ServerAliveCountMax=1 AWSEC2 -L 49895:hogehoge-aurora-cluster.cluster-ro-xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306
OpenSSH_9.0p1, LibreSSL 3.3.6
debug1: Reading configuration data /Users/ユーザー名/.ssh/config
debug1: /Users/ユーザー名/.ssh/config line 2: Applying options for AWSEC2
debug1: Authenticator provider $SSH_SK_PROVIDER did not resolve; disabling
debug1: Executing proxy command: exec sh -c "PATH=$PATH:/usr/local/bin/ && aws ssm start-session --target インスタンスID --document-name AWS-StartSSHSession --parameters 'portNumber=22'"
debug1: identity file /Users/ユーザー名/.ssh/キーペア.pem type -1
debug1: identity file /Users/ユーザー名/.ssh/キーペア.pem-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_9.0
sh: /usr/local/bin/aws: Operation not permitted
kex_exchange_identification: Connection closed by remote host
Connection closed by UNKNOWN port 65535
SSHトンネルは予期せず閉鎖されました。
5. SequelAceにフルディスクアクセスを設定してみても改善せず…
6. SequelAce公式にもissueはいくつか上がっていたが解決できていなさそう。Qiitaなども漁ってみたがダメだった…
おそらくの原因
SequelAceがSandboxで動いているから( <https://sequel-ace.com/get-started/> )
Sandbox上で動いているであろうターミナル?に権限を付与できないとおそらくaws cliが利用できない。(仮想環境に疎くこれ以上わかっていない)
解決した方法
踏み台EC2の22番ポートをSSMでローカルにポートフォワーディングした
1. .ssh/configをローカルホストに変更(ポートは適当)
.ssh/config
# SSH LocalPortForward
Host TESTHOST
HostName localhost
User ec2-user
Port 10022
IdentityFile ~/.ssh/キーペア.pem
2. aws cliのssmでポートフォワーディング(.ssh/configのポートと合わせる)
ターミナルで↓コマンド
aws ssm start-session --target インスタンスID --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["22"],"localPortNumber":["10022"]}'
↓ ↓ ↓ ↓ ↓ ↓
Starting session with SessionId: hogehoge-foo-xxxxxxxxxxxxxxxx
Port 10022 opend for sessionId hogehoge-foo-xxxxxxxxxxxxxxxx .
Waiting for connections...
3. SequelAceのSSH Hostを.ssh/configのホスト名(`TESTHOST`)にして「Connect」で接続できればOK。接続できるとSSMのログに↓が出力。
Connection accepted for session (hogehoge-foo-xxxxxxxxxxxxxxxx)