【AWSまとめ】プライベートサブネットのEC2に、ローカルからEC2 instance connect endpointを使ってSSH接続する

## 踏み台サーバーじゃなくて、EC2 instance connect endpointを使ってプライベートサブネットのEC2にSSH接続する。
最近まで、セキュリティの側面から、パブリックサブネットに所謂、踏み台サーバー（EC2）を置いて、その踏み台サーバーを経由してプライベートサブネットの配置した計算用サーバー（EC2）にアクセスしていました。
この手法は、確かにセキュアなのですが、同時に二つのサーバーを稼働させる必要がありコストがかかります。そこで、踏み台サーバーを使わないEC2 instance connect endpointを使ってプライベートサブネットにSSH接続する方法についての複数の情報源をもとにして、ここでまとめてみます。

## 構造イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/54344504-fd7e-ceea-a252-186cdce6b061.png)

## VPCのリソース構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/9dbf7c93-030a-a329-13af-536b61b00a01.png)

## やること
1\.　セキュリティグループを作る
2\.　EC2 instance connect endpointを作る
3\.　EC2を作る
4\.　AWS CLIをインストールする
5\.　SSH接続してみる
6\. 【追記】 VSCodeからプライベートサブネットのEC２インスタンスにSSH接続する

## １．セキュリティグループを作る

 〇 **まずEC2 instance connect endpointのセキュリティグループを設定します**。こちらのセキュリティグループのインバウンドルールでは、使用中の環境からのSSH接続を許可する。一方で、アウトバウンドルールでは、プライベートサブネットに配置されたEC2に紐づいたセキュリティグループを送信先とします。

・インバウンドルール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/6c47aac9-19ca-24a7-0ffd-1513ff33035c.png)

・アウトバウンドルール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/667a0f86-8a41-87e5-2a3c-1c3fd3e621c0.png)

〇 次に、**プライベートサブネットに紐づいたセキュリティグループを設定**します。こちらのセキュリティグループのインバウンドルールでは、EC2 instance connect endpointに紐づいたセキュリティグループを許可する。一方のアウトバウンドルールでは、すべてのトラフィックを許可する。
※すべてのトラフィックを許可するのはセキュリティ上よくないので警告がでます。本来は、NATgatewayにセキュリティグループを紐づけて、そのセキュリティグループを送信先にした方がいいです。

・インバウンドルール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/2116b1a3-e987-32e1-d94d-4e3ca97d0882.png)

・アウトバウンドルール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/adb56719-2a92-6301-c06b-f0acd478c9bd.png)

## ２．EC2 instance connect endpointを作る
作成方法は、以下のサイトを参照してください。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/create-ec2-instance-connect-endpoints.html#describe-eice

・サービスカテゴリは、「EC2インスタンス接続エンドポイント」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/713501bb-4fd7-43c7-162b-9b4e89ee0b5c.png)

・VPCを選択したら、セキュリティグループは、さっき作ったEC2 instance connect endpoit用のセキュリティグループにチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/74875e24-0835-955f-f446-458b666ab022.png)

・サブネットは、**Public Subnet**を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/bb97d761-6e7e-0f46-6191-a22fc78fbff4.png)

## ３．EC2を作る
EC2の作り方いろいろなところで紹介されていると思いますので、コンソール上の曽さは、そちらを参照してみてください。
※ただし、基本的なことなのですが、SSH接続する時に**秘密鍵**が必要なことと、セキュリティグループは、上で作ったプライベートサブネットに配置された**EC2用のセキュリティグループを指定**する。あと、もちろん、サブネットは**プライベートサブネットを指定**してください。

〇EC2をつくったらコンソール上の［接続］からインスタンスコネクトエンドポイントしてみます。

・EC2インスタンスのダッシュボード画面で、作成したEC2にチェックを入れて［接続］を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/e825cab4-f36b-f6f8-2f47-2b691f6dc54b.png)

・画面が移動したら以下の設定をして、右下の[接続]を押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/774565a9-e037-1d35-1e2e-9efb3da037da.png)

