ポリシーベースの負荷分散

パブリックとプライベートのアプリケーション・ロードバランサーはどちらもレイヤー4とレイヤー7のロードバランシングをサポートし、設定されたポリシーとルールに基づいてデータ・トラフィックが分散される。 ポリシーは、着信要求がポリシーに関連付けられたルールと一致する場合に取るアクション (つまりトラフィックを分散させる方法) を定義します。

レイヤー7ポリシー

HTTP リスナーおよび HTTPS リスナーのポリシーを定義できます。 ポリシーごとに 1 つ以上のルールを定義する必要があります。 ポリシーは、そのすべてのルールが一致した場合にのみ適用されます。

1 つのリスナーに複数のポリシーを関連付けることができます。 一般には、優先順位が最も低いポリシーが最初に評価されます。 ポリシーごとに別の優先順位を割り当てる必要があります。

着信要求がポリシーのルールと一致しない場合、システム要求により、構成されている HTTPS リダイレクト・リスナー (存在する場合) にリダイレクトされます。 それ以外の場合、その要求は、システムによりリスナーのデフォルト・プールにリダイレクトされます。 HTTPS リダイレクトは、HTTP リスナーのデフォルト・プールより優先されます。

レイヤー 7 のポリシーでサポートされるアクションは以下のとおりです。

  • reject (拒否) - 要求は 403 応答で拒否されます。
  • redirect (リダイレクト) - 要求は、構成した URL および応答コードにリダイレクトされます。
  • プールへの転送- リクエストは特定のバックエンドプールに送信されます。
  • Forward to listener- リクエストは特定のフロントエンドリスナーに送られます。
  • HTTPS リダイレクト (HTTPS Redirect) - HTTP 要求は HTTPS リスナーにリダイレクトされます。

ポリシーのプロパティー

ポリシー・プロパティの説明
プロパティー (Property) 説明
名前 ポリシーの名前。 この名前はリスナー内で固有でなければなりません。
アクション すべてのポリシー・ルールが一致した場合に実行するアクション。 許容される値は、 rejectredirectforward_to_poolforward_to_listener、および https_redirect です。
優先順位 ポリシーは、優先順位の昇順に評価されます。
優先順位 ポリシーは、優先順位の昇順に評価されます。
URL アクションを redirect に設定する場合に要求をリダイレクトする URL。 URL または URI のパラメータのどちらかを指定する必要があります。 URL を使用している場合、すべての受信トラフィックは、この URL にリダイレクトされます。 URI パラメータを使用する場合、パラメータの受信値を使用して、受信トラフィック要求の値を保持できます。 URI パラメータのデフォルト値は、元の受信値と同じです。 入力された値を保持するには、次のように指定します。{protocol}{port}{host}{path} 、 そして {query}。 例えば、受信リクエストのホストが ibm.com の場合、デフォルト値は {host} となり、受信 ibm.com 値と同じになります。
HTTP 状況コード アクションを redirect または https_redirect に設定する場合に、アプリケーション・ロード・バランサーから返される応答の状況コード。 許容値は 301302303, 307、または 308 です。
ターゲット アクションが forward_to_pool に設定されている場合、リクエストは仮想サーバーインスタンスのバックエンドプールに転送される。 あるいは、アクションが forward_to_listener に設定されている場合、リクエストは同じALBのフロントエンドリスナーに転送(forward)される。
リスナー アクションを https_redirect に設定する場合に要求をリダイレクトする HTTPS リスナー。
URI アクションが https_redirect である場合に要求をリダイレクトする相対 URI。 このプロパティーはオプションです。

レイヤー 7 ルール

ルールは、リクエストがどのように照合されるかを定義します。 URI ベースのルーティングとパラメーター・ベースのルーティングの両方がサポートされます。 以下の 5 種類のルールがサポートされています。

