Auto Scalingを使用しEC2を1台で運用する
Auto Scalingを使用しEC2を1台で運用する:
ネットワーク構成などの相談に乗っていると、下記のパターンで以下の相談を受けることが多々あります。
そんな時にお手軽にできる1つの方法を紹介しようと思います。
比較的簡単に構成できるようコア部分だけの構成にしてあるので、実際の運用の際には紹介する構成に肉付けしていくのがいいと思います。
また、以下の構成を自分で理解し組み立てることは、ソリューションアーキテクトアソシエイトなどの試験勉強にもなると思います。ぜひご活用ください。
もっとこうした方がいいんじゃない?という方はコメントでご指摘よろしくお願いします。
以下の作業、私はシドニーリージョンで作業します。(東京リージョンはプライベートなVPCが多くあるため。)
リージョンによる違いはほぼないので手を動かす方はお好きなリージョンで作業してください。
AWSリソースにつける名前は各自変更してしまっても大丈夫です。
なお、サブネットって?CIDRって?といった基本事項は解説しないので都度ご自分で調べてお進みください。
左上のサービスタブからVPCと検索し、VPC設定画面へ
サイドバーのVPCをクリックし、CreateVPCボタンをクリック
以下の情報を入力し、右下のCreateボタンからVPCを作成。
VPC内のEC2インスタンスがインターネットと通信できるよう、インターネットゲートウェイ(IGW)を作成します。
サイドバーのインターネットゲートウェイを選択し、インターネットゲートウェイの作成ボタンをクリック。
以下を入力し作成ボタンをクリック。
作成したIGWを選択肢、アクションボタンのVPCにアタッチを選択。
先ほど作成した
状態が
最終構成図イメージであげたような2つのAZ(アベイラビリティゾーン)にまたがる構成にしたいので、2つのサブネット(今回はパブリックなサブネット)を作成します。まず1つ目のサブネットを作成していくので下記手順を参照してください。
サイドバーのサブネットを選択し、サブネットの作成を選択。
遷移先画面にて以下の情報を入力し、作成ボタンをクリック。
同様にして2つ目のサブネットを作成する。
2つ目のサブネット作成の際に入力する情報例は以下。
作成した1つのサブネットを選択し、アクションから自動割り当てIP設定の変更を選択。
IPv4の自動割り当てを有効にして保存。
もう1つのサブネットにも同様の設定をする。
サブネットのルーティングを変更する。
作成したサブネットの1つを選択肢、ルートテーブルタブからルートテーブルID(画像上のrtb-0b26e981cc9fe8d9d部分)をクリック。
Routesタブを選択し、EditRouteボタンをクリック。
Add routeボタンをクリックし、以下の情報を入力しSave Routeボタンをクリック。
変更後のRoutesタブ。
インスタンスに対するファイアウォールの役割を果たすセキュリティグループ(SG)を作成します。
今回、オートスケーリングの対象EC2インスタンスはパブリックなサブネットに配置されるます。そのことを踏まえ作成しましょう。
左上のサービスからEC2を検索し、選択。
サイドバーのセキュリティグループを選択し、セキュリティグループの作成ボタンをクリック。
クリック後に現れるモーダルに以下の情報を入力し、作成ボタンをクリック。
セキュリティグループのルールにはHTTPとSSHを追加し、画像のように設定してください。
これでWEBサーバ用のSGが作成できました。区別しやすいようにName欄にグループ名と同じ値を設定しておきます。
次はロードバランサー用のセキュリティグループ(SG)を作成します。
先ほどのセキュリティグループを作った手順と同様、セキュリティグループの作成ボタンをクリックし、以下の情報を入力して作成してください。
ELBはHTTPのみ受け付けるよう、インバウンドのルールにHTTPを画像のように追加してください。
こちらもわかりやすくするためにNameにグループ名と同じ値を設定します。
ターゲットグループとは、ロードバランサーが受け付けたリクエストの振り分け先のことです。
サイドバーのターゲットグループを選択し、ターゲットグループの作成ボタンをクリック。
モーダルに表示された項目のうち以下の4つの情報を入力&変更しターゲットグループを作成します。
ターゲットグループの作成が完了したので、ロードバランサーを作成します。
サイドバーのロードバランサーを選択し、ロードバランサーの作成ボタンをクリックしてください。
今回はWEBサーバが対象なので、遷移した画面で一番左のApplication Load Balancerを選択します。
ステップ 1: ロードバランサーの設定画面では、以下の項目を入力&編集してください。
また、アベイラビリティーゾーンの項目では、VPCとしてQiita_VPCを選択し、作成した2つのサブネットを全て選択してください。
最後に区別しやすいよう、タグ項目でName、Qiita-ALBと入力します。
以上のように入力したら、セキュリティグループの設定画面まで何もせずに手順を進めます。
セキュリティグループの設定画面では、既存のセキュリティグループから先ほど作成したQiita_ALB_SGを選択し次の手順へと進みます。
ルーティングの設定画面で、以下の入力&修正をし、何もせずに最後の確認画面へと進みます。
最後の確認画面で入力が間違っていないかどうか確認し、一覧でQiita-ALBが作成されているかどうか確認しましょう。一覧画面で状態がavailableになったら完了です。
ここまででAuto Scalingを実施する前段階の構成が完了しました。
構成図は以下のようになります。
では、本題であるAuto Scalingの設定をしていきます。
起動設定はAuto ScalingでどのようなEC2インスタンスを起動していくのかという設定をします。
サイドバーの起動設定を選択し、起動設定の作成をクリックしてください。
遷移先でEC2テンプレートが選択できるので、今回は上から2番目のAmazon Linux AMIを選択して次の手順へ進んでください。
インスタンスタイプは無料枠対象のt2.microを選択し、次の手順へ。
起動設定の作成画面では以下の項目を入力&編集して次の手順へ進みましょう。
高度な詳細項目でユーザーデータを入力しています。これはインスタンスが立ち上がる際にシェルスクリプトを実行してくれます。今回はWEBサーバを立てたいので最低限の機能が揃うシェルスクリプトを記載しました。
セキュリティグループの設定では既存のセキュリティグループからQiita_WEB_server_SGを選択。
確認画面で誤りがないことを確かめ、起動設定を作成します。
最後にキーペアの作成に関して尋ねられるので、作成してなければ下記の画面のように新しくキーペアを作成します。
キーペアはダウンロードし、大切に保管しましょう。
本題のAuto Scalingグループを作成します。Qiita_VPCのVPCIDが必要になるので、あらかじめVPCコンソールへいき、Qiita_VPCのIDを控えておきます。
サイドバーのAuto Scalingグループを選択し、Auto Scalingグループの作成ボタンをクリック。
遷移先画面で起動設定を選択し、既存の起動設定からQiita_LCを選択。次のステップへ進みます。
遷移先画面の項目で以下のように入力&編集しましょう。
上記の設定をし、ELBに配下のインスタンスの状態をチェックさせ、Auto Scalingの判断をさせます。
次の画面では
タグの設定画面まで進みます。こちらで設定するタグはAuto Scalingで立ち上げたインスタンスに付与することができます。今回は以下の画像のようなタグを設定しましたが、各自わかりやすいタグをつけてあげるとインスタンス管理が便利になります。
確認画面までいったらAuto Scalingグループを作成しましょう。しばらくすると設定したサブネットにインスタンスが立ち上がります。EC2コンソールへ移動し、確認しましょう。(EC2コンソールへは左上のServicesから移動できます。)
インスタンスが以下の画面のように完全に立ち上がり、(先ほど指定したタグがしっかり付与されています)
ターゲットグループのターゲットタブに目的のインスタンスがステータスhealthyで立ち上がっていたらうまく設定ができています。
最終確認として、ロードバランサーの説明タブにあるDNS名をブラウザに入力し、WEBサーバとして立ち上げたインスタンスにアクセスできるかどうか確認しましょう。I'm healthyの文字が表示されていれば成功です。
1. Auto Scalingで立ち上がったインスタンスを停止。
2. ロードバランサーのDNS名にアクセスし、サーバが落ちているか確認。
3. インスタンス一覧に戻り、新たなインスタンスが作成されるかを確認。
4. しばらくしてからロードバランサーのDNS名にアクセスし、障害発生前と変わりなく I'm healthyが確認できるか確認。
以下、画像を確認しながら手順を辿っていきます。
この時ターゲットグループをチェックすると、停止したインスタンスはdraining(簡単に言うとターゲットから切り離し準備中)状態になっています。
ターゲットグループは以下のような感じです。
DNS名にアクセスするとI'm healthyです。
インスタンスの状態は以下のようになっています。
ダウンタイムは少しあったものの、最初の要件が満たせたのではないのでしょうか。
思った以上に盛りだくさんになってしまいました。
もし最後まで読んでくれた方いましたらありがとうございます。
ですが、自分もAWSをさわり始めた頃は先輩や知り合いに聞いてドキュメントを読み、とにかく最初は写経のような心境でネットワークを構成し感覚を掴みました。これから以上のようなAuto Scaling環境を整えたい人、AWSを勉強していこうと思っている方はぜひ復習してみてくださいね。
何か不都合あればコメントでご指摘お願いします。
概要
ネットワーク構成などの相談に乗っていると、下記のパターンで以下の相談を受けることが多々あります。- お金はできるだけかけたくない。(1台で運用したい)
- 落ちている時間があってもいいので自動的に復旧(新たなインスタンスを立てる)してほしい。
そんな時にお手軽にできる1つの方法を紹介しようと思います。
比較的簡単に構成できるようコア部分だけの構成にしてあるので、実際の運用の際には紹介する構成に肉付けしていくのがいいと思います。
また、以下の構成を自分で理解し組み立てることは、ソリューションアーキテクトアソシエイトなどの試験勉強にもなると思います。ぜひご活用ください。
もっとこうした方がいいんじゃない?という方はコメントでご指摘よろしくお願いします。
この記事を読んで幸せになれる方
- AWS初心者(VPC、サブネット、EC2のなんとなくな理解)で、手を動かしたい人。
- 安くスモールなアプリケーションを自分の手で運用したいとお思いの方。
最終構成図イメージ
事前準備
- AWSアカウントの取得
注意事項
以下の作業、私はシドニーリージョンで作業します。(東京リージョンはプライベートなVPCが多くあるため。)リージョンによる違いはほぼないので手を動かす方はお好きなリージョンで作業してください。
AWSリソースにつける名前は各自変更してしまっても大丈夫です。
なお、サブネットって?CIDRって?といった基本事項は解説しないので都度ご自分で調べてお進みください。
Hands on
Auto Scalingを設定するネットワーク構築
VPCの作成
左上のサービスタブからVPCと検索し、VPC設定画面へサイドバーのVPCをクリックし、CreateVPCボタンをクリック
以下の情報を入力し、右下のCreateボタンからVPCを作成。
Name tag: Qiita_VPC IPv4 CIDR block: 10.0.0.0/16
インターネットゲートウェイの作成&アタッチ
VPC内のEC2インスタンスがインターネットと通信できるよう、インターネットゲートウェイ(IGW)を作成します。サイドバーのインターネットゲートウェイを選択し、インターネットゲートウェイの作成ボタンをクリック。
以下を入力し作成ボタンをクリック。
Name タグ: Qiita_IGW
作成したIGWを選択肢、アクションボタンのVPCにアタッチを選択。
先ほど作成した
Qiita_VPC
を選択し、アタッチボタンをクリック。状態が
attached
になり、IGWがVPCにアタッチされました。
サブネットの作成&自動パブリックIP割り当ての設定
最終構成図イメージであげたような2つのAZ(アベイラビリティゾーン)にまたがる構成にしたいので、2つのサブネット(今回はパブリックなサブネット)を作成します。まず1つ目のサブネットを作成していくので下記手順を参照してください。サイドバーのサブネットを選択し、サブネットの作成を選択。
遷移先画面にて以下の情報を入力し、作成ボタンをクリック。
名前タグ:Qiita_PUB_SUB_a VPC:Qiita_VPC アベイラビリティゾーン:ap-southeast-2a (東京リージョンならap-northeast-1a) IPv4 CIDR ブロック: 10.0.10.0/24
同様にして2つ目のサブネットを作成する。
2つ目のサブネット作成の際に入力する情報例は以下。
名前タグ:Qiita_PUB_SUB_c
VPC:Qiita_VPC
アベイラビリティゾーン:ap-southeast-2c (東京リージョンならap-northeast-1c)
IPv4 CIDR ブロック: 10.0.11.0/24
作成した1つのサブネットを選択し、アクションから自動割り当てIP設定の変更を選択。
IPv4の自動割り当てを有効にして保存。
もう1つのサブネットにも同様の設定をする。
サブネットルートテーブル更新
サブネットのルーティングを変更する。作成したサブネットの1つを選択肢、ルートテーブルタブからルートテーブルID(画像上のrtb-0b26e981cc9fe8d9d部分)をクリック。
Routesタブを選択し、EditRouteボタンをクリック。
Add routeボタンをクリックし、以下の情報を入力しSave Routeボタンをクリック。
Destination:0.0.0.0/0 (デフォルトルート、外の世界へ通じるIPアドレスです) Target: Internet GateWayからQiita_IGWを選択
変更後のRoutesタブ。
セキュリティグループの作成(EC2用)
インスタンスに対するファイアウォールの役割を果たすセキュリティグループ(SG)を作成します。今回、オートスケーリングの対象EC2インスタンスはパブリックなサブネットに配置されるます。そのことを踏まえ作成しましょう。
左上のサービスからEC2を検索し、選択。
サイドバーのセキュリティグループを選択し、セキュリティグループの作成ボタンをクリック。
クリック後に現れるモーダルに以下の情報を入力し、作成ボタンをクリック。
セキュリティグループ名:Qiita_WEB_server_SG 説明:Qiita_WEB_server_SG VPC:Qiita_VPC
これでWEBサーバ用のSGが作成できました。区別しやすいようにName欄にグループ名と同じ値を設定しておきます。
セキュリティグループの作成(ELB用)
次はロードバランサー用のセキュリティグループ(SG)を作成します。先ほどのセキュリティグループを作った手順と同様、セキュリティグループの作成ボタンをクリックし、以下の情報を入力して作成してください。
セキュリティグループ名:Qiita_ELB_SG 説明:Qiita_ELB_SG VPC:Qiita_VPC
こちらもわかりやすくするためにNameにグループ名と同じ値を設定します。
ターゲットグループの作成
ターゲットグループとは、ロードバランサーが受け付けたリクエストの振り分け先のことです。サイドバーのターゲットグループを選択し、ターゲットグループの作成ボタンをクリック。
モーダルに表示された項目のうち以下の4つの情報を入力&変更しターゲットグループを作成します。
ターゲットグループ名: Qiita-TG VPC: Qiita_VPC (ヘルスチェックの詳細設定) 正常のしきい値:2 間隔:10
ロードバランサーの作成
ターゲットグループの作成が完了したので、ロードバランサーを作成します。サイドバーのロードバランサーを選択し、ロードバランサーの作成ボタンをクリックしてください。
今回はWEBサーバが対象なので、遷移した画面で一番左のApplication Load Balancerを選択します。
ステップ 1: ロードバランサーの設定画面では、以下の項目を入力&編集してください。
名前:Qiita-ALB
また、アベイラビリティーゾーンの項目では、VPCとしてQiita_VPCを選択し、作成した2つのサブネットを全て選択してください。
最後に区別しやすいよう、タグ項目でName、Qiita-ALBと入力します。
以上のように入力したら、セキュリティグループの設定画面まで何もせずに手順を進めます。
セキュリティグループの設定画面では、既存のセキュリティグループから先ほど作成したQiita_ALB_SGを選択し次の手順へと進みます。
ルーティングの設定画面で、以下の入力&修正をし、何もせずに最後の確認画面へと進みます。
ターゲットグループ:既存のターゲットグループ 名前:Qiita-TG
最後の確認画面で入力が間違っていないかどうか確認し、一覧でQiita-ALBが作成されているかどうか確認しましょう。一覧画面で状態がavailableになったら完了です。
ここまででAuto Scalingを実施する前段階の構成が完了しました。
構成図は以下のようになります。
Auto Scalingの設定
では、本題であるAuto Scalingの設定をしていきます。
起動設定の作成
起動設定はAuto ScalingでどのようなEC2インスタンスを起動していくのかという設定をします。サイドバーの起動設定を選択し、起動設定の作成をクリックしてください。
遷移先でEC2テンプレートが選択できるので、今回は上から2番目のAmazon Linux AMIを選択して次の手順へ進んでください。
インスタンスタイプは無料枠対象のt2.microを選択し、次の手順へ。
起動設定の作成画面では以下の項目を入力&編集して次の手順へ進みましょう。
高度な詳細項目でユーザーデータを入力しています。これはインスタンスが立ち上がる際にシェルスクリプトを実行してくれます。今回はWEBサーバを立てたいので最低限の機能が揃うシェルスクリプトを記載しました。
userData.sh
#!/bin/bash sudo yum update -y # apacheをインストール sudo yum install httpd -y # apacheの起動 sudo service httpd start # /var/www/html/ ディレクトリ以下にI'm healthyと記入されたindex.htmlを作成 sudo echo "I'm healthy" > /var/www/html/index.html
セキュリティグループの設定では既存のセキュリティグループからQiita_WEB_server_SGを選択。
確認画面で誤りがないことを確かめ、起動設定を作成します。
最後にキーペアの作成に関して尋ねられるので、作成してなければ下記の画面のように新しくキーペアを作成します。
キーペアはダウンロードし、大切に保管しましょう。
Auto Scalingグループの作成
本題のAuto Scalingグループを作成します。Qiita_VPCのVPCIDが必要になるので、あらかじめVPCコンソールへいき、Qiita_VPCのIDを控えておきます。サイドバーのAuto Scalingグループを選択し、Auto Scalingグループの作成ボタンをクリック。
遷移先画面で起動設定を選択し、既存の起動設定からQiita_LCを選択。次のステップへ進みます。
遷移先画面の項目で以下のように入力&編集しましょう。
グループ名:Qiita_ASG ネットワーク:Qiita_VPCのIDを選択 サブネット:作成した2つのパブリックなサブネットを選択 高度な詳細 ロードバランシング:チェックを入れる ターゲットグループ:Qiita-TG ヘルスチェックのタイプ:ELBにチェック
上記の設定をし、ELBに配下のインスタンスの状態をチェックさせ、Auto Scalingの判断をさせます。
次の画面では
このグループを初期のサイズに維持する
にチェックします。これと前画面の設定により、最低1つ最大1つのインスタンスを立てるAuto Scalingポリシーを設定することができます。タグの設定画面まで進みます。こちらで設定するタグはAuto Scalingで立ち上げたインスタンスに付与することができます。今回は以下の画像のようなタグを設定しましたが、各自わかりやすいタグをつけてあげるとインスタンス管理が便利になります。
確認画面までいったらAuto Scalingグループを作成しましょう。しばらくすると設定したサブネットにインスタンスが立ち上がります。EC2コンソールへ移動し、確認しましょう。(EC2コンソールへは左上のServicesから移動できます。)
インスタンスが以下の画面のように完全に立ち上がり、(先ほど指定したタグがしっかり付与されています)
ターゲットグループのターゲットタブに目的のインスタンスがステータスhealthyで立ち上がっていたらうまく設定ができています。
最終確認として、ロードバランサーの説明タブにあるDNS名をブラウザに入力し、WEBサーバとして立ち上げたインスタンスにアクセスできるかどうか確認しましょう。I'm healthyの文字が表示されていれば成功です。
擬似障害を起こそう
落ちている時間があってもいいので自動的に復旧(新たなインスタンスを立てる)してほしい。最初に述べた以上の要求を満たすために擬似的な障害を起こしてみましょう。様々な再現方法がありますが、今回はシンプルにインスタンスを手動で停止しましょう。手順は以下の通りです。
1. Auto Scalingで立ち上がったインスタンスを停止。
2. ロードバランサーのDNS名にアクセスし、サーバが落ちているか確認。
3. インスタンス一覧に戻り、新たなインスタンスが作成されるかを確認。
4. しばらくしてからロードバランサーのDNS名にアクセスし、障害発生前と変わりなく I'm healthyが確認できるか確認。
以下、画像を確認しながら手順を辿っていきます。
この時ターゲットグループをチェックすると、停止したインスタンスはdraining(簡単に言うとターゲットから切り離し準備中)状態になっています。
ターゲットグループは以下のような感じです。
DNS名にアクセスするとI'm healthyです。
インスタンスの状態は以下のようになっています。
ダウンタイムは少しあったものの、最初の要件が満たせたのではないのでしょうか。
後片付け
- Auto Scalingグループの削除
- ELBの削除
- VPCの削除
最後に
思った以上に盛りだくさんになってしまいました。もし最後まで読んでくれた方いましたらありがとうございます。
ですが、自分もAWSをさわり始めた頃は先輩や知り合いに聞いてドキュメントを読み、とにかく最初は写経のような心境でネットワークを構成し感覚を掴みました。これから以上のようなAuto Scaling環境を整えたい人、AWSを勉強していこうと思っている方はぜひ復習してみてくださいね。
何か不都合あればコメントでご指摘お願いします。
コメント
コメントを投稿