Doctlを使用してDigitalOceanロードバランサーを操作する方法

前書き

DigitalOceanロードバランサーは、複数のバックエンドサーバー間でHTTP、HTTPS、およびTCPトラフィックを分散する簡単な方法です。 このチュートリアルでは、doctl(DigitalOceanのAPIの公式コマンドラインクライアント)を使用して、複数のバックエンドWebサーバーのロードバランサーを作成および構成します。

前提条件

このチュートリアルを開始する前に、doctlとDigitalOceanロードバランサーについて理解しておく必要があります。 次の記事が役立ちます。

続行する前に、doctlバージョン1.6.0以降がインストールおよび認証されていることを確認する必要があります。 doctl versionを実行して、doctlのバージョンを確認します。 また、DigitalOceanアカウントにSSHキーを追加する必要があります。

[[step-1 -—- setting-up-the-backend-web-servers]] ==ステップ1—バックエンドWebサーバーのセットアップ

まず、doctlを使用して、ロードバランサーがトラフィックを転送する2つのWebサーバーを作成します。 LAMPスタック(Linux、Apache、MySQL、PHP)がプリインストールされている2つのサーバーから始め、それぞれが固有のWebページを提供するように更新します。 これにより、ロードバランサーが実際に複数のサーバー間で接続を分散していることを確認できます。

2つのサーバーを作成するには、最初にそれらのサーバーを配置するリージョンと、使用するSSHキーのフィンガープリントを知る必要があります。 このチュートリアルでは、nyc1領域を使用します。 すべてのリージョンとその短縮されたスラッグをdoctlで一覧表示できます。

doctl compute region list
OutputSlug    Name               Available
nyc1    New York 1         true
sfo1    San Francisco 1    true
nyc2    New York 2         true
ams2    Amsterdam 2        true
sgp1    Singapore 1        true
lon1    London 1           true
nyc3    New York 3         true
ams3    Amsterdam 3        true
fra1    Frankfurt 1        true
tor1    Toronto 1          true
sfo2    San Francisco 2    true
blr1    Bangalore 1        true

使用する地域に応じてスラッグを選択します。

[.note]#Note:ロードバランサーとそのターゲットドロップレットはすべて同じリージョンにある必要があります。

SSHキーの指紋を見つけるには、もう一度doctlを使用します。

doctl compute ssh-key list
OutputID         Name          FingerPrint
7738555    [email protected]    your_ssh_key_fingerprint

出力で、使用するSSHキーのフィンガープリントに注意してください。 次のコマンドで必要になります。

Ubuntu 16.04を実行するワンクリックLAMPスタックイメージを使用し、これを512MBのドロップレットに配置します。 画像と液滴サイズに使用できるさまざまなオプションは、listコマンドを使用して、doctlでも一覧表示できます。 これについての詳細は、前提条件の記事のCreating, Deleting, and Inspecting Droplets sectionで読むことができます。

すべての情報が揃ったので、1つのコマンドで2つのサーバーを作成できます。

doctl compute droplet create web-1 web-2 \
    --region nyc1 \
    --image lamp-16-04 \
    --ssh-keys your_ssh_key_fingerprint \
    --enable-private-networking \
    --size 512mb

web-1web-2がサーバーの名前になります。 --enable-private-networkingも選択しました。 これにより、ロードバランサーからターゲットドロップレットへのトラフィックは、DigitalOceanの未測定のプライベートネットワークにとどまります。

createコマンドは、新しいドロップレットに関する情報を出力します。

OutputID          Name     Public IPv4    Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48463543    web-1                                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    new
48463544    web-2                                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    new

2つのサーバーが現在プロビジョニングされています。 プロセスが完了するまで数分待ってから、Webドロップレットをリストします。

doctl compute droplet list web-*

listコマンドは、*ワイルドカード文字を受け入れます。 この場合、名前に少なくともweb-が含まれるドロップレットのみが表示されます。

OutputID          Name      Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48603683    web-1    111.111.111.111     111.111.111.333                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
48603684    web-2    111.111.111.222     111.111.111.444                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

ドロップレットにIPv4アドレスが割り当てられ、activeとしてリストされていることに注意してください。 WebブラウザでDropletsのいずれかのパブリックアドレスに移動すると、デフォルトのApacheプレースホルダーページが読み込まれます。 それぞれに新しい一意のページを追加して、web-1web-2を区別できるようにします。

doctlを介してサーバーにSSHで接続できます。

doctl compute ssh web-1

