Amazon Web Services ブログ
AWS OpsWorks Chef 12 stackでのApplication Load Balancerの利用
Elastic Load BalancingのApplication Load Balancer機能の利点を活かして、スケーラブルなアプリケーションを構築してみたいですか?
Application Load Balancerを使えば、コンテンツベースのルーティングやHTTP/2、WebSocketプロトコルの機能を追加したり、コンテナや拡張メトリクスなどを追加することができます。
AWS OpsWorks Stackのユーザーから、レイヤーに新しいApplication Load Balancerをどのようにしたら追加できるかをAWSにご質問されていました。そこでAWSは、簡単にこれらを統合するためのChef 12のレシピのセットを開発し、オープンソースにすることを決めました。本記事ではOpsWorks StackにおけるChef 12 LinuxレイヤーでApplication Load Balancerと連携させるための手順を紹介します。
手順
特に記載がない限り、すべてのステップはOpsWorksコンソール内で完結されるものとします。
alb_supportレシピの概要
alb_support::attach_to_alb: こちらのレシピはApplication Load Balancerのターゲットグループにインスタンスをアタッチする実際の作業を行います。Setupライフサイクルイベントにより既存のが実行され、追加される必要があり、インスタンスがApplication Load Balancerにアタッチされる前にレシピが実行される必要があります。
alb_support::detach_from_alb: こちらのレシピはロードバランサーからインスタンスをデタッチします。Shutdownライフサイクルイベントにこちらのレシピを追加するようにしてください。Shutdownライフサイクルイベントにより実行される一連のレシピを実行後にこちらのレシピが実行され、こちらによりインスタンスはApplication Load Balancerからデタッチされ、コネクションはdrainされます。
alb_support:install および alb_support::uninstall_http_server: デフォルトのApplication Load Balancerのヘルスチェックをパスする簡単な方法、およびそのロードバランサーが想定した通りに動作していることを視覚的に示す方法として、AWSは80番ポートを使用するNGINXサーバをインストールおよびアンインストールして、デフォルトのテストページを提供するサンプルレシピも提供しています。
ステップ1:Application Load Balancerを作成する
80番ポートを使ってデフォルトのTCPリスナーとHTTPヘルスチェックをシンプルなALBを作成します。ターゲットグループにインスタンスを追加しないようにしてください。こちらはオープンソースのChefレシピによって処理されるためです。
ステップ2:Chef 12 stackを作成する
新しいChef 12 stackを作成します。必ずカスタムChef cookbooksの利用を有効にして、次の設定を行ってください。
- Repository typeでは、Gitを選択します。
- Repository URLでは、https://github.com/awslabs/opsworks-example-cookbooks を使用します。もし既に動作中のスタックがあれば、そのリポジトリからalb_cookbookをダウンロードして、ご自身のChefリポジトリにマージして、次のセクションを継続することができます。
ステップ3:stack内のインスタンスにElastic Load Balancing APIをコールする権限を許可する
1. Stack Settingsを選択します。
2. Default IAM instance Profileの隣にあるリンクを選択して、IAM内のインスタンスプロファイルを開きます。
3. Permissionsタブ上で、Inline Policiesを開いて、create hereを選択してインラインポリシーを作成します。
4. Custom Policyを選択して、Selectを選択します。
5. ポリシー用の名前を入力して、Policy Documentフィールド内に次の内容を貼り付けて、その後Apply Policyを選択します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"elasticloadbalancing:RegisterTargets",
"elasticloadbalancing:DeregisterTargets",
"elasticloadbalancing:DescribeTargetHealth"
],
"Resource": "*"
}
]
}
ステップ4:Application Load Balancerレイヤーを作成して構成する
新しいレイヤーを作成します。次にオープンソースのalb_support cookbookを使って、レイヤー内のインスタンスがApplication Load Balancerと連携・管理できるようにします。
レイヤーのレシピを構成する
レイヤー用にレシピを構成するには、次のようにします。
alb_support::install_http_serverおよびalb_support::attach_to_albをSetupライフサイクルイベントに追加します。
alb_support::detach_from_albおよびalb_support::uninstall_http_serverをShutdownライフサイクルイベントに追加します。
ALBの構成の詳細を指定する
alb_supportレシピを構成した後で、インスタンスのshutdownタイムアウトを変更し、カスタムJSONでいくつかの詳細を設定します。
1. Layer Settingsページ上で、shutdown用のレシピとコネクションドレインを実行するための十分な時間を許可するためにInstance shutdown timeoutを入力します。コネクションドレインタイムアウトと等しい時間に加えて、ドレイン処理後のレシピを実行するのにかかる最大時間を指定することを推奨します。
2. レイヤー設定を編集して、保存前に次のカスタムJSONを指定します。
{
"alb_helper":
{
"target_group_arn": "SPECIFY ARN OF YOUR ALB TARGET GROUP HERE"
}
}
alb_helper JSONブロックに追加する2つのオプションパラメータが以下です。
- connection_draining_timeout (デフォルト: 750)
こちらは追加のshutdownレシピを実行する前にApplication Load Balancerがコネクションをdrainするのに待つための秒単位での最大時間です。ロードバランサーのdrainのタイムアウトにマッチするようにセットします。インスタンスがdrainされるまでshutdownレシピの実行時間を延ばす必要がない場合は、このパラメータの値を0に指定します。
- state_check_frequency(デフォルト:30秒)
こちらは、EC2::describeTargetHealthをコールして、コネクションdrainのプロセス中にアップデートを取得するための頻度を表します。
セキュリティ
Application Load Balancerのヘルスチェックに成功するには、入ってくるHTTPトラフィックを許可する必要があります。レイヤーのSecurityを選択して、レイヤーにAWS-OpsWorks-Web-Serverグループを追加します。こちらにより、80番ポートにていかなるソースアドレスからのトラフィックも受け付けるよう許可されます。
Application Load Balancerを動作確認する
以上で完了です!StackのInstancesページ上で、新しいインスタンスを追加して、startを選択、onlineになるのを待ちます。Amazon EC2コンソールを開いて、Application Load BalancerのDNS名を確認します。ブラウザでそのアドレスを開くと、NGINXのテストページをご覧になれます。
レイヤーに追加されたインスタンスは、レイヤーのカスタムJSONブロックでい指定したターゲットグループに自動的に追加されます。Application Load Balancerは不健全なOpsWorks Stackのインスタンスを検知するためにヘルスチェックを使います、そして不健全なインスタンスがリストアされるまで残りのインスタンスへトラフィックを送ります。
終了したインスタンスは、コネクションがdrainされて、Application Load Balancerから削除されます。alb_support::detach_from_albよりも早い順に指定されているshutdownレシピの実行は、Application Load Balancerあるいはconnect_draining_timeoutの値を上回ることにより、インスタンスがdrainされるまで延期されます。
結論
こちらの記事では、いかに簡単にOpsWorks StackアプリケーションにApplication Load Balancerを統合できるかを紹介しました。Chefレシピを使って、レイヤー内のインスタンスをApplication Load Balancerに自動で追加したり削除したりすることができます。こちらの例を拡張して、パスベースのルーティングや、HTTP/2またはWebSocket、コンテナサポートやより詳細なメトリクスを使った機能の利点を享受することができます。
(日本語翻訳はSA 舟崎が担当しました。原文はこちらです。)