Amazon EC2インスタンスにSession Managerを使用して接続する手順

# 当記事の概要
当記事では、AWSのAmazon EC2インスタンス（Linuxを想定）に、Session Managerを使用して接続する手順を示します（よく手順を忘れるので備忘録的にまとめます）。


# Session Managerで接続するための条件
EC2インスタンスにSession Managerで接続するためには以下の条件を満たしている必要があります。

- SSM Agentがインストールされていること（Amazon Linux 2ではプリインストールされているので対応不要）
- EC2インスタンスに、AWS管理ポリシー `AmazonSSMManagedInstanceCore` を含むIAMロールをアタッチする
- SSMエンドポイントへのアクセスが可能

以下、上記の条件を満たすための設定手順を記載します。

# SSM Agentのインストール
SSM Agentのインストール手順はOSによって異なるため、以下リンク先の手順に沿って実施します。

[Linux 用 EC2 インスタンスに SSM Agent を手動でインストールおよびアンインストールする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/manually-install-ssm-agent-linux.html)


# IAMロールのアタッチ
まず、AWS管理ポリシー `AmazonSSMManagedInstanceCore` を含むIAMロールを作成します（なお、以下では`AmazonSSMManagedInstanceCore`のみ含むIAMロールを作成しますが、既存のIAMロールに`AmazonSSMManagedInstanceCore`を追加してもOKです）。

AWSマネジメントコンソールで、IAMを開き、画面左側メニューの「ロール」を選択します。
画面右側の「ロールの作成」ボタンをクリックします。

![2024-07-01 at 00.02.08@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/bf1c2d53-5b49-93d3-643c-2f7fa7796b37.png)


「AWSのサービス」を選択し、「サービスまたはユースケース」では「EC2」、「EC2 Role for AWS System Manager」を選択し、「次へ」ボタンをクリックします。

![2024-07-01 at 00.03.50@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/13b867c9-c712-2b47-759e-867804746b32.png)

`AmazonSSMManagedInstanceCore`があることを確認し、「次へ」ボタンをクリックします。

![2024-07-01 at 00.07.05@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/11cafd25-fe9a-5b60-14d0-5ca10ac54472.png)


「ロール名」に任意の名前を設定し、「ロールを作成」ボタンをクリックします。

![2024-07-01 at 00.08.09@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/03555028-03c1-ce3c-aefb-602aac848100.png)


次に、作成したIAMロールをEC2インスタンスにアタッチします。対象のEC2インスタンスの概要画面に遷移し、「アクション」→「セキュリティ」→「IAMロールを変更」を選択します。

![2024-07-01 at 00.43.11@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/d48f7c49-1723-baeb-145b-c10ddbf4c398.png)


作成したIAMロールを選択し、「IAMロールの更新」ボタンをクリックします。

![2024-07-01 at 00.44.52@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/a732812c-de46-0fbf-4561-1099d893b272.png)

なお、他の条件が全てクリアできている状態で、最後にIAMロールの設定を実施した場合、IAMロール設定直後はSession Managerでの接続ができません。しばらく待つ必要があるためご注意ください。


# SSMエンドポイントへのアクセスを可能とする

## EC2インスタンスがインターネットアクセスが可能な場合
セキュリティグループのアウトバウンドルールで、以下へのHTTPS(443)のアクセスを許可します。`region` はEC2インスタンスのリージョンを設定します。東京リージョンは「ap-northeast-1」、大阪リージョンは「ap-northeast-3」です。

- ssm.**region**.amazonaws.com
- ssmmessages.**region**.amazonaws.com
- ec2messages.**region**.amazonaws.com

東京リージョンの場合には以下になります。
```
ssm.ap-northeast-1.amazonaws.com
ssmmessages.ap-northeast-1.amazonaws.com
ec2messages.ap-northeast-1.amazonaws.com
```



## EC2インスタンスがインターネットアクセス不可の場合
以下を参考に設定を実施します。

[インターネットにアクセスしなくても、 VPC エンドポイントを作成して、Systems Manager でプライベート EC2 インスタンスを管理するにはどうすればよいですか?](https://repost.aws/ja/knowledge-center/ec2-systems-manager-vpc-endpoints)

VPCエンドポイントを作成するのですが、その前に必要なセキュリティグループを作成します。
インバウンドルールで以下を許容するルールを作成します。

- タイプ：HTTPS(443)
- ソース：対象VPCのCIDR（VPCによって異なる）

![2024-07-01 at 01.27.27@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/9ba824f0-56cc-7499-3e18-640dfb86bcd6.png)


次に、下記3つのVPCエンドポイントを作成します。

- com.amazonaws.**region**.ssm
- com.amazonaws.**region**.ec2messages
- com.amazonaws.**region**.ssmmessages
- com.amazonaws.**region**.s3

東京リージョンの場合には以下になります。
```
com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ec2messages
com.amazonaws.ap-northeast-1.ssmmessages
com.amazonaws.ap-northeast-1.s3
```

VPCエンドポイントは、AWSマネジメントコンソールの「VPC」サービスで、画面左側メニューの「エンドポイント」を選択し、「エンドポイントを作成」ボタンをクリックします。

![2024-07-01 at 15.08.35@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/fdab2390-05fc-025d-016f-f4ea4f016bfa.png)

エンドポイントの設定画面で、「名前タグ」に任意の名前を入力し、「サービスカテゴリ」は「AWSのサービス」を選択します。

![2024-07-01 at 15.26.00@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/448d0677-9f12-754a-9cc8-02fb3f16aa5d.png)

「VPC」には対象のVPC、「サブネット」はエンドポイントを作成するアベイラビリティーゾーン、サブネットを選択します。

![2024-07-01 at 15.26.55@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/19172ffb-854f-d1e0-d7c2-556cdecc1f45.png)

「セキュリティグループ」では先ほど作成したセキュリティグループを選択します。「ポリシー」はデフォルトのままでOKです。その後、画面下部の「エンドポイントを作成」ボタンをクリックします。

![2024-07-01 at 15.30.31@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/5cbb1288-0d56-26cf-f0d1-acef1762c2ea.png)

上記の手順を、以下3つのエンドポイントに対して実施します。

- com.amazonaws.**region**.ssm
- com.amazonaws.**region**.ec2messages
- com.amazonaws.**region**.ssmmessages

4つ目の「com.amazonaws.**region**.s3」については、エンドポイントのタイプとして「Gateway」、「Interface」が選択可能ですが、[「Gateway」を選択します](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/setup-create-vpc.html)。「Gateway」の場合、ルートテーブルの選択が必要です。（「Interface」を選択しても有料になるだけで問題はないと思います）

![2024-07-01 at 15.49.50@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/64bf36b1-b30f-0797-3757-0b2a214712b7.png)



# AWSマネジメントコンソールからの接続
対象のEC2インスタンスの概要ページで「接続」ボタンをクリックします。

![2024-07-01 at 15.58.28@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/2f68bf1e-b324-9438-cdbe-5d5cfe23fa9d.png)

「セッションマネージャー」タブを選択します。特に何もエラーが表示されていなければ接続可能な状態になっています。「接続」ボタンをクリックします。

![2024-07-01 at 15.59.23@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/fd30ce9f-d95c-2a3a-38d4-2c33061da5e6.png)

AWSマネジメントコンソールからのアクセスができました。

![2024-07-01 at 16.00.39@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/cd99a76c-be9a-49c6-ff94-a2e5f9a46f2a.png)



# ターミナルからの接続(AWS CLI)
ターミナルからSession Managerを使用してEC2インスタンスに接続するには、「AWS CLI」、および、「AWS CLIのSession Managerプラグイン」が必要です。

以下のガイドに沿って、2つをインストールしてください。

- [AWS CLIの最新バージョンのインストールまたは更新](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)
- [AWS CLI 用の Session Manager プラグインをインストールする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)


インストール後、AWSの認証情報を設定します。以下の記事を参照ください。

[【AWS】aws cliの設定方法](https://zenn.dev/akkie1030/articles/aws-cli-setup-tutorial)


設定後、以下のコマンドを実行すると、ターミナルからEC2インスタンスに接続できます。

```bash
aws ssm start-session --target <EC2インスタンスのインスタンスID>
```

# ターミナルからの接続(ssh)
Session Managerでは、ターミナルからsshを使用して接続することも可能です。また、sshでの接続ができるようになると、scpやsftpも使用可能です。このとき、**EC2側はsshのポートを開ける必要はありません**。

まずは通常のssh用の設定を実施します（秘密鍵・公開鍵の作成、サーバ側でのログインユーザの`~/.ssh/authorized_keys` への公開鍵の設定）。

ローカル端末側の `~/.ssh/config` を以下の通り設定します（以下はMacの場合の設定です）。
```
host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

上記の`ProxyCommand`の設定により、Session Managerをプロキシとしてssh接続が可能となります。

あとは普通にsshログインを実行します。
```bash
ssh -i <秘密鍵のパス> <ユーザ名>@<EC2 インスタンスID>
```

`~/.ssh/config`に `IdentityAgent` の設定を実施することで、1Passwordに保存された秘密鍵を使用することも可能です。



# 参考
- [セッションマネージャーを使って鍵ストレスの無いEC2アクセス！](https://dev.classmethod.jp/articles/ec2-access-with-session-manager/)
- [AWS Session Managerを使ってプライベートサブネット内のEC2インスタンスに接続する](https://developers.prtimes.jp/2022/11/08/aws-session-manager/)