本記事は、先日筆者が自己学習のために入会した AWS CloudTechという技術コミュニティの課題カリキュラムに沿って作成しております。
カリキュラムなどにご興味のあるかたは、以下リンクより公式ページにリンクできますので、内容をご覧になってみてはいかがでしょうか。
>> AWS CloudTech
このハンズオンで目指す構成
構成図のPrivate Subnet 1cにEC2(webap-01)を作成し、Apacheをインストールしてwebap(うぇぶえーぴー)サーバーとして機能させます。今回はインターネット経由でwebap-01にアクセスし、ブラウザからHello, World!!が確認できればOKとします。
この構成の特徴
本構成には以下の特徴があります。
特徴1 EC2(webap-01)をプライベートサブネットに作成し、ELB(いーえるびー)とよばれるロードバランサーを通してEC2を外部に公開
この構成では、EC2を直接外部公開せず、ELBの配下に作成するため、将来的な拡張性を確保できます。
具体的には、EC2をAutoScalingグループに所属させて、需要にあわせてEC2の台数を増減したり、マルチAZにEC2を配置して耐障害性をアップさせたりすることが可能になります。
特徴2 プライベートサブネットに作成したEC2を外部通信可能にするため、NAT ゲートウェイを設置
プライベートサブネットに設置したEC2(webap-01)が外部通信をするため、AWSのマネージドサービスであるNAT ゲートウェイを設置し、外部との通信を実現します。
理由は、この構成の場合、EC2にパブリックIPを付与しただけでは外部と通信できないためです。
特徴3 セキュリティを高めるため、VPNを用いてSSH接続を実現する
この構成では、EC2を管理する際にセキュリティを高めるため、プライベートサブネットにVPNエンドポイントを設置し、エンドポイントを通じて管理者がインターネット経由でSSH通信することでEC2を操作可能にします。
なお、シンプルにEC2へのSSH接続を実現したいだけなら、パブリックサブネットにもう1つEC2(踏み台サーバー)を作成し、いったん踏み台サーバーを経由してプライベートサブネットにあるEC2とSSHすることも可能です。
このハンズオン作業のゴール
- 構成図にある紫の矢印 VPN通信でプライベートサブネットに作成したEC2にSSH接続を実現する
- ローカルPCからインターネットを経由でwebap-01にアクセスし、ブラウザからHello, World!!が確認できる
筆者の環境
ローカル開発環境 | Windows10からブラウザよりAWSマネジメントコンソールに接続して作業 |
EC2のOS | Amazon Linux 2 |
SSH通信 | TeraTermを利用 |
作図 | dwarioのAWS19アイコンを利用 |
AWSでELB—EC2の構成を構築し、クライアントVPNで接続する手順の概要
- step01 VPCを作成する
- step02 サブネットを作成する
- step03 インターネットゲートウェイを作成する
- step04 EC2を作成する
- step05 ELBを作成する
- step06 NAT ゲートウェイを作成する
- step07 ルートテーブルを作成する
- step08 クライアントVPNエンドポイントを作成する
- step09 ローカルPCから疎通確認をする
はじめに、step01・step02・step03でAWS上にネットワーク接続するためのベースを作成します。
つづいて、step04・step05・step06・step07・step08でEC2・ELB・Natゲートウェイ・ルートテーブル・クライアントVPNエンドポイントをそれぞれ作成し、プライベートサブネットに作成したEC2の設定をしていきます。
最後に、step09でローカルPCのブラウザからEC2(webap-01)にHTTP通信し、Hello, World!! が表示されることを確認していきます。
なお、以降の手順は現在作成中の部分もあります。適宜構成図を入れたり、アップデートしていきます。
step01 VPCを作成する
作成方法の詳細については前回の課題カリキュラムで手順を記載しましたのでご覧ください。
>> AWSでシングル構成でワードプレスのブログサービスを構築する手順の概要/step01 VPCを作成する
本作業でVPCに設定する項目
名前タグ – オプション | 任意のVPC名 今回は「Test-VPC」と記載 |
IPv4 CIDR ブロック | 任意のIPアドレスブロック※ 今回は「172.16.0.0/16」と記載 |
その他の項目 | デフォルトのまま |
step02 サブネットを作成する
今回の作業で作成するサブネット4つ
AZ ap-northeast-1a | ・Public Subnet 1a (172.16.1.0/24) ・Private Subnet webap 1a (172.16.2.0/24) |
AZ ap-northeast-1c | ・Public Subnet 1c (172.16.3.0/24) ・Private Subnet webap 1c (172.16.4.0/24) |
サブネットを4つ作る理由
理由その1
SubnetをPublicとPrivateに分けた理由は以下の構成にするためです。
・ELB(Elastic Load Balancer)、Natゲートウェイ、VPN EndPointをPublic Subnetに配置し、webap-01(EC2)がそれらを通して外部通信可能にする
・webapサーバーをPrivateに配置して直接外部公開しないようにすることでセキュリティを強化する
理由その2
AZを「ap-northeast-1a」「ap-northeast-1c」の2つに分けた理由は、EC2が1つだけだと単一障害点となるため、今後マルチAZにEC2を作成することが可能となる柔軟性を確保するためです。
なお、サブネット手順の詳細については、前回の課題カリキュラムで手順を記載してありますのでご覧ください。
>> AWSでシングル構成でワードプレスのブログサービスを構築する手順の概要/step02 サブネットを作成する
step03 インターネットゲートウェイを作成する
手順の詳細については、前回の課題カリキュラムで手順を記載してありますのでご覧ください。
>> AWSでシングル構成でワードプレスのブログサービスを構築する手順の概要/step03 インターネットゲートウェイを作成する
step04 EC2を作成する
まず、今回設定するパラメーターについてみていきます。
今回設定するパラメーター
・VPC step01で作成したVPC(今回はTest-vpc)
・サブネット step02で作成したサブネット(今回はPrivate subnet webap 1a)
・ネットワークインターフェース プライマリIP 172.16.2.10
・新しいセキュリティグループ webap-sg
・キーペアの作成 新しいキーペアを作成(名前は任意)
webap-sgの設定値
タイプ SSH ソース 0.0.0.0/0
タイプ HTTP ソース 0.0.0.0/0
なお、EC2を作成する手順については、キーペアを作成する手順も含めて前回の課題カリキュラムで手順を記載しましたのでご覧ください。
EC2を作成する手順(キーペアの作成手順を含む)
>> AWSでシングル構成でワードプレスのブログサービスを構築する手順の概要/step05 EC2を作成する
step05 ELBを作成する
つぎに、ELB(Elastic Load Balancer)を作成します。
ELB(Elastic Load Balancer)を作成する手順
> EC2の左ペイン
> ロードバランサー
> 「ロードバランサーの作成」をクリック
> 「Application Load Balancer」
> 「作成」をクリック
> 以下を記載していく
名前 | ELB-01 |
VPC | step01で作成したVPC |
アベイラビリティゾーン | step02で作成した、Public Subnet 1a・Public Subnet 1cを選択 |
その他 | デフォルトのまま |
ELBが所属するサブネットを設定する際の注意点
今回は、外部向けのELBを作成しますので、パブリックサブネットに作成します。
プライベートサブネットにELBを作成(内部向け)することも可能ですが、今回の構成で内部向けに作成すると、ELBを外部に公開できず、後ほどブラウザで Hello, World を表示できなくなるためです。
手順の続き
> EC2(webap-01)と同様のセキュリティグループを適用する(今回はwebap-sg)
> ターゲットの登録で以下を選択
名前 | webap-tg |
インスタンス | step04 で作成したEC2を登録 |
> 再度、以下の項目が問題なく設定されているかを確認
・名前
・VPC
・サブネット
・ターゲットグループ名
・ターゲット インスタンス
step06 NAT ゲートウェイを作成する
Natゲートウェイ作成の手順
> VPCダッシュボード
> 左ペイン > 「NAT ゲートウェイ」をクリック
> 「NAT ゲートウェイを作成」をクリック
> 以下を記入し、「NAT ゲートウェイを作成」をクリック
名前 | NatGateway |
サブネット | 今回作成したPublicサブネット(Public Subnet 1a)を選択 |
Elastic IPの割り当て | 「Elastic IPの割り当て」をクリック |
step07 ルートテーブルを作成する
次に、ルートテーブルを作成します。今回は、Public Subnetに適用するルートテーブルとPrivate Subnetに適用するルートテーブルを計2つ作成します。
ルートテーブル作成の手順
Route Table Publicの作成
> VPCダッシュボード
> 左ペイン > 「ルートテーブル」をクリック
> 画面右上のルートテーブルの作成をクリック
> ルートテーブルの作成で以下を入力
名前タグ | Route Table Public |
VPC | step01で作成したVPCを選択(今回はTest-VPC) |
> 作成した「Route Table Public」の左側にチェックを入れる
> 画面下側でルート > ルートの編集をクリック
> ルートの編集 > ルートの追加をクリック
> 以下のテーブルを記載
送信先 | 0.0.0.0/0 |
ターゲット | step03で作成したインターネットゲートウェイ(今回は「IGW」)を選択 |
> ルートテーブルの作成の画面に戻り、以下の表示になっていることを確認
> 今回 Route Table Publicに関連付けをする「Public Subnet 1a (172.16.1.0/24)」と「Public Subnet 1C (172.16.3.0/24)」を選択し、「保存」をクリック
この設定により、Router Table Publicのルートテーブルについて以下が実現されます。
・その他の送信先:0.0.0.0/0のトラフィックに関しては、IGWに転送される。
Route Table Privateの作成
> VPCダッシュボード
> 左ペイン > 「ルートテーブル」をクリック
> 画面右上のルートテーブルの作成をクリック
> ルートテーブルの作成で以下を入力
名前タグ | Route Table Private |
VPC | step01で作成したVPCを選択(今回はTest-VPC) |
> 作成した「Route Table Private」の左側ラジオボタンにチェックを入れる
> 画面下側でルート > ルートの編集をクリック
> ルートの編集 > ルートの追加をクリック
> 以下のテーブルを記載したあと、「ルートの保存」をクリック
送信先 | 0.0.0.0/0 |
ターゲット | step06で作成したNatゲートウェイ(今回は「NatGateway」)を選択 |
> つづいて画面下側のタブ > サブネットの関連付け > 「サブネットの関連付けの編集」をクリック
> 今回 Route Table Privateに関連付けをする「Private Subnet 1a (172.16.2.0/24)」と「Private Subnet 1c (172.16.4.0/24)」を選択し、「保存」をクリック
> ルートテーブルが以下の表示になっていることを確認
この設定により、Router Table Privateのルートテーブルでは以下が実現されます。
・送信先:それ以外のトラフィックに関してはNatゲートウェイに転送される
step08 クライアントVPNエンドポイントを作成する
次にクライアントVPNエンドポイントを作成します。
若干手順が複雑で、筆者もかなりハマりましたので、本記事では少しでも手順が分かりやすくなるように、2段階に分けて検証した手順をご紹介します。
VPN EndPointを作成するための手順
その2 クライアントVPNエンドポイントを作成するための手順を実施する。
それでは詳しく見ていきましょう。
その1 いったんプライベートサブネットにアクセスするため、踏み台サーバーをパブリックサブネットに作成し、プライベートサブネットに設置したEC2へのSSH通信を確保する
step08で目指す構成
現状では、EC2(webap-01)はプライベートサブネットに設置されているため、アクセスすることができません。
そこで、パブリックサブネットに踏み台EC2(humidai)を仮設し、EC2(webap-01)への通信を確保します。
手順
- パブリックサブネットにEC2(humidai)を作成
- ローカルPCからEC2(humidai)にSSH接続
- EC2(humidai)を経由して、プライベートサブネットのEC2(webap-01)に接続
その1 パブリックサブネットにEC2(humidai)を作成
まず、今回設定するパラメーターについてみていきます。
今回設定するパラメーター
作成するEC2の名前 | humidai |
VPC | step01で作成したVPC(今回はTest-VPC) |
サブネット | step02で作成したサブネット(今回はPublic subnet 1a) |
自動割り当てパブリックIP | 有効 |
新しいセキュリティグループ | 今回はwebap-sg |
webap-sgの設定値
タイプ SSH ソース 0.0.0.0/0
タイプ HTTP ソース 0.0.0.0/0
なお、EC2を作成する手順については、キーペアを作成する手順も含めて前回の課題カリキュラムで手順を記載しましたのでご覧ください。
EC2を作成する手順(キーペアの作成手順を含む)
>> AWSでシングル構成でワードプレスのブログサービスを構築する手順の概要/step05 EC2を作成する
EC2(humidai)を作成する際の注意点
ローカルPCからEC2(humidai)にSSH接続
踏み台EC2(humidai)が作成できたら、SSHでログインしてみましょう。
パブリックIPはインスタンスの詳細画面で確認可能です。図A
EC2(humidai)を経由して、プライベートサブネットのEC2(webap-01)に接続
次に、いよいよプライベートサブネットのEC2(webap-01)に接続します。
筆者はWindows10の環境でTeraTermのSSH転送機能を利用してログインしました。
この手順もやや複雑ですので、がんばっていきましょう!!
TeraTermのSSH転送機能を利用してパブリックからプライベートサブネットに接続する手順
> 設定
> SSH転送をクリック 図B-1
> 「追加」をクリック図B-2
表C
ローカルのポート | 10022 |
リモート側のホスト | EC2(webap-01)のローカルIP(今回は172.16.2.10) |
ポート | 22 |
> ファイル
> 新しい接続 を選択 図D
表E
ホスト | 127.0.0.1 |
TCPポート#(P): | 10022 |
表F
ユーザー名 | ec2-user |
認証方式 > 秘密鍵 | 今回ダウンロードしたキーペア「○○.pem」を選択 |
最後にEC2にログインできたことを確認 図G
以上で、EC2(humidai)を経由して、プライベートサブネットのEC2(webap-01)に接続する手順は完了となります。
その2 クライアントVPNエンドポイントを作成するための手順を実施する
つづいて、クライアントVPNエンドポイントを作成し、プライベートサブネットのEC2(webap-01)にSSH接続する手順をご紹介します。
まず、その1でログインしたEC2(humidai)を経由して、プライベートサブネットのEC2(webap-01)にログインします。
なお、手順についてはかなり長くなるため、以前に筆者が検証した手順をAWS CloudTech(#クラテク)のカリキュラムに沿ってリライトしたものをご覧ください。
>> 【AWS】クライアントVPNエンドポイントを作成し、VPN接続する手順
クライアントVPNエンドポイント作成時のパラメーター
名前タグ | VPN-EndPoint |
クライアント IPv4 CIDR | 10.0.0.0/20 ※他で使用しているローカルIPアドレスと重複しないようにすること ※サブネットマスクは制限があるので、/20で設定する |
サーバー証明書 ARN | 前の手順でACMにアップロードした証明書のARNを記載 |
VPC ID | 本手順でアクセスするEC2が所属するVPCを記載(今回はTest-VPC) |
クライアント証明書 ARN | 前の手順でACMにアップロードした証明書のARNを記載 |
セキュリティID | VPNで許容するポートを記載したセキュリティグループを記載(今回はwebap-sg) |
※関連付けするのにしばらく時間がかかります。
表A
関連付け | ・VPC:VPCエンドポイントを設置するVPN ・関連付けるサブネットの選択*:VPCエンドポイントを設置するサブネット ※複数のサブネットを関連付けて冗長化することは可能だが、 料金が発生するので注意 |
セキュリティグループ | ・セキュリティグループの適用: VPNで許容したいポートを含んだセキュリティグループを選択 |
認証ルールの追加 | ・アクセスを有効にする送信先ネット 0.0.0.0/0 |
以上でクライアントVPNエンドポイントの作成は完了です。
この作業では、クライアント端末側にOpenVPNのインストールなどが必要で、結構な作業量になりますよね!作業お疲れさまでした!
step09 ローカルPCから疎通確認をする
最後にEC2(webap-01)でApacheを起動し、Hello, Worldを確認していきましょう。
Apacheのインストール
つづいて、EC2にApacheをインストールします。
rootにスイッチ
$ sudo su -
yum(やむ)のパッケージをアップデート
# yum -y update
「Complete!」と表示されることを確認
Apacheをインストール
# yum -y install httpd
「Complete!」と表示されることを確認
apacheの自動起動設定
# systemctl enable httpd.service
apacheのスタート
# systemctl start httpd.service
apacheのステータス確認
# systemctl status httpd.service
index.htmlを作成する。
# cd /var/www/html
# touch index.html
# vim index.html
index.htmlの記載内容
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
Hello World!!
</body>
</html>
ローカルPCから疎通確認をする
確認手順
> 「Hello, World!!」と表示されることを確認
ハンズオン作業は以上となります。
筆者がつまづいた箇所
3点ハマった個所がありますのでご紹介します。
その1 ELBの設置場所
本記事のStep05でご紹介している部分です。
最初に作業をした際は、ELBをプライベートサブネットに設置したことが原因で、ELBのDNSをブラウザに入れてもエラーとなりました。
1時間ほどはまって原因が分からず、はじめからELBを作り直してみたところ、疎通が確認できました。
その2 ルートテーブルの作成
本記事のStep07 ルートテーブルの作成の箇所で、ルートテーブル作成後に、サブネットの関連付け を行う必要がりますが、この工程を忘れてしまい、EC2に疎通できない状況となりました。
AWSでは何か設定を作成したら、それをアタッチしたり、適用したりする作業が多い印象なので、作業完了後は、作成した設定が正しく適用されているか見直すことで、無駄なトラブル対応時間を減らせるかと思います。
その3 踏み台を経由してプライベートサブネットのEC2とSSH通信を確立
本記事のstep08 クライアントVPNエンドポイントを作成する箇所で、パブリックサブネットの踏み台EC2を経由してプライベートサブネットのEC2にアクセスする手順をご紹介しています。
本記事ではWindows環境ということもあり、TeraTermのポート転送を利用しましたが、この箇所も若干はまりました。
ここについては、本記事でも画面ショットを動作毎に取得して記載していますので、ご参考になればと思います。
また、TeraTermでのSSH接続に関しては、本記事を添削してくださったAWS CloutTech(#クラテク)の講師の方から、マクロを利用した方法があることを教えていただきました。
ありがとうございました!
よろしければ、ご覧になってみてください!
>> 【公式】TeraTermマクロでSSH多段接続(踏み台サーバ経由)を試みる
おわりに
この記事はAWS初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。
AWSについて、基本からしっかり学びたい方にはオススメです!
本記事がお役に立てれば幸いです。