【AWS/EC2 Instance Connect】クローズ環境のEC2インスタンスにリモート接続するオススメの方法と解説【Linux/Windows対応】

この記事は クラウドワークス グループ [Advent Calendar 2024 シリーズ4](https://qiita.com/advent-calendar/2024/crowdworks)の24日目の記事です。

# はじめに

こんにちは。インゲート株式会社でAWSエンジニアをしている@ishihara-ingateと申します。

今回はクローズド環境のEC2にOSログインする際の便利機能、「EC2 Instance Connect」についてお話させていただきます。
最初にEC2 Instance Connect の基本的な情報を記載しております。**具体的な操作方法だけ知りたいという方は後半の「【実践編】利用方法」まで読み飛ばしていただければと思います**。

さて、EC2のOSにログインする方法は多くありますが、クローズド環境にログインするとなると意外と考慮事項が多く面倒です。

例えば、クローズド環境へのOSログインは大まかに考えて以下のような方法が思いつきます。

- EC2やWorkspacesで踏み台環境を構築する
    - 追加のリソースが増加する分、管理するための負担が大きくなる
    - リソースが追加される分、費用も大きくなる
    - EC2を踏み台とする場合は完全クローズド環境ではない
- Systems Manager Session Manager や Fleet Manager からログインする
    - 追加リソースは不要だが、IAMロール設定やSystems Managerのインストール等が必要
    - クローズド環境の場合、最低でも3つのVPCエンドポイントが必要なため費用が大きくなる可能性がある

上記のように、主に費用面や管理面で考慮すべき点が出てきます。
もしそれがお客様環境となれば課題は少なくありません。
そこでオススメなのが「EC2 Instance Connect」です。

# 【解説編】EC2 Instance Connect とは

EC2 Instance Connect とはAWSマネジメントコンソールや AWS CLI から EC2 にOSログインすることができるサービスです。
ログインするまでの流れとしては Session Manager と近い印象です。
EC2 Instance Connect のより詳細な説明については以下のAWS公式資料をご覧いただくとして、この章では EC2 Instance Connect を利用するメリット/デメリットをお話できればと思います。

[EC2 Instance Connect を使用した Linux インスタンスへの接続
](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-linux-inst-eic.html)

## メリット

### メリット①：OSログイン対象のEC2インスタンスのIAMロールを考慮する必要がない

EC2 Instance Connect ではOSログイン対象のIAMロールを考慮する必要がなく、セットアップが簡単です。

たとえば、類似サービスである Session Manager ではログイン対象のIAMロールに Systems Manager 用のIAMロールを付与する必要があります。
しかし、EC2 Instance Connect は一切のIAMロールが不要です。IAMロールをアタッチする必要さえなく、当然IAMポリシーを考慮する必要がありません。

### メリット②：費用が安い

EC2 Instance Connect 自体の費用は無料です。
更に、クローズド環境で利用するために必須となる EC2 Instance Connect エンドポイントの利用料も無料です。
再掲になりますが、以下のAWS公式資料に詳細が記載されています。
※AWS内の通信で発生する費用は別途発生します。

[EC2 Instance Connect を使用した Linux インスタンスへの接続
](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-linux-inst-eic.html)

他のリモート接続サービスはどうでしょうか。

- 踏み台EC2 / Workspaces
    - 追加リソース分の利用料が発生します
- Session Manager
    - クローズド環境となるとインターフェース型VPCエンドポイントが最低でも3つ必要となり、その分の費用が発生します

以上のように EC2 Instance Connect のコストメリットは大きいです。

## デメリット

続きましてデメリットです。
当然 EC2 Instance Connect には念頭に置くべきデメリットもあります。

### デメリット①：冗長性がない

EC2 Instance Connect をクローズド環境で構築するには EC2 Instance Connect エンドポイントが必須です。
このエンドポイントは Session Manager などの利用時に作成するVPCエンドポイントと異なり、複数個作成して冗長化することができません。
そのため、Session Manager と比較すると冗長性が低いと言えます。

お客様環境に導入する場合、障害発生時の対応については考慮する必要があります。

### デメリット②：ファイル転送が不可な場合がある

EC2 Instance Connect は正確には画面描写によるOS操作です。
※Session Manager も同じ

そのため、OSへ直接ファイル転送を実施することが不可な場合があります。
お客様環境に構築する場合には運用を考慮する必要が出てくる可能性があります。

## メリット / デメリット まとめ

以上が EC2 Instance Connect を利用する上でのメリット/デメリットです。
デメリットも当然ありますが、デメリットが許容されるお客様であれば導入するメリットは大きいと言えます。

以下に各リモート接続サービスをまとめてみました。

|**【比較項目】**|**【踏み台サーバー】**|**【Session Manager】**|**【EC2 Instance Connect】**|
|---|---|---|---|
|管理|×：負荷大|〇：負荷少|〇：負荷少|
|コスト|×：費用大|×：費用大|〇：費用少|
|冗長性|〇：冗長化可能|〇：冗長化可能|×：冗長化不可|

# 【実践編】利用方法

ここまで長々と EC2 Instance Connect について語らさせていただきました。
ここからは具体的な構築方法についてお話いたします。

## 下準備

まずは下準備です。
ログイン対象のOSにより準備する内容が異なりますが、ひとまず共通で必要な準備を記載します。

EC2 Instance Connect 構築に必要なリソースを以下に記載します。

### 1. IAMユーザー設定

EC2 Instance Connect はAWSコンソールや AWS CLI から利用するので、AWS自体のログインに使用するユーザーのIAMポリシーを考慮する必要があります。
具体的には以下のAWS公式資料に記載がありますが、 ```AdministratorAccess```や ```PowerUserAccess```を設定しているユーザーであれば追加の考慮は不要です。

[IAM への EC2 Instance Connect のアクセス許可の付与](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-configure-IAM-role.html)

### 2. クローズドなVPC / Subnet

今回はクローズド環境想定なので、Internet Gateway への出口がない VPC / Subnet をご用意ください。

### 3. EC2 Instance Connect エンドポイント

クローズド環境で利用する場合には EC2 Instance Connect 専用のエンドポイントが必要です。
構築方法は至ってシンプルです。
AWSマネジメントコンソール上で以下の操作を実施します。

- 1. VPCコンソール画面から「エンドポイント」に移動し、「エンドポイントを作成」をクリックする

- 2. 「エンドポイントを作成」画面が表示されたら以下を設定する
    - <名前タグ>：任意のエンドポイント名を設定
    - <タイプ>：EC2インスタンス接続エンドポイント
    - <ネットワーク設定>：構築先のVPCを指定
    - <セキュリティグループ>：設定するセキュリティグループ（設定内容は後述）
    - <サブネット>：構築先サブネットを指定

![スクリーンショット 2024-12-22 221030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947909/e1acffcb-b483-7919-2e84-85d0353708a3.png)
![スクリーンショット 2024-12-22 221404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947909/dcd3e0f4-bdb6-72bd-3499-a2dbc6b87264.png)

## Linux 編 (SSH接続)

ここからはOSごとに操作が異なります。
WindowsへRDPされる方は「Windows 編 (RDP接続)」まで読み飛ばしてください。

以下に EC2 Instance Connect を利用したLinuxへのSSHログイン手順を記載します。

### 1. Security Group

EC2と EC2 Instance Connect エンドポイントに Security Group の設定が必要です。
EC2と EC2 Instance Connect エンドポイント間で以下の通信が許可されるように Security Group を設定してください。

|**【対象リソース】**|**【Inbound許可】**|**【Outbound許可】**|
|---|---|---|
|SSH対象EC2|port 22 (SSH)|※設定不要|
|EC2 Instance Connect Endpoint|※設定不要|port 22|


### 2. コンソール操作からOSログイン

ここまで準備ができたら後は簡単です。
以下の手順通りAWSマネジメントコンソールを操作してください。

- EC2コンソール画面よりログイン対象のEC2を選択、「接続」をクリック
- 「EC2 Instance Connect」タブを選択し、以下のように設定する
    - <EC2 Instance Connectエンドポイントを使用して接続する>：クリックして選択する
    - <EC2 Instance Connectエンドポイント>：事前に作成したエンドポイントを選択する

![スクリーンショット 2024-12-22 222214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947909/21ccba4d-3274-03af-02e1-c0b3829144a2.png)


## Windows 編 (RDP接続)

ここからは EC2 Instance Connect を利用してWindowsにRDPする際の操作方法を解説します。
LinuxにSSHされる方は「Linux 編 (SSH接続)」をご覧ください。

以下に EC2 Instance Connect を利用したWindowsへのRDPログイン手順を記載します。

### 1. Security Group

EC2と EC2 Instance Connect エンドポイントに Security Group の設定が必要です。
EC2と EC2 Instance Connect エンドポイント間で以下の通信が許可されるように Security Group を設定してください。

|**【対象リソース】**|**【Inbound許可】**|**【Outbound許可】**|
|---|---|---|
|RDP対象EC2|port 22 (SSH)<br>port 3389 (RDP)|※設定不要|
|EC2 Instance Connect Endpoint|※設定不要|port 22 (SSH)<br>port 3389 (RDP)|

※対象のWindows対してRDP接続のみ利用し、SSH接続を利用しない場合でもport 22を許可しておく必要がある点は注意です。

### 2. AWS CLI の設定

AWS CLI で対象のアカウントを操作できるようにしておく必要があります。
初回セットアップ時は少々面倒ですが、一度セットアップしてしまえば永久に利用できますし、別の機会に他アカウントを AWS CLI で操作する必要が出てきた場合にもカスタマイズは容易なので、この機会にセットアップしてしまいましょう。

ここでは詳細な手順の説明は省略しますが、大まかな手順は以下です。

#### ①AWS CLI のインストール

端末に AWS CLI をインストールします。
以下のAWS公式資料を参照いただきインストールしてください。

[AWS CLIの最新バージョンへのインストールまたは更新](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)

#### ②AWS CLI の権限設定

インストールした AWS CLI からAWSを操作できるように権限設定を入れます。
以下のAWS公式資料を参照いただき権限設定を実施してください。

[AWS CLIのセットアップ](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-quickstart.html)

※
公式資料だと読み解きづらい場合は「aws cli 設定」等のキーワードで検索すると丁寧に解説してくださっている方のブログが見つかりますので、そちらを参考にしてみても良いかと思います。

### 3. OSログイン手順

Linuxと異なり、Windowsの場合は一手間必要です。
最初は少し戸惑うかと思いますが、一度マスターしてしまえば非常に簡単な方法なので是非実施してみてください。

以下に操作方法を記載します。

#### ①AWS CLI でコマンド実行

AWS CLI 設定済のコマンドプロンプトやPowerShellで以下のコマンドを実行してください。

```
aws ec2-instance-connect open-tunnel --instance-id <RDP対象のEC2インスタンスID> --remote-port 3389 --local-port <任意の空きポート番号>
```

- RDP対象のEC2インスタンスID：
    - ここにはログイン対象となるEC2のインスタンスIDを入れます
- 任意の空きポート番号：
    - 任意の番号で良いのですが、ここではわかりやすく ```port 13389```としたいと思います。

上記のコマンドに成功すると以下のような文言が表示されます。

```
Listening for connections on port 13389.
```

#### ②RDPでEC2インスタンスにログイン

ここまで進めれば後はリモートデスクトップでログインするだけです。
リモートデスクトップ画面を開き、 ```localhost:13389```で接続を開始してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947909/f8250d08-8e37-459a-c216-86cb19df1bca.png)

接続が開始されたらEC2に設定されたら、AWSマネジメントコンソール上から秘密鍵を使用して確認できるユーザー名とパスワード入力すればログイン完了です。

# まとめ

EC2 Instance Connect は手軽に構築できる上に、Linux / Windows に対応している便利機能です。
お客様の本番環境に構築する際には様々考慮すべき点はありますが、例えば自社の検証環境や、お客様環境への対応作業でスポット的にOSログインが必要になった場合にはかなり便利だと思います。

Session Manager 以外の選択肢として是非知っておいていただければと思います。
最後までお読みいただきありがとうございました。