EC2を使ったデプロイパターンの練習
今回のテーマ
1つ前の記事で、初歩のEC2のサイト公開の手順をやってみました。
今回は1つ掘り下げて、以下のテーマで実施します。
- プライベートサブネットにEC2を配置
- ALBを使った可用性パターン
- 「EC2 Instance Connect Endpoint」でプライベートEC2に接続
- プライベートのEC2でyumリポジトリを参照する方法
手順
EC2インスタンスを起動
今回は、プライベートサブネット(AZ2つにそれぞれ)にEC2を配置します。
基本的な設定は、1つ前の記事と同じです。
違いがあるのは、サブネットをプライベートサブネットにして、パブリックIPの自動割り当ては無効化のままとする点です。
また、EC2に関連づけるセキュリティグループはプライベートEC2用に1つ作成しておきます。(AZ2のEC2には同じセキュリティグループの関連付けでOKです)
セキュリティグループルールは、後ほど整備しますので、ここでは設定不要です。
このステップは2つのインスタンスを作成したら完了です。
S3 Endpointを作成
今回はプライベートなEC2にApacheをインストールします。
Apacheのインストールに際して、yumリポジトリが必要ですが、通常はパブリックな(インターネットに接続できる)環境でないと、yumリポジトリを参照できません。
別な方法として、S3に用意されているyumリポジトリを使うこととします。
そのために、プライベートEC2からS3に接続できるように、S3 Endpointを作成します。
VPCコンソールから、エンドポイントを作成で進めます。
サービスカテゴリは「AWSのサービス」、サービスは「S3」の「Gateway」タイプを選択します。
「S3 Endpoint」にはGatewayとInterfaceの2種類がありますが、Interfaceは料金が発生しますので、特に要件がなければGatewayで良いです。
VPCは今回使用するVPCを選択し、プライベートサブネット用のセキュリティグループを選択して、エンドポイントを作成します。(プライベートのEC2からの接続が可能になります)
EC2 Instance Connect Endpointを作成
エンドポイント用のセキュリティグループ作成
エンドポイント作成の前に、このエンドポイントに関連づけるセキュリティグループを作成します。
VPCは今回使用するVPCを選択します。
インバウンドルールはなし、アウトバウンドルールはSSH(22)でプライベートEC2のセキュリティグループを指定します。
プライベートEC2のセキュリティグループを変更
インバウンドルールとして、SSH(22)でエンドポイント用のセキュリティグループを指定して保存します。
これで、プライベートEC2はEC2 Instance Connect EndpointからのSSHのみ許可された状態となります。
エンドポイント作成
先ほどと同じくVPCコンソールから、エンドポイントを作成で進めます。
サービスカテゴリは「EC2インスタンス接続エンドポイント」を選択します。
VPCは今回使用するVPCを選択、セキュリティグループは、エンドポイント用に作成したセキュリティグループを選択します。
サブネットは、プライベートサブネットの片方を選択して、エンドポイントを作成します。
(注意点)
EC2インスタンス接続エンドポイントは標準では1つしか作成できません。
今回はプライベートサブネット2つにそれぞれEC2を配置しているので、2つのエンドポイントが欲しいところですが、クォータを引き上げないと不可能です。
今回はクォータの引き上げまではやらないので、EC2セットアップが終わったら、エンドポイントを作り直すこととします。(手間です)
EC2のセットアップ
EC2インスタンスへ接続
コンソールから作成したEC2に接続します。
インスタンスへの接続方法は「EC2 Instance Connectエンドポイントを使用して接続する」。
EC2 Instance Connectエンドポイントは先ほど作成したEC2 Instance Connect Endpointを選択して接続します。(エンドポイントは1つしか作れていませんので、該当するサブネットのEC2をセットアップします)
Apacheをセットアップと動作確認
CLIからの手順は別ブログを参照してください。
テストページデプロイ
CLIから作成する手順で以下のHTMLファイルを作成します。
今回は、2つのEC2インスタンス(サブネット)を区別できるように、ページタイトルにAZを記載しておきます。
cd /var/www/html
vi index.html
>> 以下、viで記述
<html lang="ja">
<head>
<meta charset="utf-8">
<title>test page A</title>
</head>
<body>
<h1>Hello TestPage A</h1>
</body>
</html>
// viを保存で閉じる
もう片方のサブネットもセットアップ
EC2 Instance Connect Endpointを一旦削除して、もう片方のサブネット用で再作成して、同じ手順でもう片方のEC2もセットアップします。
EC2 Instance Connect Endpointは料金が発生しますので、作業が完了したら削除しておくことをお勧めします。
ALBのセットアップ
ここまでで、EC2インスタンスを2つセットアップが完了していますので、それらをターゲットとしたALBのセットアップを行います。
EC2はプライベートなので、それ自体では外部公開はされません。
ALBは、可用性(負荷分散)だけでなく、外部公開の役割も持たせます。
ターゲットグループの作成
EC2コンソールからターゲットグループ、「ターゲットグループの作成」で進めます。
プロトコルはHTTP(80)のままでOKです。
ターゲットタイプは「インスタンス」を選択し、VPCは今回のVPCを選択します。
インスタンスの選択では、今回のプライベートのEC2を2つとも選択し、「保留中として以下を含める」をすることでターゲットとして選択されます。
この状態で「ターゲットグループの作成」を行います。
セキュリティグループを作成の調整
まず、ロードバランサー用にセキュリティグループを用意します。
インバウンドでHTTP(80)で0.0.0.0/0で良いでしょう。(何か特定のトラフィックで制約する場合はそれを考慮)
次に、プライベートEC2のセキュリティグループに変更を加えます。
先ほどまで使用していた、「EC2 Instance Connect Endpoint」からのインバウンドルールは削除してもかまいません。
今回は、ロードバランサー用のセキュリティグループからのインバウンドルールをHTTP(80)で追加します。
これで、ロードバランサーからのトラフィックのみ許可ということになります。
ロードバランサーの作成
EC2コンソールからロードバランサー、「ロードバランサーの作成」で進めます。
ロードバランサータイプは「Application Load Balancer」で作成します。
今回は外部公開するので、スキームは「インターネット向け」を選択します。
VPCは今回のVPCを選択します。
マッピングはパブリックサブネットを選択します。パブリックサブネットは2つのAZで作成していたので両方選択します。
こうすることでALB自体も可用性が確保できます。
セキュリティグループは、先ほど作成したロードバランサー用のセキュリティグループを選択します。
リスナーにはHTTP(80)のまま、先ほど作成したターゲットグループを指定します。
今回はWAFなどは適用しません。(料金が発生するため)
この設定で「ロードバランサーの作成」をします。
テスト
ロードバランサーのDNS名をコピーして、ブラウザのURLにhttp://で貼り付けてください。
まずは片方の画面が表示されると思います。
そうしたら、画面を再描画してみましょう。そうするともう片方の画面が表示されればALBが正常に動作しています。
まとめ
以上で4つのテーマを網羅した手順は完遂です。
プライベートEC2への接続には、EC2 Instance Endpointを使うという方法では、クォータの引き上げが必要ということで、複数のインスタンスにはちょっと向かないかもしれません。
次回は、他の方法としてSession Managerでの接続を試してみたいと思います。