teratail新年度特別企画 - 学習チュートリアル 応用編2

ロードバランサを動かしてみよう

チュートリアルをはじめるなら

無料クーポンでさくらのクラウドを触ってみよう!

※無料クーポンの配布期間は終了いたしました。

本チュートリアルは、teratail新年度応援企画「 インフラ技術を極めろ!クラウドマスター認定試験 」の一部として作成されました。

応用編2では、2台のWebサーバをロードバランサで負荷分散し、スケーラブルな環境を構築します。その前に、サーバの通信制御を行うパケットフィルタを作成し、作成するサーバを安全にします。それからサーバに SSHでログインしてApacheを起動し、ロードバランサの動作確認を行いましょう。

▼応用編2で作成する範囲

サーバ作成前の準備作業

安全にログイン可能なWebサーバを作成するため、いくつかの準備作業を行います。

公開鍵認証の設定

応用編2ではインターネットから接続可能なWebサーバの準備を進めます。このサーバに対する安全対策として、SSHログインは公開鍵認証を使う場合のみ許可する設定をします。公開鍵認証の詳細は、さくらのナレッジの記事「よく分かる公開鍵認証」にて解説されているので、ご参照ください。

通常、公開鍵認証を行うには秘密鍵と公開鍵の組み合わせ(鍵ペア)が必要です。さくらのクラウドでは、この鍵ペアをコントロールパネルから作成(生成)する機能があります。作成するには、コントロールパネル右上にある「設定」をクリックします。それから、表示されるメニューの「公開鍵」をクリックし、右上の「追加」をクリックします。

「公開鍵を生成」画面が開きます。「生成」をクリックし、パスフレーズ(サーバへのログイン時のパスワードではなく、鍵の認証時に使います)を入力、名前はsshkeyとします。

鍵ペアを作成すると「秘密鍵ダウンロード」画面が現れます。右下の「ダウンロード」をクリックし、秘密鍵をダウンロードし、安全な場所に保管します。なお、画面にも注釈がありますが、秘密鍵のダウンロードは1回だけですので、扱いにはご注意ください。

パケットフィルタの作成

パケットフィルタはNICに紐付いた通信を制御(通信の許可・拒否)します。今回のチュートリアルでは、Webサーバのルータ+スイッチと接続しているNIC(インターネット側に接続)に対してパケットフィルタを適用します。ウェブからのHTTP通信(ポート80/tcpプロトコル)とSSHのログイン(ポート22/tcpプロトコル)のみを許可し、サーバの安全性を高めます。

なお、パケットフィルタの設定はコントロールパネルからいつでも変更できます。たとえば、より安全に配慮するため"SSH接続時のみパケットフィルタを許可する"ルールにするのも方法の1つです。

パケットフィルタを追加するには、左メニューの「パケットフィルタ」をクリックし、右上の「追加」をクリックします。

「web-filter」と名前を入力し、右下の「作成」をクリックします。

左メニューの「パケットフィルタ」をクリックし、先ほど作成したパケットフィルタの行をダブルクリックします。

パケットフィルタのルールを追加するために、「ルール」タブをクリックし、右下の「追加」をクリックします。

ここでは、以下のスクリーンショットのように、SSH(tcp/22)、HTTP(tcp/80)、一般通信用ポート(tcp・udp/1024~65535)、icmp(PINGなど)の各アクションを許可(allow)し、それ以外は拒否(deny)する設定を追加します。ルールの順番も必ず以下のスクリーンショットと一緒になるように設定してください。

▼パケットフィルタの完成イメージ

「追加」をクリックすると、ルール追加のダイアログが表示されます。
プロトコルは#1/#2/#3のときは「tcp」を、#4のときは「udp」を、#5のときは「icmp」を、#6のときは「ip」を選択してください。
送信元ネットワーク・送信元ポートは全ての場合で空欄で構いません。
宛先ポートは#1のときは「22」、#2のときは「80」、#3/#4のときは「1024-65535」と入力します。#5/#6の場合はポート指定は不要です(ポートを入力する項目自体が表示されません)。
アクションは#6のみ「deny」とし、それ以外は全て「allow」としてください。

