セッションマネージャーで簡単・安全にプライベートサブネットのEC2にアクセスする方法

## はじめに
プライベートサブネットに配置されたEC2インスタンスは、インターネットから直接アクセスできません。

このような場合、AWS Systems Managerのセッションマネージャーを使用することで、セキュアにインスタンスへ接続することが可能です。

本記事では、セッションマネージャーを利用してプライベートサブネットのEC2インスタンスに接続する方法を解説します。

## 知識整理
### セッションマネージャーとは
AWS Systems Managerの機能の一つで、ブラウザやAWS CLIを使ってEC2インスタンスに対してシェル接続を行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5676a271-fda8-e9ec-9efb-ad56d1598fe9.png)
引用画像：https://developers.prtimes.jp/2022/11/08/aws-session-manager/

EC2インスタンスへのアクセスに際しては、SSH鍵や踏み台サーバーが不要で、AWSのセキュリティグループ設定の簡素化にも繋がります。

## 前提条件

:::note
**前提条件は以下の通りです。詳細は後述の手順で解説します。**
**・AWS Systems Managerエージェント（SSMエージェント）のインストール**
Amazon LinuxやUbuntuなどのAMIには、デフォルトでSSMエージェントがインストールされています。インストールされていない場合は、手動でインストールが必要です。

**・IAMロールの設定**
EC2インスタンスに、以下の権限を持つIAMロールを付与します。
```
・AmazonSSMManagedInstanceCore ポリシー
```
**・ネットワーク接続**
セッションマネージャーはAWS Systems Managerと通信するため、EC2インスタンスからインターネットまたはVPCエンドポイントを介してSSMサービスにアクセスできる必要があります。
:::

## 実装手順
### ステップ1: EC2インスタンスの作成
AWS管理コンソールで「EC2」ダッシュボードにアクセスし、「インスタンスの起動」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/bd30fda6-4901-0c5d-9d96-6a64cbcf2da1.png)

名前を「test-ec2」に設定し、使用するAMIとインスタンスタイプを選びます。セッションマネージャーを利用するため、キーペアなしで進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/16380f08-2327-83fc-0eeb-5cd87b86dcb9.png)

次に、ネットワーク設定でVPCとプライベートサブネットを選択し、インバウンド通信を許可しない（明示的には何も許可しない）セキュリティグループを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3a0ca344-f865-40ee-7732-e9a26af7a03f.png)

「インスタンスを起動」をクリックして作成完了です。

### ステップ2: IAMロールの作成
AWS管理コンソールで「IAM」サービスを開き、「ロール」を選択し、ロールを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2c01eca9-22d8-ebbc-1983-2d039b681ac2.png)

「AWSサービス」→「EC2」を選び、「**AmazonSSMManagedInstanceCore**」ポリシーをアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a96e27a2-c6b0-8896-8dff-45d02faa44f6.png)

名前を入力して「ロールの作成」をクリックします。ここでは「test-ec2」というロール名で作成しています。

### ステップ3: EC2インスタンスにIAMロールをアタッチ
「EC2」サービスで対象インスタンスを選択し、「アクション」→「セキュリティ」→「IAMロールの変更」で先ほど作成したロールを選び、「IAMロールの更新」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f4effbc5-0cdc-516e-302b-4f36440c6be8.png)

先ほど作成した「test-ec2」のIAMロールをEC2インスタンスにアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6e4625c1-dacf-5fb0-aa5f-93beee5d28bb.png)

### ステップ4: VPCエンドポイントの作成

まず、VPCエンドポイント用のセキュリティグループを作成します。AWS管理コンソールで「VPC」サービスに移動し、左側のメニューから「セキュリティグループ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5270b856-b541-2291-63e0-43c31a9b016a.png)

「セキュリティグループを作成」をクリックし、名前と説明を入力します。次に、インバウンドルールでHTTPS（ポート443）を追加し、許可するIP範囲を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ef73c35c-06b3-62ab-016e-b87bb4ff244b.png)

設定が完了したら、「セキュリティグループを作成」をクリックして保存します。セキュリティグループが作成できたら、次にVPCエンドポイントを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ecb030de-4fc7-ddc0-6b31-161be93cf4ac.png)

「VPC」サービスで「エンドポイント」を選び、「エンドポイントの作成」をクリックします。

サービス検索欄に「ssm」と入力し、「**com.amazonaws.ap-northeast-1.ssm**」を選択します(一番上です)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/dfacb5a0-0b79-5fd9-87f6-b3bb8df059a5.png)

続いて、適切なVPCとプライベートサブネットを選択します。事前に作成したVPCとプライベートサブネットを確認して選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5ce02e39-d6c7-5584-d2dd-4946c1cc6911.png)

次に、先ほど作成したセキュリティグループを適用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ca3df41f-cb5a-da2a-971e-c68feb788afb.png)

**※選択したAZ分料金が発生するので、使用しないものにはチェックをつけないようにしてください。**


「エンドポイントの作成」ボタンをクリックして完了です。

:::note warn
**同様の手順で「com.amazonaws.ap-northeast-1.ec2messages」と「com.amazonaws.ap-northeast-1.ssmmessages」のエンドポイントも作成してください。**
:::

サービスの検索バーで「**com.amazonaws.ap-northeast-1.ec2messages**」と入力して作成すると便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d444604c-aed9-1f64-c60a-b16abedccc23.png)

サービスの検索バーで「**com.amazonaws.ap-northeast-1.ssmmessages**」と入力して作成すると便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/de1a5b46-aaac-4382-b61d-041085858532.png)

すべてのエンドポイントを作成後、合計3つのVPCエンドポイントが作成されていることを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f1f9fcab-d473-6bbc-fc98-711063145da3.png)

## 接続確認

「EC2」ダッシュボードで対象インスタンスを選び、「接続」→「セッションマネージャー」を選択して接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f7349014-4630-11ae-3ab9-a652babd16e7.png)

セッションマネージャータブから接続ボタンをクリックして、ターミナルに画面が遷移することを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/58cdbbee-c502-e39c-c62d-0ed055920b8f.png)

これで、パブリックIPやSSHキーなしで、プライベートサブネット内のインスタンスにアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c168ef65-2f13-9f23-014f-43f16393427b.png)

:::note warn
**最後に、セッションマネージャーの最大の魅力は以下の点です。**
・パブリックIPアドレスやSSHキーを必要とせず、安全にインスタンスにアクセスできる
:::

## まとめ
AWSのセッションマネージャーを使用することで、プライベートサブネット内のEC2インスタンスにセキュアかつ簡単にアクセスできるようになります。

これにより、踏み台サーバーの管理やSSH鍵の配布が不要となり、運用の効率化やセキュリティの向上に繋がります。

特に、インターネットアクセスが制限された環境下でのメンテナンスやトラブルシューティングに有用です。

## おまけ：踏み台サーバーを利用した接続方法
踏み台サーバー（Bastionサーバー）を使うことで、プライベートサブネット内のEC2インスタンスにアクセスすることも可能です。

踏み台サーバーはパブリックサブネットに配置し、そこからSSH経由でプライベートサブネットのインスタンスに接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/bcf0c401-452a-8791-c69f-74484f2c9c33.png)
引用画像：https://developers.prtimes.jp/2022/11/08/aws-session-manager/

この方法はセッションマネージャーを使わずにアクセスする場合に便利です。

## 参考文献

https://developers.prtimes.jp/2022/11/08/aws-session-manager/

https://zenn.dev/kazutech/articles/3559db9605d198