VSCodeからAWSプライベートEC2へセキュア接続(不具合あり)

# 事前検討

普通に考えたらAWS VPNが良いと思います。ただ微妙に高いので、、、、、

なぜか無駄にそれ以外の方法を試してみた記録です。
ただし、一部不具合があり不完全な方法になっています。
何か設定を間違ているが、何が間違っているか不明です。。。。。

# 接続経路の概要

- SSM SessionManagerの使えるEC2を用意する
- アクセスキーや秘密鍵を準備
- ローカル端末側にAWS CLIを導入する
- SSM SessionManager経由でプライベートなEC2にアクセスする

## うまくいかない

通常StartPortForwardingSessionでVSCodeが直接EC2にアクセスできるはずが、
2段階でのアクセスになっています。
1. StartPortForwardingSession起動
1. SSHアクセス

# SSM SessionManagerでアクセスする用のEC2の準備

EC2作るのはGUIでサクサクと、その後にロール付与とセキュリティグループの設定

## IAMロールの付与

AWS Systems Manager Session Managerを使用するためには、対象のEC2インスタンスには、SSM APIを呼び出すための適切なIAMロールが必要です。このロールは、通常「AmazonSSMManagedInstanceCore」という管理ポリシーを持つIAMロールをインスタンスに関連付けることで作成できます。

GUIでAWS Management Consoleを使用してEC2インスタンスにIAMロールを関連付けるには、以下の手順を実行します：

1. AWS Management Consoleにサインインします。
2. 「サービス」メニューから「EC2」を選択します。
3. 左側のナビゲーションパネルで「インスタンス」を選択します。
4. IAMロールを関連付けたいインスタンスを選択します。
5. 「アクション」メニューから「セキュリティ」を選択し、「IAMロールの変更」をクリックします。
6. 「IAMロール」ドロップダウンメニューから、関連付けたいロールを選択します。ロールがリストに表示されない場合は、そのロールがまだ作成されていないか、またはEC2インスタンスを使用するための信頼ポリシーが適切に設定されていない可能性があります。
7. 「適用」をクリックします。

これにより、選択したIAMロールがEC2インスタンスに関連付けられます。これで、そのインスタンスはロールに関連付けられたポリシーに基づいてAWSリソースにアクセスできるようになります。

## セキュリティグループの設定

このメッセージは、EC2インスタンスのセキュリティグループがポート22（SSH）の接続を許可していないことを示しています。これを解決するには、セキュリティグループの設定を変更して、ポート22への接続を許可する必要があります。

以下に、AWS Management Consoleを使用してセキュリティグループの設定を変更する手順を示します：

1. AWS Management Consoleにサインインします。
2. 「サービス」メニューから「EC2」を選択します。
3. 左側のナビゲーションパネルで「セキュリティグループ」を選択します。
4. 変更したいセキュリティグループを選択します。
5. 「インバウンドルール」タブを選択し、「ルールを編集」をクリックします。
6. 「ルールを追加」をクリックし、以下の設定を行います：
   - 「タイプ」：SSH
   - 「プロトコル」：TCP
   - 「ポート範囲」：22
   - 「ソース」：カスタム
   - 「ソースIP」：xxx.xxx.xx.0/29　　←どのIPを許可すべきかはError画面に出ています。
7. 「ルールを保存」をクリックします。

これにより、セキュリティグループがポート22への接続を許可するようになります。これで、EC2 Instance Connectを使用してインスタンスに接続できるようになるはずです。

「ソースIP」は、インバウンド接続を許可するIPアドレスまたはIPアドレス範囲を指定します。ここで指定されたIPアドレスからの接続のみが許可されます。

# アクセスキーや秘密鍵を準備

## アクセスキーの取得

AWS Access KeyはAWS Management ConsoleのIAM (Identity and Access Management) サービスを通じて作成および管理できます。以下に、Access Keyを確認する手順を示します。

1. AWS Management Consoleにサインインします。
2. サービスメニューから「IAM」を選択します。
3. 左側のナビゲーションパネルで「ユーザー」を選択します。
4. ユーザーリストからAccess Keyを確認したいユーザーを選択します。
5. ユーザー詳細ページで「セキュリティ認証情報」タブを選択します。

ここで、「アクセスキー」セクションを見ると、ユーザーのAccess Key IDが表示されます。ただし、セキュリティ上の理由から、Secret Access Keyは作成時に一度だけ表示され、その後はAWS Management Consoleからは確認できません。

新しいAccess Keyを作成する場合は、「アクセスキーの作成」ボタンをクリックします。新しいAccess Key IDとSecret Access Keyが生成され、ダウンロード可能な.csvファイルとして提供されます。これらのキーは、AWS SDKやCLIを使用してAWSサービスにアクセスする際に必要となります。

なお、Access Keyは重要な認証情報なので、安全な場所に保管し、不要になったらすぐに削除することが推奨されます。

