パブリックサブネットのEC2を経由して(踏み台サーバ)プライベートサブネットのEC2にssh接続できるようにAWS環境を構築した備忘録となります
AWS初めて触るというかたは参考にしていただければ幸いです。
このような構成図の環境構築を行います

Table of Contents
VPCの作成
名前タグにtest-vpc
IPv4 CIDRを10.0.0.0/21に設定

サブネットの作成
VPC内を複数のサブネットに分割する

VPCの中にサブネットを作成するため、サブネット作成を以下のように実施
2つのサブネットを作成する
関連付けるVPCは先ほど作成したtest-vpc
サブネットの名前をtest-subnet-0としておく(test-subnet-0をパブリックサブネットとする)
CIDRブロックは10.0.0.0/24とする

2つ目のサブネット
VPCは同様のものを選択
サブネット名にtest-subnet-2(こちらをプライベートサブネットとする)
アベイラビリティゾーンはap-northeast-1aと1つ目のサブネットと同様のものを作成する
CIDRブロックは10.0.2.0/24

インターネットゲートウェイの作成
インターネットゲートウェイ作成から以下のように作成する
名前タグは任意のものを入力し、インターネットゲートウェイの作成をする

作成した状態だと状態が「Detached」となっているため

アクションからVPCにアタッチをする

はじめに作成したVPCを選択しインターネットゲートウェイのアタッチをする

状態が「Attached」になればVPCへアタッチされた状態になる

ここまでの状態が以下のような構成図となります

ルートテーブルの作成
ルートテーブルの作成を行い、
PublicSubnetはインターネットに向く設定を行う
左サイドバーからサブネットを選択し、ルートテーブルのタブを選択する

ルートテーブルのリンクを選択して開く

ルートタブからルートの編集を選択する

ルートの編集画面で送信先にインターネットにむける0.0.0.0/0を入力し、ターゲットに作成したインターネットゲートウェイを選択し、変更を保存する

ルートの関連付けができます

VPC、サブネット、インターネットゲートウェイ、ルートテーブルの作成が完了したので、EC2インスタンスの作成を行います
インスタンスの作成
インスタンスの作成からAmazon Linux2を選択する

無料枠のt2.microを選択し、次のステップ:インスタンスの詳細の設定を選択

ネットワークはVPC作成の部分で作成したtest-vpcを選択
サブネットはap-northeast-1a test-subnet-0を選択
自動割り当てパブリックIPは有効(パブリックサブネットを想定しているので、一旦自動割り当ては有効化とする)

ストレージはデフォルトのまま

EC2にNameタグを追加
このタグをつけることで、一覧で見たときに、あとでどのEC2だったっけ?といったことを防ぐことができます。

セキュリティグループの設定は一旦デフォルトのまま

キーペアを作成する
新しいキーペアの作成を行い、キーペア名に任意の名称をつける
キーのダウンロードを行い、インスタンスの作成を行う
ダウンロード先は任意に選択

EC2の作成ができました

作成したEC2に対してセキュリティグループを設定する
セキュリティグループ作成からセキュリティグループの設定を行う
セキュリティグループ名: test-sg-1
説明: test-sg-1
VPCは作成しているVPCを作成する
インバウンドルールにssh接続できるように設定し、
ソース: どのIPから通信を受け取れるようにするかの設定を行う
すべてのIPから受け取れるように設定する→0.0.0.0/0

作成したセキュリティグループを自身で作成したEC2(test-ec2-1)に設定する
作成したEC2を選択し、アクション→セキュリティ→セキュリティグループの変更を行う

関連付けられたセキュリティグループから「test-sg-1」のセキュリティグループを選択し、セキュリティグループを追加する
デフォルトで作成されている「launch-wizard-3」は削除してOK

EC2を選択し、セキュリティタブをクリックすると、test-sg-1で設定したセキュリティグループになっていることを確認する

EC2インスタンスへ接続
WindowsのPowerShellでssh接続する例で記載します。
PowerShellでssh接続する際のコマンドは以下の通りです
例)
ssh -i keyがあるディレクトリ ec2-user@パブリックIPアドレス
以下のように聞かれたらyesとする
ECDSA key fingerprint is SHA256:MKrnvU6gJOnusWWydy4vBMkdDA58z9fz4YNGHCaVxr0.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
以下のように表示されたらログインは成功しています。
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
Amazon Linux 2
Run all your cloud and enterprise applications in a security-focused and high-performance Linux environment. Amazon Linux 2 is a Linux operating system from Amazon Web Services (AWS). It provides a security-focused, stable, and high-performance execution environment to develop and run cloud applications. Amazon Linux 2 is provided at no additional charge.
2 package(s) needed for security, out of 2 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-195 ~]$
以下のようなwarningが出たときには
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0664 for 'test-keypair_2.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "test-keypair_2.pem": bad permissions
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
こちらを参考に対処すると良いでしょう。
参考 【Windows PowerShell】SSH接続する際にパーミッションエラーが発生した場合の権限変更Qiita上記で一旦EC2への接続はできましたが、IPアドレスは現状自動割り当てとなっているため、EC2を停止し、新たに起動すると、IPアドレスは変わってしまします。
そのためElastic IP addressをEC2にアタッチして、固定のIPアドレスとします。
Elastic IP addressの割り当て
VPCの画面にてElastic IPを左サイドバーから選択し、右上Elastic IP アドレスを割り当てるを選択

割り当てを押下

割り当てするとElastic IPが割り当てられる

