Session Managerとは

AWSのEC2インスタンスにリモート接続するための方法はいくつかあるが、その中の1つにSession Manager がある。

Session Managerを使うとSSH接続するためのポートを開ける必要がなく、認証をIAMロールで行なえるようになる。

Session Managerでのリモート接続

Session Managerによるリモート接続はAWS CLIを使って以下のように行なう。

$ aws ssm start-session --target インスタンスID

このように接続するとSSHのようにリモートでコマンドを実行できるようになる。
しかし使い慣れたSSHと多少の違いがある。
例えば、手元の環境ではctrl+yの入力で接続が切断される。
切り取った文字列を貼り付けるための手癖で入力してしまい、意図せず切断してしまうため不便となる。

そこでSSHで接続できるようにする。

Session Managerを通したSSH接続

Session Managerを通してSSH接続ができるようにすると以下のようなメリットがある。

  • Session Managerで認証するためSSHのポートを開ける必要がない
  • 使い慣れたSSHでリモート接続できる

以降ではSession Managerを通してSSH接続するための設定方法を説明する。

Session Managerを有効化する

Session Managerを使うためにはEC2インスタンスに対して以下の4つの設定が必要になる。

  • セキュリティグループの設定
  • SSMエージェントのインストール
  • EC2インスタンスのインスタンスプロファイル(IAMロール)の設定
  • EC2インスタンスに公開鍵を置く(~/.ssh/authorized_keys)

【Terraform】Session Manager でログイン可能な EC2 を建てるTerraformでSession Managerを有効化するためのコードを記載している。

ポイントとしては以下の3つ。

セキュリティグループ

EC2に付加するセキュリティグループへアウトバウンドの443ポートを許可する設定を行なう。

アウトバウンドルール

EC2インスタンスにSession Manager Agentをインストールする

接続したいEC2インスタンスに対してSSMエージェントをインストールする。

CentOS・Rocky Linuxの場合。

$ sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
$ sudo systemctl enable amazon-ssm-agent --now

AMIによってはSession Manager Agentがプリインストールされている場合もある。
その場合はこのステップをスキップしてよい。

EC2インスタンスのインスタンスプロファイル(IAMロール)の設定

EC2インスタンスに対してAmazonSSMManagedInstanceCoreポリシーを必要とする。

IAMロールを作成し、許可ポリシーにAmazonSSMManagedInstanceCoreを追加する。

許可ポリシー

信頼関係(信頼されたエンティティ)はEC2とする。

信頼関係

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

EC2インスタンスに公開鍵を設置する(~/.ssh/authorized_keys)

EC2インスタンスの接続したいユーザーの~/.ssh/authorized_keysに公開鍵を設置する。

例えばec2-userというユーザーであれば/home/ec2-user/.ssh/authorized_keysに公開鍵を設置する。 (ec2-userはEC2側のユーザー)

確認

EC2インスタンスに対してSession Managerの設定が正常に行なわれているか確認する。

AWSコンソールのEC2のページから対象のEC2インスタンスを選択し、接続をクリックする。

以下のような画面が表示されれば設定は正常に行なわれている。

設定を確認

設定に不備がある場合は以下のようにエラーが表示される。

設定に不備がある場合

SSHで接続する

設定(~/.ssh/config)

Session Managerを通してSSHするには~/.ssh/configに以下の設定を追加する。

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

SSHの実行方法

ホスト名の代わりにインスタンスIDで接続する。

$ ssh インスタンスID -l ec2-user

内部でAWS CLIを実行しているので~/.aws/credentialにアクセスキーを設定しておくなど、認証情報を渡してあげる必要がある。

例えばAWS_PROFILE環境変数を指定して以下のように実行すると接続できる。

$ AWS_PROFILE=プロファイル名 ssh インスタンスID -l ec2-user

SCPの実行方法

SSHができるようになればSCPも可能となる。
SSHと同様にホスト名の代わりにインスタンスIDで接続する。

$ AWS_PROFILE=プロファイル名 scp somefile.txt ec2-user@インスタンスID: