#はじめに
本稿は『VPC + EC2 + Docker でアプリケーションをデプロイする。』の補足として書いています。
何か詰まるところがあれば、上記の記事をみていただけるといいかと思います。
対象読者
- ELB(ALB)の構築方法を知りたい方
- 安定したサービスをデプロイしたい方
- 自分
全体構造
ELB
ELBとは
ELBとは、Elastic Load Balancingの略称でアプリケーションのトラフィックを自動的に複数のターゲットに分散してくれる機能です。
また、トラフィックを複数のAZに分散することもできるので、瞬間的な同時アクセスや何かしらの障害によってAZがダウンしたとしても、他のAZさえ生き残っていればサービスを継続させることができます。すごいです。
今回は、ELBの3つのロードバランサーの1つである、ALBを使用します。
違いは、この記事がさっくりしていてわかりやすかったです。
ELBを含めた設計の流れ
VPCの構築
まずは、前回と同様にどおりVPCとサブネットを構築していきます。
まずはAWSのトップ画面の『サービスを検索する』から『VPC』を選択。
『VPCウィザードの起動』を押下。
現在のサブネットの状況です。
着目すべきは、IPv4とアベイラリティゾーンです。
先ほど作ったサブネットは、『ap-northeast-1a』というAZで、『10.0.0.0/24』のIPを持っています。
では、これと被らないように他のAZでパブリックサブネットをもう1個作ります。
VPCのメニューの『サブネット』を選択。
『サブネットの作成』を押下。
以下のようにして、2つ目のサブネットを作成。
IPv4は、『パブリックサブネット-1a』で『10.0.0.0/24』を使用しているので、今回は『10.0.1.0/24』を使う。
VPCウィザードで構築した1つ目のサブネットは自動でIGWのルーティングがされていますが、2つ目以降は自分で行わなければいけません。
なので、このサブネットのルートテーブルを変更します。
VPCメニューから『サブネット』を選択。
2つ目に作成した、サブネットを選択。
下のメニューの中から『ルートテーブル』を選択して、『ルートテーブルの関連付けの意義』を押下。
すでに選択されているルートテーブルとは違う方を選択。
(この時、このVPCには2つしかルートテーブルが存在しないはず)
ルートの向き先にIGWが存在することを確認して、『保存』を押下。
これで今回使うサブネットの作成が完了しました。
現在の構成図
EC2の作成
前回の記事と変わるところはありません。
ので、1つ目のサブネットにデプロイするとこまではスキップします。
現在の構成図
ELBの構築
いよいよELBを構築していきます。
ELBの細かい説明に関しては、こちらをご覧ください。
EC2メニューから、『ロードバランサー』を選択。
『ロードバランサーの作成』を押下。
Application Load Balancerの『作成』を押下。
以下のようにELBに好きな名前をつける。
ロードバランサーが通信を受ける外部のポート番号を入力。
自分のVPCを選択。
アベイラリティゾーンにチェックを入れ、ELBにつなげるサブネットを選択する。
『次の手順を押下』する。
ちなみに、今回のdocker-compose.ymlは
version: '3.7'
services:
web:
~~ 省略 ~~
ports:
- '3000:3000'
environment:
PORT: 3000
HOST: 0.0.0.0
~~ 省略 ~~
としています。
『新しいセキュリティグループを作成する』を選択。
『セキュリティグループ名』に今回のセキュリティグループの名前(説明も名前と一緒でOK)を記入。
『タイプ』は『カスタムTCP』を選択。
『ポート範囲』は『80』を選択。
『ソース』は『カスタム』『0.0.0.0. ::/0』を選択。
『次の手順』を押下。
『新しいターゲットグループ』を選択して名前を記入。
『ポート』に自分が開くポート番号を記入
『次の手順』を押下。
『登録済みに追加』を押下。
『登録済みターゲット』にEC2のインスタンスが追加されているか確認。
『次の手順』を押下。
以上でELBの作成が完了します。
次に、作成したELBを確認します。
『リスナー』を選択。
『転送先』の自分で設定したターゲット名を押下。
下のメニューの中にある『Target』を押下。
インスタンスとの接続状況はStatusで見ることができます。
最初は『initial』と表示されていると思いますが、インスタンスとの接続が上手くいけば『healthy』になります。
これでELBの作成はいったん完成です。
現在の構成図
AMI
現在のままでは、ELBとしての機能がほぼ死んでます。笑
そのため、ELBが結びつく先のサブネットを増やしてあげます。
増やすサブネットの内容はパブリックサブネット-1aと同じ物なので、そのままコピーしてきます。
この時に、使用するサービスがAMIです。
AMIとは
公式によると、
Amazon マシンイメージ (AMI) は、ソフトウェア構成 (オペレーティングシステム、アプリケーションサーバー、アプリケーションなど) を記録したテンプレートです。AMI から、クラウドで仮想サーバーとして実行される AMI のコピーであるインスタンスを起動します。以下の図に示すように、1 つの AMI の複数のインスタンスを起動することができます。
要するに、Dockerのインスタンス版だと考えていいと思います。
AMIの作成
EC2メニューから『インスタンス』を選択。
自分の複製したいインスタンスを選択。
『アクション』を押下。
『Image and Template』を押下。
『イメージを作成』を押下。
『イメージ名』『イメージの説明』でAMIにつける名前・説明を記入。
『イメージの作成』を押下。
これで、AMIの作成が完了です。
一応確認してみます。
EC2メニューから『AMI』を選択。
先ほど作成されたAMIのステータスがpendingからavailableになれば、無事成功です。
現在の構成図
2つ目のインスタンスの作成
AMIを利用して、2つ目のインスタンスを作成したいと思います。
EC2メニューから、『AMI』を選択。
自分の作成した、AMIを選択。
『起動』を押下。
今回は、『t2.micro』が選択されていることを確認。
『次のステップ』を押下。
『ネットワーク』に今回使用するVPCを、『サブネット』に今回使用するサブネットをそれぞれ選択。
『自動割り当てパブリックIP』は『有効』にしておく。
『次のステップ』を押下。
『既存のセキュリティグループを選択する』を選択。
1つ目のインスタンスと同じセキュリティグループを選択。
『確認と作成』を押下。
そのまま『インスタンスの表示』を押下。
現在の構成図
2つ目のインスタンスをELBに追加
上の構成図を見ると残った工程は、2つ目のインスタンスをELBの行先に追加してあげることのみです。
では早速やっていきましょう。
EC2メニューから『ターゲットグループ』を選択。
今回使用するターゲットグループを押下。
『Target』を選択。
『Register targets』を押下。
2つ目のインスタンス(ap-northeast-1c)を選択。
『Include as pending below』を押下。
このように『Targets』に2個インスタンスが出てくればOK。
前回記事と同じように2つ目のインスタンスにssh接続して docker を起動すればELBの接続が完了です。
現在の構成図
まとめ
以上でELBを使ってデプロイすることができました。
次回は、Route53を使って、DNSを構築していきたいと思います。