Elastic IP アドレスの関連付けを行い

作成していたEC2「test-ec2-1」へ関連付けを行う

関連付けされるとEC2インスタンスにElastic IPアドレスが関連付けされていることを確認する

上記のように表示されていればElastic IPアドレスの関連付けはできています
次はプライベートサブネットにEC2を作成し、接続を行います
インスタンス作成方法の途中までは同様の手順のため割愛します
ステップ3: インスタンスの詳細の設定画面にて、サブネットを「test-subnet-2」を選択する
自動割り当てパブリックIPは無効化とする(プライベートサブネットのため)


上記のように設定する
セキュリティグループはデフォルトのまま

既存のキーペアは既存のものを使用

ここまでが完了したらパブリックサブネットのEC2を踏み台にしてプライベートサブネットのEC2にssh接続します
ssh接続するためには、ローカルに置いてあるkeyをパブリックサブネットのEC2へSCPコマンドでコピーを行うことで、プライベートサブネットのEC2へssh接続することができるようになります。
scpコマンドは以下のようなコマンドです
scp -i .\test-keypair_2.pem .\test-keypair_2.pem ec2-user@xx.xx.xx.xx:/tmp/
scp -i .\test-keypair_2.pem でsshに使用する鍵を指定
.\test-keypair_2.pem ec2-user@xx.xx.xx.xx:/tmp/とすることで、コピー元パス情報 コピー先パス情報を指定
SCPコマンドとは「Secure Copy」の略で、ホストコンピュータからリモートコンピューへファイルをコピーする小窓のことです。
scp [オプション] コピー元パス コピー先パス
オプション | 説明 |
---|---|
-i 鍵ファイル名 | ssh接続に使用する鍵ファイルを指定する |
-P ポート番号 | sshのポートを変更してる場合など 接続に使用するポートを指定する |
– p | コピー元の担務スタンプやパーミッションを保存する |
-r | Directoryごと再帰的にコピーする |
scpコマンドでコピーしたkeyファイルがEC2の/tmpディレクトリに存在するか確認します
/tmpにlsコマンドでkeyが存在することを確認し、存在すれば問題なくkeyがEC2へコピーできています
-rw-rw-r-- 1 ec2-user ec2-user 1700 May 8 01:25 test-keypair_2.pem
ここかでプライベートサブネットのEC2へssh接続します
IPアドレスはプライベートサブネットのプライベートIPアドレスを指定する
/tmpディレクトリにcdで移動して以下コマンドを実行する
パブリックサブネットのEC2からプライベートサブネットのEC2にssh接続する際は、プライベートIPアドレスを指定する
ssh -i test-keypair_2.pem ec2-user@xx.x.x.xxx
以下のようなWarningがでた場合は、keyに対する権限が付与されていないため、keyに読み取り権限を与える
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0664 for 'test-keypair_2.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "test-keypair_2.pem": bad permissions
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
keyに読み取り権限を与えるコマンド
chmod 400 test-keypair_2.pem
改めて以下コマンドを実行
ssh -i test-keypair_2.pem ec2-user@xx.x.x.xxx
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
Amazon Linux 2
Run all your cloud and enterprise applications in a security-focused and high-performance Linux environment. Amazon Linux 2 is a Linux operating system from Amazon Web Services (AWS). It provides a security-focused, stable, and high-performance execution environment to develop and run cloud applications. Amazon Linux 2 is provided at no additional charge.
[ec2-user@ip-xx-x-x-xxx ~]$
次は無事ログインできました。
パブリックサブネットにEC2を踏み台にし、プライベートサブネットのEC2へssh接続ができたので、次はプライベートサブネットのEC2からNATゲートウェイを経由してインターネットに接続します
NATゲートウェイの作成
VPCの画面からNATゲートウェイを選択し、NATゲートウェイを作成する

名前は任意の名前を入力
サブネットにパブリックサブネットを選択
Elastic IP割り当てはElastic IPを割り当てを押下し、割り当てを行う(インターネットに出るため、Elastic IPは必須)


プライベートサブネットのルートテーブルをNATゲートウェイに向くように設定をします
ルートテーブルの作成からルートテーブル設定を行い、ルートテーブルを作成する

ルートの編集を行います
送信先は0.0.0.0/0
ターゲットはNATゲートウェイを選択し変更を保存する


プライベートサブネットにルートテーブルの関連付けを行います
VPCの画面からサブネットを選択し、test-subnet-2を選択した状態で
アクション→ルートテーブルの関連付けを行う

プライベートサブネットのroutetableがNATゲートウェイをターゲットにしていればOK

ここまでで、以下のような構成図の環境が出来上がりました。

環境の削除
環境を作ったまま放置すると課金対象となってしまいますので、以下の手順で環境を削除します
EC2削除→NATゲートウェイ削除→Elastic IPの開放→VPC削除
EC2の削除
EC2を選択して、インスタンスの状態からインスタンスを終了

インスタンスの状態が終了済みになっていればOKです

NATゲートウェイの削除
対象のNATゲートウェイを選択してアクションからNATゲートウェイを削除

フィールドに「削除」と入力し、削除

Elastic IP開放


フィールドに「削除」と入力し削除
セキュリティグループやサブネットなども一緒に削除されます

以上でEC2踏み台サーバを経由してssh接続の環境構築を終了します。
【いまなら最大4,000円引き】AWSの学習 CloudTech
AWSの基礎学習を学ぶならCloudTechがおすすめです!!
詳細はこちらにまとめておりますので、ぜひご覧ください!!