こんにちは!
新卒1年目、クラウドインテグレーション(CI)部5課でOJT中の加藤ゆです。
サーバーワークスでは、OJTで取り組む技術研修課題なるものがあります。
その課題の中で、私が本気でつまずいたポイントをご紹介します!こけすぎて心折れたのでブログにしてみました!
構築済み環境
- PrivateSubnet(private-subnet-1)
- EC2:1台(web01)
- PrivateSubnet(private-subnet-2)
- EC2:1台(web02)
- Public Subnet(public-subnet-1)
- EC2:1台(linux)
- NATゲートウェイ(nat-geteway)
- Public Subnet(public-subnet-2)
- NATインスタンス(nat-instance)
- Public Subnetを跨いでALBを設置
こんな感じです。
public-subnet-1は、デフォルトルート(送信先:0.0.0.0/0)がNAT- Gatewayを向く
public-subnet-2は、デフォルトルート(送信先:0.0.0.0/0)がNATインスタンスを向く
上記2点のルートテーブルを設定
やりたいこと
1. プライベートサブネットのEC2にSSH接続
2. プライベートサブネットに立てたEC2(Webサーバー)にALBを使ってHTTP接続
プライベートサブネットのEC2のどちらにもApacheをインストールし、Webサーバとして利用します。
そのためにプライベートサブネットのEC2にSSH接続をしたいなと思いました。
ここが分からない
どこからプライベートサブネットのEC2に接続すれば良いか分からない…!
プライベートにあるので、インターネットからの接続は出来ない。
パブリックにある何かを経由して接続する必要がある。
ここまで理解はしていたのですが「パブリックにある何か」って現環境で4つあるじゃんと思って…。
内、NAT-Gatewayは内部からインターネットへの接続を許可するものという理解だったので、除いた3つでどうしよう、と思っていました。
接続の仕方案
1. プライベートのEC2にEIPをつける(+ルーティングとセキュリティグループをインターネットからのSSH可能に変更)
- 強制的にパブリックにする作戦
2. ELBを経由する
- ターゲットを1つにして、リスナー(外部からアクセスするプロトコル・ポート)にSSHを許可する
- 今回はALB(HTTP・HTTPSに対応)なので無理そう
3. パブリックのEC2を利用する
- EC2インスタンスかNATインスタンスを利用してSSH接続
プライベートサブネットのEC2に接続するためにどれ使うかなんて、
おそらく当たり前すぎるとは思うんですが、新人という免罪符で本気で悩みました。
用途を考える
EIP
インターネットと通信するインスタンスは、インターネットから接続可能なIPを持つ必要があります。 「インターネットから接続可能」という点では、パブリックIPアドレスとEIPのどちらでも良いわけですが、AWSの仕様で、EC2を停止・起動するたびにパブリックIPアドレスは変わってしまします。
その度にIPアドレスに纏わる設定をいじらなければならないというのは、だいぶ手間ですね。
そんなときの為に、IPを固定できるEIPを利用します。
AWS Elastic IPアドレス (EIP) とは何か? 利用用途とメリットを解説 - サーバー構築と設定 ~初心者にも分かりやすく解説~
今回私が検討に入れたやり方は、
EIPをつけルーティングを変更するというもはやプライベートサブネットではなく一時的にパブリックサブネットにしてしまおう!というものなので、最善策とは言えないやり方です。
ELBを経由する
ALBの外部からアクセスするプロトコル・ポートをSSH22番を設定したら、もしやいける…!?
ターゲットを1つにしてSSH用の穴をあけたら、プライベートサブネットのEC2に到達出来る…!?
と思いました。
しかし今回作成したのはALBなので、プロトコルはHTTP・HTTPSのみに対応ということで出来ません。
(ALB を含む) ELB は EC2 インスタンス等をターゲットとする負荷分散が目的のサービスです。
何にせよこのやり方はALBの利用方法としてあまり相応しくないですね。
[AWS Black Belt Online Seminar] Elastic Load Balancing (ELB) 資料及び QA 公開 | Amazon Web Services ブログ
パブリックサブネットのEC2利用
これが正解ですね!!
今回の環境では、パブリックサブネットにEC2インスタンスは2種(NATインスタンスと普通のEC2インスタンス)あります。
一度パブリックサブネットのインスタンスへSSHで接続をし、そのインスタンスからプライベートサブネットのインスタンスへSSH接続。
このように、プライベートサブネットのインスタンスにSSHする為に経由するサーバーを踏み台サーバーと呼ぶわけです。
- 踏み台サーバー
- プライベートサブネットのインスタンスにSSH(RDP)する為に経由するサーバー
- 名前の通り、別サーバーに接続時に踏み台となる
- 踏み台を利用する事で、インターネットからの直接的なアクセスをすることなくセキュアにプライベートサブネットのインスタンスに接続が出来る
【VPC】踏み台サーバーを考える - サーバーワークスエンジニアブログ
この踏み台サーバーの存在をフワッとしか理解していなかったので、私は迷子になりました。
パブリックサブネットサブネットに置いたNATについても、めちゃ簡単に記載しておきます。
NATとは
- IPアドレスを変換するシステムで、インターネット向けの通信をするときにIPアドレスを変換してくれる
NATインスタンス
- プライベートサブネットに配置されたサーバーから外部サイトへアクセスするときに利用する
- 元はEC2インスタンスなので、運用管理はユーザが行い、踏み台サーバーとしての利用が可能。セキュリティグループをアタッチして管理するため、許可する通信を設定する必要がある。
NAT- Gateway
- NATインスタンスの構築を自動でやってくれるAWSサービス
- セキュリティグループは無く、内部からの通信であれば許可。入ってきたものは全て外に運ぶ。
- ステートフルなため、戻ってくる通信は中からのリクエストであることが保証される。踏み台サーバーとしての利用は出来ない。
Gatewayが多過ぎて何がなんなのかわからない?AWSのGateway全種類解説!ーその1 - サーバーワークスエンジニアブログ
NAT ゲートウェイと NAT インスタンスの比較 - Amazon Virtual Private Cloud
NAT ゲートウェイ - Amazon Virtual Private Cloud
接続を整理しましょう ~セキュリティグループとルートテーブル~
どのSGにどのIP・ポート用に穴をあければいいかよく分からず…。
当初設定していたセキュリティグループのインバウンド設定はこんな感じです。
それぞれ用途に合わせてポートをあけるべきですが、
HTTPもSSHもとりあえずどっちも全部開けとくか!みたいな設定の仕方をしていたので、各インスタンスがどのポートからの接続をする為に存在しているのか意識出来ていませんでした。
本当は、もっといらないインバウンド通信を沢山許可していたんですが、ツッコミどころが多すぎて書くのがめんどくさくなったので省きます。
パブリックサブネットのEC2インスタンスのSG
元々パブリックサブネットにEC2を1台と、NATインスタンンスを1台立てていました。
立てたのは良いんですけど、立てることが目的の研修課題として作成したので何の用途かあまり考えず…。
EC2は普通にサーバーとしても利用できる、という理解があったので踏み台ではなくHTTP接続もする?のか?とか考えまして…(中略)大変でした。
踏み台サーバとしてSSH接続のために利用するのでパブリックサブネットのEC2はSSH接続さえ許可していれば良いんです!
パブリックサブネットの踏み台EC2は、SSH(22)を許可
プライベートサブネットのEC2インスタンスのSG
Webサーバーへの接続は2種類のみ
①ALBから負荷分散されるターゲットとして、Webサーバーに接続
- 「ALBからのHTTP(80)」のインバウンド
②踏み台からのSSH接続
- 「各パブリックサブネットのEC2からのSSH(22)」のインバウンド
プライベートサブネットのWebサーバは、
ALBからのHTTP(80)+ 各パブリックサブネットのEC2からのSSH(22)を許可
通信経路
ルートテーブルを設定する - Amazon Virtual Private Cloud
SGとルートテーブルを両方書くと、こんなごっちゃになるんですね
インバウンド通信
インターネットからのHTTP通信は、ALBを通りプライベートサブネットのEC2(Webサーバー)に接続します。 (紫線)
プライベートサブネットのEC2インスタンスにSSH接続する場合は、パブリックサブネットのEC2インスタンスに社内VPNから接続し、このインスタンスを踏み台にしてプライベートサブネットのEC2(Webサーバー)に接続します。(青線)
EC2インスタンスの踏み台がある環境下では、NAT Instanceを踏み台には使わないそうです。上図ではlinuxのEC2インスタンスからSSHする想定で矢印を向けました。
理由はセキュリティ的に、入り口は絞る!が鉄則なので、原則2台からログインすることは無いからです。また2台でログインをしていると鍵の管理が面倒になるという点もあるようですね。
これも私の知らなかったけど重要だったポイントです。
アウトバウンド通信
- VPC外のIPアドレスに対して通信したい時
例えば、プライベートサブネットのインスタンスでyum installとか実行する時ですね!
ルートテーブルには、0.0.0.0/0がNAT-Gateway or NATインスタンスを向くように設定しています。したがって、インスタンスからインターネットへ出ていきたい場合には、NATを経由します。
- リクエストに対してレスポンスしたい時
踏み台を利用したSSH接続・プライベートIPアドレスに変換されてきた通信等は、帰り道が分かっているのでNATを経由せずパブリックサブネットのインスタンスorALBを経由します。
[AWS Black Belt Online Seminar] Elastic Load Balancing (ELB) 資料及び QA 公開 | Amazon Web Services ブログ
感想
という事で!
パブックサブネットにあるEC2を踏み台としてプライベートサブネットのEC2にSSH接続し、WebサーバーにALBを使ってHTTP接続が出来ましたーーー!!:tada:tada
SSH転送やALBの設定は、記事がいっぱい出ているのでそちらを参考にして下さい。
踏み台の使い方も、SGの設定も、ポートの使い方も、きちんと理解できていないとこんなことになるんですね~めちゃめちゃ勉強になります。
この課題を達成するために、今回とりあげたポイント以外にも 、
- SSH転送のルートバックアドレスの使い方
- セキュリティグループのインバウンド設定
- ルートテーブルの向き
- パブリックIPとプライベートIPとEIPの使い分け
- プライベートサブネットのEC2でyumコマンドが打てない
- NATインスタンスの「送信元/送信先チェックの有効化」
- ALBのサブネット選択
このあたりに全部引っ掛かってここまで来ました~
ふざけている訳では無いんですが、なかなかSSH・HTTP接続成功に至らず悲しかったので、こんな新人もいるんだな~と思っていただければと思います。 長かったーーーーー!
参考資料
プライベート IP アドレスを持つ EC2 インスタンスをインターネット向け ELB ロードバランサーにアタッチする
Application Load Balancer の作成 - Elastic Load Balancing
SSH転送(ポートフォワード)でリモートデスクトップ接続 | Tera Term(テラターム)の便利な使い方
AWSのセキュリティグループの許可ソースにセキュリティグループを設定するパターンとは – エンタープライズIT [COLUMNS]