ルール追加が完了したら、右上の「反映」をクリックします。

以上で準備が完了しました。次はロードバランサに対応したWebサーバを作成します。

ロードバランサで負荷分散

ここではルータ+スイッチの下に「Webサーバ#1」と「Webサーバ#2」を作成します。この2台のサーバを使い、ロードバランサのVIPに対するトラフィックを負荷分散します。

2台のWebサーバを作成

ロードバランサ用のサーバを作成するには、左メニューの「サーバ」をクリックしてから、右上の「追加」をクリックします。

応用編では詳細な設定を行うため、画面右上の「シンプルモード」をクリックし、チェックを外します。そうしますと、画面の表示が切り替わり、より詳細な設定を行えます。

設定項目は、それぞれ次の通りに設定をお願いします。

サーバプラン

仮想コア「1」、メモリ「1GB」が選ばれたままにします。

ディスク

各項目はそのままにし、"アーカイブ選択"の項目を「CentOS 7.3」(このチュートリアル作成時点における最新バージョン)とします。

NIC

「スイッチに接続」をクリックし、先に作成した「ルータ+スイッチ」を選びます。また、パケットフィルタ「web-filter」も選びます。

ディスクの修正

NICを「ルータ+スイッチ」に接続する場合、サーバのIPアドレスを自分で決めてから、ディスクの修正機能で指定する必要があります。ここで利用できるIPアドレスの範囲は「ルータ+スイッチ」により異なります。
応用編1の「ルータ+スイッチのIPアドレスの確認」で決めましたが、このチュートリアルでは、例として次のIPアドレスを使用します。皆さんの環境にあわせて、IPアドレスは置き換えてください。この例のように、web01・web02で、それぞれのIPアドレスを選択します。また、ネットマスクやゲートウェイの項目は、通常書き換える必要はありません。

ゲートウェイアドレス xxx.xxx.xxx.161 固定(ルータ+スイッチ画面から参照)
ロードバランサのIPアドレス xxx.xxx.xxx.164 任意の空きIPアドレス
ロードバランサのVIP xxx.xxx.xxx.165
web01のIPアドレス xxx.xxx.xxx.166
web02のIPアドレス xxx.xxx.xxx.167

▼ルータ+スイッチの画面

それから、管理ユーザのパスワードを入力します。その下にある「公開鍵」は「選択」を選びます。そして、準備作業で作成した公開鍵の情報をクリックし、チェックを入れます。さらに、より安全性を高めるため、ログイン時にパスワードによる認証を無効化します。「パスワード/チャレンジレスポンスでのSSHログインを許可しない」にチェックを入れます。

ホスト名は「web01」や「web02」を入力します。こちらはサーバの内部でOSが認識するための、自分自身のホスト名です。
そして「配置するスタートアップスクリプト」から「lb-dsr(※Column参照)」を選択します。ロードバランサのVIPを入力するテキストボックスが現れますので、応用編1「スケーラブルなインフラ構築を始めよう」で設定したロードバランサのVIPアドレス(本チュートリアルではxxx.xxx.xxx.165)を入力します。このスタートアップスクリプトの実体はシェルスクリプトであり、サーバ起動時に自動的に様々な処理を実行できます。

【Column】さくらのクラウドのロードバランサ

ロードバランサはDSR(Direct Server Return)方式のため、サーバ内でDSRに対応する設定があります。さくらのクラウドが提供しているスタートアップスクリプト「lb-dsr」を使えば、サーバ内にログインしなくてもDSRに対応した設定を自動的に行えます。
このように、スタートアップスクリプトはDSR以外にもサーバの設定作業を自動化できます。あらかじめ用意されているスクリプト以外にも、任意のスクリプトを設置できます。

サーバの情報

次に、サーバの「名前」を「web01」と入力します。サーバの情報画面で入力した情報は、コントロールパネル上で表示される管理用の名称であり、先ほどのホスト名とは異なります。

そして、最後に「作成」をクリックします。
以上の手順を繰り返し、「web02」も作成しましょう。

WebサーバへのSSHログイン

サーバにSSHでログインし、Webサーバとして動作するソフトウェアのインストールとホスト名を表示する設定をします。