レイヤー 7 ルール
種類 説明
hostname このリクエストは、指定された hostname (例: api.my_company.com )と一致しています。
header このリクエストは、 HTTP header のフィールドと値(例: Cookie: xxxx )に一致します。
path このリクエストは、 hostname の後に続く URL 内の path に一致します。例: /index.html
query このリクエストは、 URL 内の「 query 」という文字列と一致します。例: x=yquery という文字列はパーセントエンコードされている必要があり、大文字と小文字が区別されます。
body POST 」リクエストに対するリクエスト「 body 」は、フォームエンコードされています。 本文 (key=value など) で要求をマッチングします。 大/小文字が区別されます。
sni_hostname TLS ネゴシエーション中に「サーバー名指示(SNI)」拡張機能で提供されたサーバーが、指定されたSNIホスト名と一致する。

要求とマッチングするには、ルールに condition ステートメントを定義する必要があります。 以下の4つの条件に対応しています。

ルールで定義された条件文
条件 評価のタイプ
contains type に基づいて抽出された値に、 value で指定された文字列が含まれているかどうかを確認します。
equals type に基づいて抽出された値が、 value で指定された文字列と一致するかどうかを確認します。
matches_regex type に基づいて抽出された値を、 value で指定された正規表現と照合します。
starts_with type に基づいて抽出された値が、 value で指定された文字列で始まるかどうかを確認します。

ルール・プロパティー

この表は、レイヤー7ポリシールールのプロパティについて説明しています。

ルール・プロパティの説明
プロパティー (Property) 説明
type ルールのタイプを指定します。 許容される値は、 hostnameheaderpathquery、または body です。
condition ルールを評価する際に使用する条件を指定します。 サポートされている値は、 containsequals、または matches_regex です。
field フィールド名を指定します。 このフィールドは、header query および body ルール・タイプにのみ適用され、正規表現およびワイルドカード文字はサポートしません。 例えば、HTTP ヘッダー内の Cookie とマッチングするには、このフィールドを cookie に設定します。 ルール・タイプが query および body の場合、このフィールドはオプションです。 このプロパティは、 sni_hostname ルールタイプには適用されない。
value マッチングされるストリング。 このフィールドではワイルドカード文字は使用できません。 condition matches_regex`` に設定されている場合、正規表現がサポートされます。

注記:

  • ルール・タイプが header の場合、field および value では以下の文字を使用できません: "(),/:;<=>?@[\]{}'
  • ルール・タイプが body の場合、field および value に、"'=,()& という文字とスペースを使用することはできません。
  • ルール・タイプが query の場合、field および value は、パーセントでエンコードされたストリングである必要があります。

例: ポリシーとルールの作成

以下の Layer-7 の例は、ポリシーおよびルールを作成してリスナーに関連付ける方法を示しています。

例 1: リダイレクト・ポリシーを指定して HTTPS リスナーを作成する

curl -H "Authorization: Bearer $iam_token" -X POST
"$vpc_api_endpoint/v1/load_balancers/$lbId/listeners" \
    -d '{
            "certificate_instance": {
                "crn": "crn:v1:bluemix:public:cloudcerts:us-south:a/1111111111111111111111111111:22222222-3333-4444-5555-666666666666:certificate:77777777777777777777777777777777"
            },
            "connection_limit": 2000,
            "port": 443,
            "protocol": "https",
            "policies": [
                {
                    "name": "hostname_header",
                    "action": "redirect",
                    "priority": 1,
                    "target": {
                        "url": "https://www.examples.com/",
                        "http_status_code": 307
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "header",
                            "field": "aheader",
                            "value": "avalue"
                        },
                        {
                            "condition": "equals",
                            "type": "hostname",
                            "value": "abc.com"
                        }
                    ]
                },
                {
                    "name": "header_cookie",
                    "action": "redirect",
                    "priority": 5,
                    "target": {
                        "url": "https://www.mycookies.com/",
                        "http_status_code": 302
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "header",
                            "field": "aheader",
                            "value": "avalue"
                        },
                        {
                            "condition": "equals",
                            "type": "header",
                            "field": "cookie",
                            "value": "flavor=oatmeal"
                        }
                    ]
                },
                {
                    "name": "path_hostname",
                    "action": "redirect",
                    "priority": 10,
                    "target": {
                        "url": "https://www.myexamples.com/",
                        "http_status_code": 301
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "hostname",
                            "value": "abc"
                        },
                        {
                            "condition": "equals",
                            "value": "/test",
                            "type": "path"
                          }
                    ]
                },
                {
                    "name": "uri_redirect",
                    "action": "redirect",
                    "priority": 10,
                    "target": {
                        "url": "https://{host}:8080/{path}?{query}",
                        "http_status_code": 301
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "hostname",
                            "value": "pqr"
                        }
                    ]
                }
            ]
        }'

