IBM Cloud Docs
ポリシーベースの負荷分散

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

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

レイヤー7ポリシー

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

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

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

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

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

ポリシーのプロパティー

ポリシー・プロパティの説明
プロパティー (Property) 説明
名前 ポリシーの名前。 この名前はリスナー内で固有でなければなりません。
アクション すべてのポリシー・ルールが一致した場合に実行するアクション。 許容される値は reject, redirect, forward_to_pool, forward_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 URL の path の後の hostname (/index.html など) で要求をマッチングします。
query URL の query (x=y など) で要求をマッチングします。 query 、大文字と小文字は区別される。
body body のリクエストは、 POST のリクエストがフォームエンコードされています。 本文 (key=value など) で要求をマッチングします。 大/小文字が区別されます。
sni_hostname TLSネゴシエーション時に「server name indication」拡張で指定されたサーバーが、指定されたSNIホスト名に一致する。

要求とマッチングするには、ルールに condition ステートメントを定義する必要があります。 3つの条件がサポートされており、以下に説明します。

ルールで定義された条件文
条件 評価のタイプ
contains type に基づいて抽出された値が、 value で指定された文字列を含んでいるかどうかを検証する。
equals type に基づいて抽出された値が、value で指定されたストリングと同一であるかどうかを検証します。
matches_regex type に基づいて抽出された値を、 value で指定された正規表現とマッチさせる。

ルール・プロパティー

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

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

注記:

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

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

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

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

curl -H "Authorization: $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: $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: $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 pool- リクエストは特定のバックエンドプールに送られます。
  • Forward To listener- リクエストは特定のフロントエンドリスナーに送られます。

レイヤー4ルール

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

sni_hostname 、TCPリスナーを作成する

curl -H "Authorization: $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": "r134-20275400-825e-4d9b-8177-076fdb4134cc"
                    }
                }
            ]
        }'