## SSH用の秘密鍵の取得

AWS Management Consoleを使用してEC2インスタンスを作成する際に、SSH接続のためのキーペア（公開鍵と秘密鍵）を作成することができます。このキーペアの秘密鍵は、インスタンスにSSH接続するために必要です。

ただし、AWS Management Consoleから既存の秘密鍵を取得することはできません。キーペアを作成したときにダウンロードした.pemファイルを安全な場所に保存することが重要です。この.pemファイルがないと、そのキーペアを使用してEC2インスタンスに接続することはできません。

新しいキーペアを作成するには以下の手順を行います：

1. AWS Management Consoleにログインします。
2. EC2ダッシュボードを開きます。
3. 左側のナビゲーションパネルで「キーペア」を選択します。
4. 「キーペアの作成」ボタンをクリックします。
5. キーペアの名前を入力し、「キーペアの作成」をクリックします。

これにより、新しいキーペアが作成され、秘密鍵が含まれる.pemファイルが自動的にダウンロードされます。この.pemファイルを安全な場所に保存してください。

なお、既存のEC2インスタンスに新しいキーペアを適用するには、そのインスタンスを停止し、AMI（Amazon Machine Image）を作成した後、そのAMIから新しいインスタンスを起動するときに新しいキーペアを指定する必要があります。

# 端末側の設定について

## Windows端末SSH から AWS EC2アクセス

windowsマシンから AWS CLIとSession Manager Pluginを使用して、プライベートなEC2へ接続するにはどうすれば良いですか

WindowsマシンからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスに接続するための手順は以下の通りです。

