1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS SSMセッションマネージャー経由でSSH(プロキシ下、EC2自動起動)

Last updated at Posted at 2022-10-21

AWS Systems Manager(SSM)セッションマネージャー経由でEC2インスタンスにSSH接続します。プロキシ環境下での接続方法や、SSH接続時にインスタンスを自動起動する方法も示します。

EC2インスタンスを準備する

SSH接続先のEC2インスタンスを作成します。例えば以下のようにします。

  1. VPCなどのネットワークとEC2インスタンスを作成します。(※料金を安くしたいときは、停止・再開できるスポットインスタンスを使用します)
  2. 料金を安くしたいので、毎日深夜にインスタンスを停止するようにします。EventBridgeの「EC2 StopInstances API 呼び出し」を使うのが簡単だと思います。
  3. SSMの前提条件を満たしていることを確認します。
    1. SSMエージェントがインストールされていること。(※Amazon Linux 2などにはプリインストール済み)
    2. AmazonSSMManagedInstanceCore ポリシーを含むIAMロールがインスタンスにアタッチされていること。
    3. インターネット(またはSSMサービス)へのアウトバウンド通信経路があること。

ローカル側の準備をする

Windows想定で記載します。

  1. AWS CLIをインストールします。

  2. aws configure などでAWS CLIをセットアップします。

  3. AWS CLI Session Manager Pluginをインストールします。

  4. %USERPROFILE%\.ssh\config に以下を追記します。

    .ssh\config
    Host 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サーバーが起動するまで(?)うまく動かないため,ご注意ください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?