Windowsの場合(※macOS/Linuxの場合はこちら

本チュートリアルではWindows用ターミナルエミュレータTeraTermを例に扱いますが、他のソフトウェアもお使いいただけます。
TeraTermを起動したら、「ホスト」にWebサーバのIPアドレスを入力し、「OK」をクリックします。

初回ログイン時はセキュリティの警告が表示されます。「このホストをknown_hostsリストに追加する」にチェックがあるのを確認し、「続行」をクリックします。

「ユーザ名」に「root」を入力します。「パスフレーズ」には公開鍵の鍵ペア作成時に入力したパスフレーズを入力します。そして、「秘密鍵」をクリックし、先ほどダウンロードした秘密鍵のファイルを選びます。そして「OK」をクリックして接続します。

macOS/Linuxの場合

ダウンロード済みの秘密鍵を使い、SSHで接続できるように設定をします。作業はターミナル、またはシェル上で行います。
はじめに「~/.ssh/」ディレクトリがなければ作成し、パーミッションを自分以外のアクセスができないように設定します。例として秘密鍵に「~/.ssh/」に置きますが、他のディレクトリでも構いません。

    $ mkdir ~/.ssh/
$ chmod 700 ~/.ssh/

それから、ダウンロード済みの秘密鍵を移動し、パーミッションを設定します。ここでは秘密鍵ファイル名の例として「sshkey.pem」を指定していますが、皆さんの環境にあわせて読み替えてください。

    $ mv <ダウンロードしたパス>/sshkey.pem ~/.ssh/sshkey.pem
$ chmod 400 ~/.ssh/sshkey.pem

それから、SSH接続は次のようにコマンドを実行します。「-i」は秘密鍵のパスを指定するオプションです。あとは、初回入力時はホスト鍵情報を確認する「yes」を入力したあと、秘密鍵作成時のパスフレーズを入力します。

    $ ssh -i ~/.ssh/sshkey.pem root@<サーバのIPアドレス>

Apacheのインストールとロードバランサの動作確認

Webサーバにログインしたあとは、Apacheをインストールし、ロードバランサの負荷分散が機能するかどうか調べましょう。
まず、OS(RedHat 7.3)のセキュリティを維持するため、yum updateコマンドでパッケージ情報を最新にします。

    # yum -y update

それから、Apacheというウェブサーバ用のソフトウェアをインストールします。

    # yum -y install httpd

ブラウザから動作を確認できるようにするため、起動します。システムの設定を行うsystemdを制御するコマンドsystemctlを使いましょう。

    # systemctl start httpd
# systemctl enable httpd

また、サーバ起動時にApacheを自動起動できるよう、次のコマンドを実行します。

次に、ドキュメントルート(サイトのトップページとして表示される場所)で表示するページを作成します。次のコマンドを実行し、ファイルを作成します。hostnameコマンドはホスト名を出力するコマンドです。

    # hostname > /var/www/html/index.html

以上の作業をWeb01とWeb02の各サーバで行います。それから、ブラウザでそれぞれのサーバのIPアドレスを開くと、各ホスト名が表示されます。
また、ロードバランサに設定したVIPアドレスを開くと、web01またはweb02のホスト名が表示され、ロードバランサの負荷分散機能を確認できます(なお、さくらのクラウドの負荷分散方式は「最小接続数」のため、ページを再読み込みするたびに交互に表示しません)。
以上でWebサーバの追加と、ロードバランサとしての動作を確認できました。あとは、この環境を使い、必要に応じてWebサーバを増やしたり減らしたりすることで、サービス規模をスケールできます。

サーバの監視

シンプル監視を用いたWebサーバの監視

ロードバランサとWebサーバの準備ができましたので、ここでWebサイトの監視設定を行います。さくらのクラウドでは「シンプル監視」という名称の監視機能が利用できます。シンプル監視は監視用のサーバを準備しなくてもシステムを監視・通知できます。また、監視対象がさくらのクラウドであれば、無料で使えます。
Webサーバの応答を確認するには、コントロールパネルのメニューから「シンプル監視」をクリックし、右上の「追加」をクリックします。

「監視対象」はロードバランサのVIPを入力します。

その他の項目は、次のように指定します。

  • 監視方法 … http
  • パス … /index.html
  • レスポンスコード … 200
  • 状況が変わった際の通知先として、メールまたは Slack を指定できます(任意)

それぞれの項目を入力後、画面を下にスクロールして「作成」をクリックします。
あとは、シンプル監視の一覧画面で、監視対象の左側が緑色に表示されていれば、Webサーバは正常に動作しています。

なお、緑色になるまでにタイムラグがある場合がありますので、緑色になっていない場合は、左上の更新ボタン(下のスクリーンショット赤枠部分)を何回かクリックして、画面を更新してみてください。

なお、シンプル監視は外部からサーバに対して監視を行う外形監視を行うサービスであり、CPU使用率やメモリ使用率、トラフィック量等のサーバ内部のリソース情報を取得/蓄積には対応しておりませんので、リソース監視を行いたい場合は「Mackerel」等のエージェント型監視サービスのご利用をお勧めします。

【Column】Webサーバの監視をやってみよう

Webサーバ自体の動作(外部からの接続を受け付ける状態か)を監視する場合、TCPポートを監視する方法が一般的でした(例:HTTPはTCP80番ポートの応答を監視)。しかし、Webサーバが応答する状態でも、プログラムの誤動作やDBとの接続障害などがあれば、その上で動いているプログラムが正常に動作せず、利用者からはWebサービスが利用できない状態に見えます。
監視で重要なのは、利用者の視点でサービスが正しく動作しているかどうかです。このような状況を避けるため、チュートリアルではHTTP監視機能を利用して、index.htmlがHTTPレスポンスコード200(正常)を返すかを監視します。

ここでは、実際にサーバを停止させて、アラートが届く様子をご紹介します。

さくらのクラウド コントロールパネルにて、左メニューの「サーバ」をクリックし、web01とweb02の左側にチェックを入れ、右上の「電源操作」をクリックし、「シャットダウン」をクリックします。

しばらくすると、以下のような通知がなされます。

HTMLメールの例

メールの送信先は下記です。

  • 緊急連絡用メールアドレスの登録がある場合、登録されている全ての宛先に通知されます。
  • 登録されていない場合は会員IDに登録されているメールアドレス宛に送信されます。

Slack通知の例

それではサーバを起動して、アップ通知が届くか確認します。
さくらのクラウド コントロールパネルにて、左メニューの「サーバ」をクリックし、web01とweb02の左側にチェックを入れ、右上の「電源操作」をクリックし、「起動」をクリックします。

しばらくすると、以下のような通知がなされ、サービスが復旧したことがわかります。

HTMLメールの例

Slack通知の例

また、今回のチュートリアルでは、各WebサーバのグローバルIPアドレスではなく、ロードバランサのVIPを監視するように設定をしました。そのため、web01とweb02のどちらか片方をシャットダウンしてもサービスは継続されるため通知はなされません。実際に試してみてください。

ここまでの内容を理解できているか確かめよう!

閉じる

第1問/3

応用編2チェックテスト

公開鍵認証でSSHの接続時、クライアント側に置く必要があるファイルは何ですか?

以下から回答を選択してください

閉じる

第2問/3

応用編2チェックテスト

CentOS7でシステムの設定を行うsystemdを制御するコマンドは以下のどれですか?

以下から回答を選択してください

閉じる

第3問/3

応用編2チェックテスト

Apache初期状態(CentOS7)のドキュメントルートはどちらですか?

以下から回答を選択してください

解説

2の「公開鍵」はサーバ側におきます。「3」「4」は SSH 接続とは無関係です。

解説を閉じる

解説

1の「service」はCentOS 6までのコマンドです。2の「apachectl」はApacheしか操作できません。4の「nmcli」はネットワークの管理用コマンドです。

解説を閉じる

解説

「/var/www/html/」です。OSの種類やウェブサーバ用のソフトウェアによってドキュメントルートの場所は変わりますので、ご注意ください。

解説を閉じる

閉じる

解答結果

第1問
×不正解 解説を見る
第2問
×不正解 解説を見る
第3問
×不正解 解説を見る

次のチュートリアルにも挑戦してみよう!

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る