AWS Systems Manager(SSM)セッションマネージャー経由でEC2インスタンスにSSH接続します。プロキシ環境下での接続方法や、SSH接続時にインスタンスを自動起動する方法も示します。
EC2インスタンスを準備する
SSH接続先のEC2インスタンスを作成します。例えば以下のようにします。
- VPCなどのネットワークとEC2インスタンスを作成します。(※料金を安くしたいときは、停止・再開できるスポットインスタンスを使用します)
- 料金を安くしたいので、毎日深夜にインスタンスを停止するようにします。EventBridgeの「EC2 StopInstances API 呼び出し」を使うのが簡単だと思います。
- SSMの前提条件を満たしていることを確認します。
- SSMエージェントがインストールされていること。(※Amazon Linux 2などにはプリインストール済み)
-
AmazonSSMManagedInstanceCore
ポリシーを含むIAMロールがインスタンスにアタッチされていること。 - インターネット(またはSSMサービス)へのアウトバウンド通信経路があること。
ローカル側の準備をする
Windows想定で記載します。
-
AWS CLIをインストールします。
-
aws configure
などでAWS CLIをセットアップします。 -
AWS CLI Session Manager Pluginをインストールします。
-
%USERPROFILE%\.ssh\config
に以下を追記します。.ssh\configHost remote User ec2-user HostName i-xxx IdentityFile <秘密鍵のパス> ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "$env:HTTPS_PROXY = 'http://proxy.example.com:8080'; $env:AWS_PROFILE = '<AWSプロファイル名>'; (aws sts get-caller-identity) -or (aws sso login); aws ec2 start-instances --instance-ids %h; aws ec2 wait instance-running --instance-ids %h; aws ssm start-session --target %h --document-name AWS-StartSSHSession"
クソ長ProxyCommandの解説
まず、公式ガイドでは、セッションマネージャー経由でSSH接続するには .ssh\config
に以下のように追記するよう案内されています。
# SSH over Session Manager
host i-* mi-*
ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"
これをベースに、いろいろ追加して ProxyCommand
を以下のようにしました。皆さんの環境に応じてコマンドを取捨選択・変更してください。
# プロキシ環境下の場合は、環境変数でプロキシを設定します。
$env:HTTPS_PROXY = 'http://proxy.example.com:8080'
# 毎回 `--profile <AWSプロファイル名>` と書くと長いので、環境変数で設定します。
$env:AWS_PROFILE = '<AWSプロファイル名>'
# 私はAWS SSOを使っているので、ログインできていない場合はログインします。
(aws sts get-caller-identity) -or (aws sso login)
# 普段インスタンスを停止しているので、起動します。
aws ec2 start-instances --instance-ids %h
# インスタンスの起動を待ちます。
aws ec2 wait instance-running --instance-ids %h
# SSHセッションを開始します。
aws ssm start-session --target %h --document-name AWS-StartSSHSession
スマートな方法なのか分かりませんが、これで期待どおり動きました。
SSH接続する
PowerShellで ssh <Host名>
で接続します。
ssh remote
インスタンスの起動が入る場合は、接続するまでに30秒ほど掛かります。
リモート開発する
もちろん、Visual Studio Codeでリモート開発することもできます。詳細は、以下の参考ページなどをご覧ください。
SSH接続時にインスタンスの起動が入る場合は、接続確立後もインスタンスのVisual Studio Codeサーバーが起動するまで(?)うまく動かないため,ご注意ください。