【AWS EC2】パブリック側に配置したインスタンスを踏み台にしてプライベート側のインスタンスへssh接続する

#前提条件

**OS**
 MacOS Monterey 12.0.1
**CPU**
 Apple M1(arm64) 
**AWS EC2インスタンスタイプ**
Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type 

#手順

###１　はじめに（今回構築するアーキテクチャとゴール）###

アーキテクチャ・・・なんて大袈裟に書きましたが、話を簡単にするため、

・VPC内の１つのAZに
・パブリックサブネット１つ
　　（その中にEC2インスタンス１つ）
・プライベートサブネット１つ
　　（その中にEC2インスタンス１つ）

という最もシンプルなVPCを構築します。
そこで、

**①パブリックサブネット内インスタンスにMacターミナル等からssh接続**
**②そのインスタンスからプライベートサブネット内のインスタンスへssh接続**

という２段階で、直接外からアクセスできないプライベートサブネット内のインスタンスへ接続することをゴールとします。

###2 VPCを作成###

ネットワーク範囲を`10.0.0.0/16`に設定
（詳しい手順は割愛します）

###3 パブリックサブネットを作成###

ネットワーク範囲を`10.0.0.0/24`に設定

※作成後、サブネットの詳細画面でもし「パブリック IPv4 アドレスを自動割り当て」が「いいえ」になっていた場合は、設定の編集から自動割り当てをオンにしてください。

![スクリーンショット 2021-12-20 18.38.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1068535/52d4e4be-44a4-f222-5ca3-f22292a64348.png)


###4 プライベートサブネットを作成###

ネットワーク範囲を`10.0.1.0/24`に設定

※「パブリック IPv4 アドレスを自動割り当て」は「いいえ」で大丈夫です。

###5 インターネットゲートウェイ（IGW）を作成###

設定は何もありません。作るだけ。
※手順２で作ったVPCへのアタッチを忘れずに！

###6 パブリックサブネットのルートテーブルにIGWへのルートがあることを確認###

もしなければ、パブリック用ルートテーブルを作成し、パブリックサブネットに関連づけます

![スクリーンショット 2021-12-20 18.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1068535/97b3a953-414a-d151-381c-714cf396aa6b.png)


※プライベートサブネットにはこのルートは不要です。`10.0.0.0/16⇨local`　のみでOK

凡ミス防止のため、手間ですがルートテーブルを２種作成し、名前は「パブリック、プライベート」などと分け、それぞれのサブネットに関連づけてます。

![スクリーンショット 2021-12-20 18.47.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1068535/3d0bfbb5-5306-54fd-e1ee-4c9b7ae608fe.png)

ここまでで、VPC全体の構成は完了です。

*※今回はネットワークACLはデフォのまま「全て許可」にしています。*

###7 各サブネットに１つずつEC2インスタンスを作成###

VPC周りができたので、EC2インスタンスを２つ作成し、それぞれパブリック・プライベートサブネットに配置します。
今回は無料利用枠`「Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type 」`を使用します。

**①パブリック側に配置するインスタンスを作成**

基本的にはデフォのまま作成していきます。
ただし、以下の点に注意してください。

※パブリックIPアドレスの自動割り当てがONになっていることを確認

※セキュリティグループについて、自分はよりセキュアな環境で実験したかったので、自分だけがssh接続できるようにするため、`「タイプ＝SSH、ソース＝マイIP」`としました。

※起動直前に`「新規のキーペア作成・pemファイルのダウンロード」`を行う！
※pemファイルについては、
　１）安全な場所（.sshディレクトリ）へ移動
　２）権限変更
　３）pemファイルの中身を丸々テキストエディタなどへコピーしておく
ことを忘れずに！

１）、２）の手順は、↓の記事に紹介していますので、よかったら参考にされてください。

https://qiita.com/Ryo-hey/items/cb42d713d881814acb42

３）については、

```
% cat ファイル名.pem
-----BEGIN RSA PRIVATE KEY-----
　　（ファイルの中身）
-----END RSA PRIVATE KEY-----
```

で中身を表示し、そのままコピーしておきます（後で使います）


**②プライベート側に配置するインスタンスを作成**

①と同様に作成していきます。

※セキュリティグループは、①に加え、`「タイプ＝SSH、ソース＝10.0.0.0/24」`（パブリックサブネットのネットワーク範囲）を指定します。
　　（この後、パブリックサブネット内インスタンスからssh接続するためです）

※起動直前は`「既存のキーペアを選択」で①のインスタンス起動時にダウンロードしたpemファイルを選択`してください。

###8 パブリックサブネット内インスタンスへ接続###

いよいよインスタンスへssh接続していきます。
今回はMacのターミナルから接続します。
手順は、↓の記事にも載せてあるためここでは割愛します。
（何度もスイマセン、再掲します）

https://qiita.com/Ryo-hey/items/cb42d713d881814acb42

インスタンスに接続できたら、

```
yum update -y
```
しておきます。

###9　プライベートサブネット内インスタンスへ接続###

先ほど接続したパブリックサブネット側のインスタンス内で操作します。

```
sudo su
```
ルート権限にして、

```
# nano myprivatekey.pem
```
でpemファイルを作成します。
エディタが立ち上がったら、中身に先ほどコピーしたpemファイルの中身を丸ごと貼り付けて保存します。

```
# chmod 400 myprivatekey.pem
```
権限変更します。

```
# ssh -i myprivatekey.pem ec2-user@インスタンスのプライベートIPアドレス
```

プライベートサブネット側のインスタンスに接続したいので、＠以降はプライベートIPアドレスを指定します（パブリックIPアドレスは割り当てられてないはずです）

![スクリーンショット 2021-12-20 19.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1068535/b89232b4-1649-11f1-a546-b7c3aafc25e3.png)


以上です。

#参考サイト
https://www.udemy.com/course/aws-associate/