・するとコマンドラインの画面が現れます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/2bf77b90-11fd-c089-b7e3-80347a131fe9.png)

## ４．AWS CLIをインストールする
コンソール上での設定は、あらかた終わりましたので、いよいよローカル環境からのSSH接続をやってみます。
### 注意したいこと
**私は、このAWS CLIのインストールを忘れてて、ずっとSSH接続できない、というトラブルにはまってました。参考にしたサイトで紹介されていた方法では、このAWS CLIのインストールが省略されていたからです。多分、あまりにも基本的な準備なので分かっている前提だったんだと思います。でも、正直忘れやすい部分だと思います。エラーメッセージからも、AWS CLIのインストール忘れを連想しにくいので、なおさらです。**
　あと、**アクセスキー**と**シークレットアクセスID** の生成もお忘れなきように、AWS CLI の使用に必要です。

 〇 AWS CLIのインストールは以下のサイトの方法に従ってできます。
 
 https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

 - 今回は、windows環境でやっていきます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/28a7904d-d6a9-0634-8af3-1fac9cb7f901.png)

- AWS CLIのインストールが終わったら、
~~~
 aws --version
~~~
を実行して、バージョン情報がでたら、完了です。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/d71f6005-29ed-a632-db47-558daf5079fd.png)

- aws configureによって、ユーザーを認識を行ってください。
~~~
aws configure
~~~
以下のように、アクセスキー、シークレットアクセスIDを打ち込んでいってください。
~~~
AWS Access Key ID [****************FPXI]:
AWS Secret Access Key [****************/y7R]:
Default region name [ap-northeast-1]:
Default output format [json]:
~~~

以上でAWS CLI関連はOKです。

## ５．SSH接続してみる
コマンドプロンプトで、以下のコマンドを実行します。
~~~
ssh -i 秘密鍵のパス ubuntu@EC2インスタンスのID -o ProxyCommand="aws.exeのパス ec2-instance-connect open-tunnel --instance-id %h"
~~~

以下が、私の環境のコマンドです。
~~~
ssh -i GORIN.pem ubuntu@i-0a508e8f2f0eea205 -o ProxyCommand="C:\Program Files\Amazon\AWSCLIV2\aws.exe ec2-instance-connect open-tunnel --instance-id %h"
~~~

すると、SSH接続できて、EC2インスタンス内のコマンドラインの画面に推移できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/a33459a8-a325-5d92-d2c9-6fdb28dca23b.png)


## [補足]　NAT Gatewayの設置をお忘れずに！！
以上までの操作で、NAT gatewayの設置部分のデモンストレーションを載せていませんでした。
NATgatewayは、EC2インスタンスからの出ていく通信のみを可能するものです。
設置時には、**ElasticIPを割り当て**、**必ず！ パブリックサブネットに配置**してください。さらにNatGateway設置後は、private subnetが紐づいている**Private route table**のルート編集をしてください。下の画像のように、ターゲットをNATGatewayにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/ff31a85d-6499-0171-0d76-4250b71c90c9.png)

これで、Private subnetに配置されたEC2インスタンスから、通信をインターネットに出すことができます。これをしないと、パッケージのインストールができないので、sudo apt-get updateとかをやってもインターネットにアクセスできないのでエラーがでます。

## おわり
以上の操作で、踏み台サーバーを使わずにPrivate sunbetのEC2インスタンスに接続できるようになります。特に、**AWS CLIの部分は、要注意**です。aws.exeの配架場所とか、秘密鍵のパスとか、インスタンスIDが正しいかどうか、エラーの原因となりがとだった気がします！
NatGatewayのところは、詳しい設置操作は、別の参考情報をご参照ください。

## 6. 追記 VSCodeからプライベートサブネットのEC２インスタンスにSSH接続する。
続けて、VSCodeを使って、プライベートサブネットのEC2インスタンスにSSH接続する場合はの設定方法は、以下のリンク先をご参照ください。

https://qiita.com/GORIN/items/8800760c7db77a74f7e8