ポリシーベースの負荷分散
パブリックとプライベートのアプリケーション・ロードバランサーはどちらもレイヤー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 に設定する場合に、アプリケーション・ロード・バランサーから返される応答の状況コード。 許容値は 301 、302 、303 , 307 、または 308 です。 |
ターゲット | アクションが forward_to_pool に設定されている場合、リクエストは仮想サーバーインスタンスのバックエンドプールに転送される。 あるいは、アクションが forward_to_listener に設定されている場合、リクエストは同じALBのフロントエンドリスナーに転送(forward)される。 |
リスナー | アクションを https_redirect に設定する場合に要求をリダイレクトする HTTPS リスナー。 |
URI | アクションが https_redirect である場合に要求をリダイレクトする相対 URI。 このプロパティーはオプションです。 |
レイヤー 7 ルール
ルールは、リクエストがどのように一致するかを定義します。 URI ベースのルーティングとパラメーター・ベースのルーティングの両方がサポートされます。 5種類のルールがサポートされており、以下に説明します。
タイプ | 説明 |
---|---|
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 |
ルールのタイプを指定します。 使用可能な値は、 hostname 、 header 、 path 、 query 、 body のいずれかです。 |
condition |
ルールを評価する条件を指定します。 条件には、contains 、equals 、または 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: $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
は適用されず、 condition
と value
プロパティはレイヤー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"
}
}
]
}'