これにより、作成時に指定したSSHキーを使用して接続し、rootとしてログインします。 サーバーで新しいHTMLファイルを開きます。 nanoテキストエディタを使用します。

nano /var/www/html/test.html

次のHTMLスニペットに貼り付けます。

/var/www/html/test.html

Hello from web-1!

ファイルを保存し、テキストエディターを終了します。 これは完全なHTMLファイルではありませんが、ブラウザは寛容であり、目的には十分です。

次のアドレスに移動して、新しいページが適切に配信されていることを確認します。 強調表示された部分を正しいIPに置き換えてください:

http://web-1_public_ip_address/test.html

このページに、作成したばかりの見出しHello from web-1!が表示されます。

SSHセッションを終了します。

exit

次に、2番目のサーバーにSSHで接続し、HTMLページで別のメッセージを使用してプロセスを繰り返します。

doctl compute ssh web-2

新しいHTMLファイルを開きます。

nano /var/www/html/test.html

コンテンツに貼り付けます:

/var/www/html/test.html

Hello from web-2!

テキストエディターを保存して終了し、SSHセッションを終了します。

exit

ブラウザを使用して、web-2が新しいWebページも適切に提供していることを確認します。 その場合、2台のサーバー間で負荷を分散するロードバランサーを作成する準備が整いました。

[[step-2 -—- creating-a-load-balancer]] ==ステップ2—ロードバランサーの作成

nyc1領域に新しいロードバランサーを作成します。 ロードバランサーとそのターゲットドロップレットは同じ領域にある必要があるため、ドロップレットが配置されている領域を使用するようにしてください。

doctl compute load-balancer create \
    --name load-balancer-1 \
    --region nyc1 \
    --forwarding-rules entry_protocol:http,entry_port:80,target_protocol:http,target_port:80

このコマンドは、nyc1領域にload-balancer-1という名前のロードバランサーを作成します。 各ロードバランサーには、--forwarding-rulesフラグの下に少なくとも1つのルールが必要です。 これらのルールは、ロードバランサーがトラフィックを受け入れる方法と、トラフィックをターゲットに転送する方法を記述します。 上記の転送ルールは、ポート80のHTTPトラフィックをターゲットサーバーに直接渡すことを示しています。

他の--forwarding-rulesプロトコルオプションはhttpstcpであり、エントリとターゲットの両方に有効なポートを選択できます。 複数の転送ルールを指定する必要がある場合は、ルールのリスト全体を引用符で囲み、各ルールの間にスペースを使用します。 HTTPとHTTPSの両方の転送を有効にする例は次のとおりです。

--forwarding-rules "entry_protocol:http,entry_port:80,target_protocol:http,target_port:80 entry_protocol:https,entry_port:443,target_protocol:https,target_port:443"

実行したばかりのcreateコマンドは、新しいロードバランサーに関する情報を出力します。

OutputID                                      IP    Name               Status    Created At              Algorithm      Region    Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                   Forwarding Rules
ae3fa042-bfd2-5e94-b564-c352fc6874ef          load-balancer-1    new       2017-05-10T19:28:30Z    round_robin    nyc1                            false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false

上記のハイライトされたロードバランサーのIDをメモします。これは、次のステップでターゲットドロップレットを追加するために使用します。 ヘルスチェックルールやスティッキーセッションなど、設定しなかったデフォルトの設定に関する情報もあります。 これらのオプションの詳細については、prerequisite load balancer articleを参照してください。 doctlを使用してこれらのオプションを設定する方法の詳細を確認するには、--helpフラグを指定してcreateコマンドをいつでも実行できます。 ロードバランサーの作成の場合、次のようになります。

doctl compute load-balancer create --help

これにより、使用可能なすべてのコマンドラインフラグとオプションのリストが出力されます。 この--helpフラグは、任意のdoctlコマンドで使用できます。

ロードバランサーが作成されたので、ターゲットのドロップレットを追加する必要があります。 次のセクションでそれを行います。

[[step-3 -–- adding-droplets-to-the-load-balancer]] ==ステップ3–ドロップレットをロードバランサーに追加する

2つのDropletの情報をもう一度リストして、IDを取得できるようにします。

doctl compute droplet list web-*
OutputID          Name      Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48603683    web-1    111.111.111.111    111.111.111.333                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
48603684    web-2    111.111.111.222     111.111.111.444                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

上記の出力例では、IDが強調表示されています。 Be sure to use your actual IDs, not the examples.