例 2: プールに要求を転送するポリシーを作成し、既存のリスナーに関連付ける

curl -H "Authorization: Bearer $iam_token" -X POST
"$vpc_api_endpoint/v1/load_balancers/$lbId/listeners/$listenerId/policies" \
    -d '{
            "policies": [
                {
                    "action": "forward",
                    "priority": 1,
                    "target": {
                        "id": "7df616da-4dd6-43d3-881d-801ae29e29fe"
                    },
                    "rules": [
                        {
                            "condition": "equals",
                            "type": "header",
                            "field": "cookie",
                            "value": "flavor=oatmeal"
                        }
                    ]
                },
                {
                    "action": "forward",
                    "priority": 5,
                    "target": {
                        "id": "0738-8061c411-0d50-4c79-b475-102666796434"
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "header",
                            "field": "aheader",
                            "value": "avalue"
                        }
                    ]
                },
                {
                    "action": "forward",
                    "priority": 10,
                    "target": {
                        "id": "0738-62914e09-3928-4d89-b7f7-1bb7a6d7fe85"
                    },
                    "rules": [
                        {
                            "condition": "matches_regex",
                            "type": "hostname",
                            "value": "abc[a-z]*.com"
                        }
                    ]
                },
                {
                    "action": "forward",
                    "priority": 6,
                    "target": {
                        "id": "0738-62914e09-3928-4d89-b7f7-1bb7a6d7fe85"
                    },
                    "rules": [
                        {
                            "condition": "equals",
                            "type": "path",
                            "value": "/test/testtest"
                        }
                    ]
                }
            ]
        }'

例 3: https リダイレクト・ポリシーを使用して HTTP リスナーを作成する

curl -H "Authorization: Bearer $iam_token" -X POST
"$vpc_api_endpoint/v1/load_balancers/$lbId/listeners" \
    -d '{
            "connection_limit": 2000,
            "port": 80,
            "protocol": "http",
            "policies": [
                {
                    "name": "hostname_header",
                    "action": "https_redirect",
                    "priority": 1,
                    "target": {
                        "listener": {
                            "id": "0134-d578be10-31e3-46b3-8513-79babb852319"
                        },
                        "http_status_code": 307
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "header",
                            "field": "aheader",
                            "value": "avalue"
                        },
                        {
                            "condition": "equals",
                            "type": "hostname",
                            "value": "abc.com"
                        }
                    ]
                },
                {
                    "name": "header_cookie",
                    "action": "https_redirect",
                    "priority": 2,
                    "target": {
                        "listener": {
                            "id": "0456-a578be10-31e3-46b3-8513-79babb852398"
                        },
                        "http_status_code": 302
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "header",
                            "field": "aheader",
                            "value": "avalue"
                        },
                        {
                            "condition": "equals",
                            "type": "header",
                            "field": "cookie",
                            "value": "flavor=oatmeal"
                        }
                    ]
                },
                {
                    "name": "path_hostname",
                    "action": "https_redirect",
                    "priority": 5,
                    "target": {
                        "listener": {
                            "id": "0386-d898be10-21e3-66b3-9513-69babb852390"
                        },
                        "http_status_code": 301,
                        "uri": "/test/sample"
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "hostname",
                            "value": "abc"
                        },
                        {
                            "condition": "equals",
                            "value": "/test",
                            "type": "path"
                          }
                    ]
                }
            ]
        }'