1. **AWS CLIのインストール**: AWS CLIはAWSのサービスをコマンドラインから操作するためのツールです。以下のURLからインストーラをダウンロードし、インストールします。

    [AWS CLI version 2 installer for Windows](https://awscli.amazonaws.com/AWSCLIV2.msi)

2. **Session Manager Pluginのインストール**: Session Manager PluginはAWS Systems Managerの一部で、SSHやRDPなしでEC2インスタンスに接続するためのツールです。以下のURLからインストーラをダウンロードし、インストールします。

    [Session Manager Plugin installer for Windows](https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe)

3. **AWS CLIの設定**: AWS CLIを使用するためには、AWSの認証情報（Access Key IDとSecret Access Key）を設定する必要があります。コマンドプロンプトまたはPowerShellを開き、以下のコマンドで設定します。

```bash
aws configure
```

4. **Session Managerを使用した接続**: 以下のコマンドでSession Managerを使用してEC2インスタンスに接続します。

```bash
aws ssm start-session --target instance-id
```

ここで、`instance-id`は接続したいEC2インスタンスのIDです。

以上の手順で、WindowsマシンからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスに接続することができます。ただし、この手順はEC2インスタンスがAWS Systems Managerと互換性があり、適切に設定されていることを前提としています。

## Windows端末RDP から AWS EC2アクセス

Windowsマシンから AWS CLIとSession Manager Pluginを使用して、プライベートなEC2へRDP接続するにはどうすれば良いですか

AWS CLIとSession Manager Pluginを使用して、WindowsマシンからプライベートなEC2インスタンスへRDP接続するための手順は以下の通りです。

1. **AWS CLIのインストール**: AWS CLIはAWSのサービスをコマンドラインから操作するためのツールです。以下のURLからインストーラをダウンロードし、インストールします。

    [AWS CLI version 2 installer for Windows](https://awscli.amazonaws.com/AWSCLIV2.msi)

2. **Session Manager Pluginのインストール**: Session Manager PluginはAWS Systems Managerの一部で、SSHやRDPなしでEC2インスタンスに接続するためのツールです。以下のURLからインストーラをダウンロードし、インストールします。

    [Session Manager Plugin installer for Windows](https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe)

3. **AWS CLIの設定**: AWS CLIを使用するためには、AWSの認証情報（Access Key IDとSecret Access Key）を設定する必要があります。コマンドプロンプトまたはPowerShellを開き、以下のコマンドで設定します。

```bash
aws configure
```

4. **Session Managerを使用したRDP接続**: 以下のコマンドでSession Managerを使用してEC2インスタンスにRDP接続します。

```bash
aws ssm start-session --target instance-id --document-name AWS-StartPortForwardingSession --parameters '{"localPortNumber": local-port, "portNumber": 3389}'
```

ここで、`instance-id`は接続したいEC2インスタンスのID、`local-port`はローカルマシンで開放するポート番号です。

5. **RDPクライアントの起動**: 上記のコマンドを実行した後、RDPクライアント（例えば、Windowsのリモートデスクトップ接続）を起動し、`localhost:local-port`に接続します。

以上の手順で、WindowsマシンからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスにRDP接続することができます。ただし、この手順はEC2インスタンスがAWS Systems Managerと互換性があり、適切に設定されていることを前提としています。また、EC2インスタンスがWindows OSであり、RDP接続が許可されていることも必要です。

## Mac端末 to AWS EC2アクセス

Macマシンから AWS CLIとSession Manager Pluginを使用して、プライベートなEC2へ接続するにはどうすれば良いですか

MacマシンからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスに接続するための手順は以下の通りです。

1. AWS CLIのインストール: AWS CLIはAWSのサービスをコマンドラインから操作するためのツールです。以下のコマンドでインストールできます。

``` bash
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
```

2. Session Manager Pluginのインストール: Session Manager PluginはAWS Systems Managerの一部で、SSHやRDPなしでEC2インスタンスに接続するためのツールです。以下のコマンドでインストールできます。

``` bash
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
```

3. AWS CLIの設定: AWS CLIを使用するためには、AWSの認証情報（Access Key IDとSecret Access Key）を設定する必要があります。以下のコマンドで設定できます。

``` bash
aws configure
```

4. Session Managerを使用した接続: 以下のコマンドでSession Managerを使用してEC2インスタンスに接続します。

```bash
aws ssm start-session --target instance-id
```

ここで、instance-idは接続したいEC2インスタンスのIDです。

以上の手順で、MacマシンからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスに接続することができます。ただし、この手順はEC2インスタンスがAWS Systems Managerと互換性があり、適切に設定されていることを前提としています。

## VScode から AWS EC2アクセス

AWS CLIとSession Manager Pluginを使用して、VS CodeからプライベートなEC2インスタンスへ接続するための手順は以下の通りです。

1. **AWS CLIとSession Manager Pluginのインストール**: これらのツールはAWSのサービスをコマンドラインから操作するためのものです。まだインストールしていない場合は、それぞれの公式サイトからダウンロードしてインストールしてください。

2. **AWS CLIの設定**: AWS CLIを使用するためには、AWSの認証情報（Access Key IDとSecret Access Key）を設定する必要があります。ターミナルを開き、以下のコマンドで設定します。

```bash
aws configure
```

3. **VS Codeの設定**: VS Codeでリモート開発を行うためには、"Remote - SSH"という拡張機能をインストールする必要があります。VS Codeの拡張機能タブから検索してインストールしてください。

4. **SSH設定ファイルの編集**: VS Codeの"Remote - SSH"拡張機能は、SSH設定ファイルを使用してリモートサーバーへの接続を管理します。以下のコマンドでSSH設定ファイルを開き、編集します。

```bash
code ~/.ssh/config
```

このファイルに、以下のような内容を追加します。

```bash
Host my-ec2-instance
  HostName localhost
  User ec2-user
  Port local-port
  IdentityFile ~/.ssh/id_rsa
  ProxyCommand sh -c "aws ssm start-session --target instance-id --document-name AWS-StartPortForwardingSession --parameters '{\"localPortNumber\": \"local-port\", \"portNumber\": \"22\"}'"
```

```bash
Host my-ec2-instance
  HostName localhost
  User ec2-user
  Port 9022
  ConnectTimeout 300
  ServerAliveInterval 60
  IdentityFile ~/.ssh/awstestkey.pem
  ProxyCommand sh -c "aws ssm start-session --target i-xxxx --document-name AWS-StartPortForwardingSession --parameters '{\"localPortNumber\": [\"9022\"], \"portNumber\": [\"22\"]}'"
```

ここで、`my-ec2-instance`は任意のホスト名、`ec2-user`はEC2インスタンスのユーザー名、`local-port`はローカルマシンで開放するポート番号、`instance-id`は接続したいEC2インスタンスのIDです。

5. **VS Codeからの接続**: VS Codeの左下の緑色のアイコンをクリックし、"Remote-SSH: Connect to Host..."を選択します。先ほど設定ファイルに追加したホスト名（ここでは`my-ec2-instance`）を選択すれば、VS CodeからEC2インスタンスに接続できます。

以上の手順で、VS CodeからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスに接続することができます。ただし、この手順はEC2インスタンスがAWS Systems Managerと互換性があり、適切に設定されていることを前提としています。また、EC2インスタンスがSSH接続を許可していることも必要です。

### なぜかうまくいかない

本当は上記設定で一発でつながるはずですが、うまくいかず以下２段階で実施中です。何が悪いんだ。。。。。

1. ポートフォアード処理を起動

```bash
aws ssm start-session --target i-xxxx --document-name AWS-StartPortForwardingSession --parameters '{"localPortNumber": ["9022"], "portNumber": ["22"]}'

```

2. ssh接続を実装

```bash
Host my-ec2-instance
  HostName localhost
  User ec2-user
  Port 9022
  ConnectTimeout 300
  ServerAliveInterval 60
  IdentityFile ~/.ssh/awstestkey.pem
```