次に、add-dropletsコマンドを使用して、ターゲットドロップレットをロードバランサーに追加します。 前の手順で作成したロードバランサーのIDを指定します。

doctl compute load-balancer add-droplets
    ae3fa042-bfd1-4e94-b564-c352fc6874ef \
    --droplet-ids 48463543,48463544

これで、getコマンドを使用して、ロードバランサーの更新された情報を取得できます。

doctl compute load-balancer get ae3fa042-bfd1-4e94-b564-c352fc6874ef
OutputID                                      IP                Name               Status    Created At              Algorithm      Region    Tag    Droplet IDs          SSL      Sticky Sessions                                Health Check                                                                                                                   Forwarding Rules
ae3fa042-bfd1-4e94-b564-c352fc6874ef    111.111.111.555    load-balancer-1    active    2017-05-10T19:28:30Z    round_robin    nyc1             48603683,48603684    false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false

ステータスがactiveになり、IPが割り当てられ、ターゲットの液滴がリストされていることに注意してください。 ブラウザでこの新しい負荷分散IPに移動し、test.htmlページを再度ロードします。 URLは次のようになります。

http://load-balancer-1_ip_address/test.html

ブラウザは、web-1またはweb-2のいずれかからメッセージをロードします。 ページを更新すると、他のサーバーのメッセージが表示されます。 ロードバランサーはround robinモードです。つまり、リクエストごとにリストの次のドロップレットに接続を送信します。 別の方法はleast connectionsモードで、ロードバランサーはアクティブな接続が最も少ないターゲットに新しいトラフィックを送信します。

Load Balancerが機能していることがわかったので、サーバーを無効にして、中断の処理方法を見てみましょう。

[[step-4 -–- testing-fail-over]] ==ステップ4–フェイルオーバーのテスト

ロードバランサーの大きな利点の1つは、個々のバックエンドWebサーバーの問題に対する耐性が向上することです。 Load Balancerは、事前に定義された間隔(デフォルトでは10秒ごと)でヘルスチェックを実行します。 デフォルトのヘルスチェックでは、ターゲットサーバー上のWebページを取得します。 このチェックが連続して数回失敗すると、ターゲットはローテーションから除外され、回復するまでトラフィックは送信されません。

ヘルスチェックに失敗してフェイルオーバー機能をテストしましょう。 SSHでweb-2に戻します:

doctl compute ssh web-2

次に、Apache Webサーバーをシャットダウンします。

systemctl stop apache2

ブラウザに戻って、負荷分散されたページを数回更新します。 最初は、いくつかの503 Service Unavailableエラーが発生する可能性があります。 デフォルトでは、Load Balancerは、プールからサーバーを削除する前に、3つのヘルスチェックが失敗するのを待ちます。 これには約30秒かかります。 その後、web-1からの応答のみが表示されます。

web-2でApacheバックアップを開始します。

systemctl start apache2

この場合も、しばらくすると、ロードバランサーはweb-2が稼働していることを検出し、プールに追加されます。 ページを更新すると、web-2の応答が表示されるようになります。

これで、ロードバランサーは完全な状態に戻りました。

Load Balancerを実稼働に対応させるために実行できる次の手順をお読みください。

結論

このチュートリアルでは、doctlを使用してDigitalOceanロードバランサーといくつかのバックエンドウェブサーバーを作成し、バックエンドサーバーにHTTPトラフィックを送信するようにロードバランサーを構成し、ロードバランサーのヘルスチェック機能をテストしました。 Load Balancerを実動用に準備するために実行できるステップがいくつかあります。

  • ロードバランサーでドメイン名を指定すると、ユーザーがわかりにくいIPアドレスを入力することがなくなります。 チュートリアルHow To Set Up a Host Name with DigitalOceanでそれを行う方法を学ぶことができます。

  • DigitalOceanを使用すると、ドロップレットにタグを付けることができるため、ドロップレットを整理し、ドロップレットのセット全体をグループとして扱うことができます。 ドロップレットを個別に追加する代わりに、特定のタグ内のすべてのドロップレットにトラフィックを送信するようにロードバランサーを構成できます。 これにより、新しいバックエンドサーバーをより動的にプールに追加できます。 DigitalOceanタグについてはHow To Tag DigitalOcean Dropletsで学ぶことができます。

  • 負荷分散されたWebサイトにHTTPSセキュリティを追加する必要がある場合は、これを実現する2つの異なる方法(SSL passthroughSSL termination)に関するチュートリアルがあります。

Related