レイヤー4ポリシー

TCP のリスナーに対してポリシーを定義できます。 ポリシーごとに 1 つ以上のルールを定義する必要があります。 レイヤ7ポリシーと同様に、レイヤ4ポリシーは最も低い優先度で最初に適用され、その指定されたルールがすべてマッチした場合にのみ適用される。

受信したリクエストがいずれのポリシーのルールにも一致しない場合、クライアントは SSL エラーを受け取る可能性があります。

レイヤー4ポリシーでは以下のアクションがサポートされている:

  • プールへ転送- リクエストは特定のバックエンドプールに送信されます。
  • Forward To listener- リクエストは特定のフロントエンドリスナーに送られます。

レイヤー4ルール

レイヤー4ルールは、レイヤー7ルールと同じように、リクエストのマッチング 方法を定義する。 ただし、 sni_hostname タイプのみがサポートされ、 field は適用されず、 conditionvalue プロパティはレイヤー7ルールと同じである。

「SNI Hostname」ルールは、 TCP リスナーでのみ機能します。

IBM Cloud ALBのSNIはリスナーにアタッチされ、ホスト名に基づいて異なるバックエンドプールにトラフィックをルーティングできる。 プール内では、選択されたアルゴリズム(ラウンドロビン、最小コネクションなど)を使用して、すべてのメンバー間でトラフィックが常に負荷分散されます。 SNIを使ってプール内の特定のメンバーを選ぶことはできない。

Protocol HTTP、またはHTTPでバックエンドプールを使用している場合、ALBはクライアントリクエストをバックエンドプールに転送する際にSNIを設定しません。 これは、ALBが転送の決定を行う際にSNIのみを使用するためであり(レイヤー7ルールが設定されている場合)、ALBはバックエンドと別途 TLS ハンドシェイクを行うためです(これはクライアントのハンドシェイクとは異なります)。

バックエンドとして HTTP や HTTPS ではなく TCP プロトコルを使用している場合、ALB はコンシューマーから送信される SNI を設定します。 これは、 TLS のハンドシェイクが、ALBとバックエンドの間ではなく、コンシューマーとバックエンドの間で直接行われるためです。

SNI で HTTP / HTTPS Listener を使用する場合は、以下のいずれかの回避策を使用してください:

  1. バーチャルホストでワイルドカード証明書を使用する。 そして、別々のバックエンドポートに単一のホスト名のみを設定する。 例えば、ホスト名ごとに個別のサーバーへのルーティングを行いたい場合、ホスト名ごとに個別のプールを作成し、SNIを使用して適切なプールへのルーティングを行うことができます。
  2. バックエンドプロトコルとして、HTTPSの代わりに TCP モードを使用してください。 TCP このモードでは、SNIが正しく転送され、設定を行えば、SNIホスト名ルールに基づくロードバランシングも引き続き利用可能です。

例: sni_hostname ルールを使用した TCP リスナーを作成する

curl -H "Authorization: Bearer $iam_token" -X POST
"$vpc_api_endpoint/v1/load_balancers/$lbId/listeners"     -d '{
            "connection_limit": 2000,
            "port": 443,
            "protocol": "tcp",
            "policies": [
                {
                    "action": "forward_to_listener",
                    "name": "listener-forward-policy",
                    "priority": 4,
                    "rules": [
                      {
                        "condition": "equals",
                        "type": "sni_hostname",
                        "value": "www.example.com"
                      }
                    ],
                    "target": {
                      "id": "r006-20275400-825e-4d9b-8177-076fdb4134cc"
                    }
                }
            ]
        }'