Routing-Policy-Sprache für Load Balancer
Erfahren Sie, wie Sie Routing-Policy-Bedingungsanweisungen erstellen, die das Routingverhalten eines Load Balancers steuern.
Um zu steuern, wie eingehende Anforderungen an Ressourcen wie Webserver weitergeleitet werden, müssen Sie Policys erstellen. Diese Policys werden im Allgemeinen wie folgt formuliert: "Wenn dies der Fall ist, Traffic an ein Backend-Set weiterleiten." Das Backend-Set muss bereits vorhanden sein.
Routing-Policys funktionieren wie folgt:
- Jede HTTP-Anforderung wird anhand der Regeln ausgewertet.
- Die Regeln werden in der Reihenfolge ausgeführt, in der sie in der Policy definiert sind.
- Jede Regel verfügt über mindestens eine Bedingung und ein Backend-Set.
- Wenn die HTTP-Anforderungsbedingung mit einer Regel übereinstimmt, wird die Anforderung an das für die Regel definierte Backend-Set weitergeleitet. Die anderen Regeln in der Policy werden übersprungen, und die Anforderung wird nicht anhand dieser Regeln ausgewertet.
Beispiel: Eine Regel mit einem Pfad
Im Folgenden finden Sie ein Beispiel für ein Routing-Policy-Regelset, das nur eine pfadbasierte Regel enthält:
{
"name": "BasicPathBasedPolicy",
"conditionLanguageVersion": "V1",
"rules": [
{
"name": "Documents_rule",
"condition" : "any(http.request.url.path eq (i '/documents'))",
"actions": [{
"name": "FORWARD_TO_BACKENDSET",
"backendSetName": "backendSetForDocuments"
}]
}
]
}
Dieses Beispiel zeigt die folgenden Elemente:
-
Das Regelset ist in geschweifte Klammern
{ }
eingeschlossen und umfasst einen Namen für das Regelset, die Versionsnummer der Sprache und einen Namen für die Regeln. -
Der Regelsetname im Beispiel lautet
"BasicPathBasedPolicy"
. Die Regeln im Set sind in eckigen Klammern enthalten. -
Die einzige Regel im Set heißt
"Documents_rule"
. -
Die Bedingung für die Regel gibt an, dass die Aktion in
"actions"
ausgeführt wird, wenn eine beliebige (any
) der genannten Bedingungen erfüllt ist. -
Die Bedingung vergleicht den URL-Pfad der eingehenden HTTP-Anforderung mit
/documents
. Der Vergleich isteq
(gleich), was auch als=
geschrieben werden kann. -
In der Bedingungsanweisung deklariert
(i '/documents')
, dass bei'/documents'
die Groß-/Kleinschreibung nicht beachtet wird. -
Wenn die Bedingung erfüllt ist, wird die Anforderung an ein bestimmtes Backend-Set weitergeleitet, in diesem Fall "backendSetForDocuments". Dieses Backend-Set muss vorhanden sein, damit die Regel gültig ist.
Die Regel kann so umschrieben werden: "Wenn der angeforderte URL-Pfad eine genaue Übereinstimmung mit /documents
aufweist, die Anforderung an das Backend-Set backendSetForDocuments
weiterleiten".
Beispiel: Zwei einfache pfadbasierte Regeln
Im Folgenden finden Sie ein Beispiel für ein Routing-Policy-Regelset, das zwei einfache pfadbasierte Regeln enthält. Eine eingehende Abfrage wird basierend auf dem Anforderungs-URL-Pfad an ein bestimmtes Backend-Set gesendet. Die Weiterleitung erfolgt, wenn entweder die erste Bedingung oder die zweite Bedingung erfüllt ist. Mehrere Regeln werden nach ihrer Reihenfolge in der Policy ausgewertet. Wenn eine Abfrage mit beiden Bedingungen übereinstimmt, wird die Aktion für die erste Übereinstimmung ausgeführt, und die zweite Übereinstimmung wird übersprungen.
{
"name": "PathBasedPolicy",
"conditionLanguageVersion": "V1",
"rules": [
{
"name": "Documents_rule",
"condition" : "any(http.request.url.path eq (i '/documents'))",
"actions": [{
"name": "FORWARD_TO_BACKENDSET",
"backendSetName": "backendSetForDocuments"
}]
},
{
"name": "Videos_rule",
"condition" : "any(http.request.url.path eq (i '/videos'))",
"actions": [{
"name": "FORWARD_TO_BACKENDSET",
"backendSetName": "backendSetForVideos"
}]
}
]
}
Beispiel: Eine Regel mit zwei Bedingungen
Die nächste Policy enthält eine Regel mit zwei Bedingungen, die durch ein Komma getrennt sind. Die erste Bedingung prüft die Anforderungsheader, und die zweite Bedingung prüft die Abfragezeichenfolge der Anforderung:
{
"name": "Example_policy",
"conditionLanguageVersion": "V1",
"rules": [
{
"name": "HR_mobile_user_rule",
"condition" : "all(http.request.headers[(i 'user-agent')] eq (i 'mobile'), http.request.url.query['department'] eq 'HR')",
"actions": [{
"name": "FORWARD_TO_BACKENDSET",
"backendSetName": "backendSetForHRMobileUsers"
}]
}
]
}
Die Regel erfordert jetzt, dass beide Bedingungen erfüllt sind, damit eine Anforderung an ein Backend-Set weitergeleitet wird, da sie mit dem Schlüsselwort all beginnt. Die Bedingungen für die Regel können wie folgt umschrieben werden: "Wenn der angeforderte Wert für user-agent im Header auf mobile und der Wert department im Header auf HR gesetzt ist, an das angegebene Backend-Set weiterleiten".
Beispiel: Zwei Regeln
Das letzte Beispiel zeigt zwei Regeln. Jede Regel hat eine andere Aktion, und beide Regeln haben zwei Bedingungen. Wichtig: Die zweite Regel beginnt mit dem Schlüsselwort any. Das bedeutet, dass nur eine der beiden Bedingungen erfüllt sein muss, um die Aktion auszulösen. Wenn mehr als zwei Bedingungen angegeben sind, wird die Aktion ausgelöst, wenn eine der Bedingungen erfüllt ist.
{
"name": "Example_policy",
"conditionLanguageVersion": "V1",
"rules": [
{
"name": "HR_mobile_user_rule",
"condition" : "all(http.request.headers[(i 'user-agent')] eq (i 'mobile'), http.request.url.query['department'] eq 'HR')",
"actions": [{
"name": "FORWARD_TO_BACKENDSET",
"backendSetName": "backendSetForHRMobileUsers"
}]
},
{
"name": "Documents_rule",
"condition" : "any(http.request.url.path eq (i '/documents'), http.request.headers[(i 'host')] eq 'doc.myapp.com')",
"actions": [{
"name": "FORWARD_TO_BACKENDSET"
"backendSetName": "backendSetForDocuments"
}]
}
]
}
Regelbedingungen
Die Regelbedingungen werden in Form von Prädikaten geschrieben. In einer Bedingung können mehrere Prädikate mit Kombinatoren verwendet werden. Die beiden Kombinatoren any()
und all()
verhalten sich wie ein logisches OR beziehungsweise AND. Ein Kombinator kann auch negiert werden, indem ihm das Schlüsselwort not vorangestellt wird. Ein einfaches Prädikat kann wie folgt ausgedrückt werden:
left value matcher right value
Eine Bedingung für eine Regel, die übereinstimmen muss, wenn der URL-Pfad für die HTTP-Anforderung mit /foo/bar
beginnt, wäre:
http.request.url.path sw '/foo/bar'
Weitere Details zu den verfügbaren Matchern finden Sie unter Matcher.
Weitere Details zu den verfügbaren Variablen finden Sie unter Variablen.
Syntax für mehrere Prädikate
not? any|all(<condition>,<condition>,...)
Beispiel:
all(http.request.url.path sw '/foo', 'bar' in (http.request.url.query))
Beispiele für Bedingungen
Hier finden Sie weitere Beispiele für die Verwendung von Bedingungen. Hier finden Sie weitere Einzelheiten zur genauen Syntax und der Funktionalität.
- HTTP-Anforderung daraufhin prüfen, ob ihr URL-Pfad mit
/category/element
beginnt:http.request.url.path sw '/category/element'
- So geben Sie eine HTTP-Anforderung an, wenn der URL-Pfad mit
/category
beginnt oder mit/id
endet:any(http.request.url.path sw '/category', http.request.url.path ew '/id')
- HTTP-Anforderung daraufhin prüfen, ob der Anforderungsheader
User-Agent
vorhanden ist:(i 'User-Agent') in (http.request.headers)
- HTTP-Anforderung daraufhin prüfen, ob der Header
User-Agent
den WertSome User Agent
aufweist:http.request.headers[(i 'User-Agent')] eq 'Some User Agent'
- HTTP-Anforderung daraufhin abgleichen, ob die URL-Abfragezeichenfolge einen Schlüssel
search
(Groß-/Kleinschreibung beachten) enthält, z.B. in der URLhttps://www.example.com/category/?search=item+foo%20bar&page=1
:'search' in (http.request.url.query)
- HTTP-Anforderung daraufhin abgleichen, ob die URL-Abfragezeichenfolge einen Schlüssel
search
(mit Groß-/Kleinschreibung beachtet) enthält, bei dem der Wertitem+foo%20bar
die Groß-/Kleinschreibung nicht beachtet wird, z.B. in der URL:https://www.domain.com/category/?search=item+foo%20bar&page=1
http.request.url.query['search'] = (i 'item foo bar')
Die Prüfung der URL-Abfrage (sowohl Schlüssel als auch Werte) muss mit nicht maskierten URL-Versionen der Werte erfolgen.
- So ordnen Sie eine HTTP-Anforderung für ein Cookie namens
tastycookie
ohne Beachtung der Groß-/Kleinschreibung zu:(i 'tastycookie') in (http.request.cookies)
- HTTP-Anforderung ohne Beachtung der Kleinschreibung auf ein Cookie namens
tastycookie
prüfen, bei dem die Groß-/Kleinschreibung unterstrawberry
zu beachten ist:http.request.cookies[(i 'tastycookie')] = 'strawberry'
Matcher
In Bedingungen können mehrere Matcher verwendet werden.
Zeichenfolgen-Matcher
In der folgenden Tabelle werden die Matcher aufgeführt, die mit Zeichenfolgenwerten verwendet werden. Für einige Matcher gibt es alternative, austauschbare Varianten. Jede dieser Varianten kann für diesen Matcher verwendet werden.
Die Beispiele für jeden Matcher stimmen alle mit der http.request.url.path
überein, die /category/element/id
enthält:
Name | Alternativen | Beschreibung | Beispiel |
---|---|---|---|
eq |
=, ==, equal, equals |
Ergibt Übereinstimmung, wenn die Werte auf der linken und rechten Seite des Matchers gleich sind. | http.request.url.path eq "/category/element/id" |
ew |
Ergibt Übereinstimmung, wenn der Wert auf der linken Seite mit dem Wert auf der rechten Seite endet. | http.request.url.path ew '/id' |
|
sw |
Ergibt Übereinstimmung, wenn der Wert auf der linken Seite mit dem Wert auf der rechten Seite beginnt. | http.request.url.path sw '/category' |
|
not eq |
!=, not equal, not equals |
Ergibt Übereinstimmung, wenn die Werte auf der linken und rechten Seite des Matchers nicht gleich sind. | http.request.url.path neq '/some/other/path' |
not ew |
Ergibt Übereinstimmung, wenn der Wert auf der linken Seite nicht mit dem Wert auf der rechten Seite endet. | http.request.url.path not ew '/not_id' |
|
not sw |
Ergibt Übereinstimmung, wenn der Wert auf der linken Seite nicht mit dem Wert auf der rechten Seite beginnt. | http.request.url.path not sw '/not_category' |
Partielle Matcher
Einige der in den Regeln verwendeten Variablen enthalten beliebige Schlüssel/Wert-Zuordnungen von Daten, wenn die Regeln ausgeführt werden. Beispiel: http.request.headers
enthält die HTTP-Anforderungsheader. Weitere Informationen zu den verfügbaren Zuordnungen finden Sie unter Variablen.
Die Matcher in
und not in
können verwendet werden, um zu prüfen, ob eine Zuordnungsvariable einen bestimmten Schlüssel enthält. Es hängt von der Variablen ab, was der Schlüssel tatsächlich darstellt.
Mit der folgenden Syntax wird geprüft, ob eine Zuordnungsvariable einen bestimmten Schlüssel enthält:
<key> in (<map variable>)
<key>
muss eine Zeichenfolge sein, bei der Groß-/Kleinschreibung beachtet wird oder die Groß-/Kleinschreibung nicht beachtet wird.- Der Wert auf der rechten Seite muss in Klammern stehen.
Beispiel: Diese Bedingung ist erfüllt, wenn die HTTP-Anforderung ein Cookie mit dem Namen Foo
enthält:
'Foo' in (http.request.cookies)
Werte
Bei den in Prädikaten verwendeten Werten kann es sich entweder um Konstanten oder um Variablen handeln, die zur Laufzeit ausgewertet werden.
Konstanten
Die Regeln unterstützen Zeichenfolgenkonstanten, die in einfachen Anführungszeichen stehen.
Beispiel:
http.request.url.path sw '/foo'
Beachtung der Groß-/Kleinschreibung bei Zeichenfolgen
Beim Vergleich der Zeichenfolgen wird standardmäßig die Groß-/Kleinschreibung beachtet.
Beispiel: Wenn der URL-Pfad für eine HTTP-Anforderung /foo lautet, ergibt das folgende Prädikat für diese Anforderung keine Übereinstimmung, da bei diesem Zeichenfolgenvergleich die Groß-/Kleinschreibung beachtet wird:
http.request.url.path eq '/FOO'
Die Groß-/Kleinschreibung wird nicht beachtet, wenn es sich bei mindestens einem der verglichenen Werte um eine Zeichenfolge handelt, bei der die Groß-/Kleinschreibung nicht beachtet wird. Die Syntax für eine Zeichenfolge, bei der die Groß-/Kleinschreibung nicht beachtet werden soll, lautet wie folgt:
(i '<string content>')
Beispiel: Bei diesen Zeichenfolgen wird die Groß-/Kleinschreibung nicht beachtet. Bei der Verwendung in Prädikaten sind sie daher gleichwertig:
(i 'foo')
(i 'Foo')
(i 'FOO')
Anders als im ursprünglichen Beispiel ergibt dieses Prädikat eine Übereinstimmung, da beim Vergleich die Groß-/Kleinschreibung nicht beachtet wird:
http.request.url.path eq (i '/FOO')
Groß-/Kleinschreibung bei Zeichenfolgen beachten
Beim Vergleich der Zeichenfolgen wird standardmäßig die Groß-/Kleinschreibung beachtet.
Beispiel: Wenn der URL-Pfad für eine HTTP-Anforderung /foo
lautet, ergibt das folgende Prädikat für diese Anforderung keine Übereinstimmung, da bei diesem Zeichenfolgenvergleich die Groß-/Kleinschreibung beachtet wird:
http.request.url.path eq '/FOO'
Der Abgleich ohne Berücksichtigung der Groß-/Kleinschreibung erfolgt, wenn es sich bei mindestens einem der verglichenen Werte darum handelt, dass eine Zeichenfolge ohne Berücksichtigung der Groß-/Kleinschreibung verwendet wird. Die Syntax für eine Zeichenfolge, bei der die Groß-/Kleinschreibung nicht beachtet werden soll, lautet wie folgt:
(i '<string content>')
Beispiel: Bei diesen Zeichenfolgen wird die Groß-/Kleinschreibung nicht beachtet und ist daher bei der Verwendung in Prädikaten gleichwertig:
(i 'foo')
(i 'Foo')
(i 'FOO')
Anders als im ursprünglichen Beispiel ergibt dieses Prädikat eine Übereinstimmung, da es beim Vergleich die Groß-/Kleinschreibung nicht beachtet:
http.request.url.path eq (i '/FOO')
Variablen
Variablen werden in Bedingungen verwendet, um einen Vergleich mit einem bestimmten Wert der HTTP-Anforderung auszuführen. Die tatsächlichen Werte für jede Variable werden bei der Ausführung der Regeln während jeder einzelnen HTTP-Anforderung bestimmt.
Zuordnungsvariablen
Einige Variablen enthalten beliebige Schlüssel/Wert-Zuordnungen von Anforderungsdaten, z.B. Anforderungsheader oder Cookies. Für jeden Schlüssel kann es einen oder mehrere Werte geben. Beispiel: Es können verschiedene Anforderungsheader mit demselben Namen vorhanden sein.
In der Regel können Zuordnungsvariablen in Regeln wie folgt verwendet werden:
- Prüfen, ob eine Zuordnung einen bestimmten Schlüssel enthält
- Prüfen, ob eine Zuordnung einen bestimmten Schlüssel mit einem bestimmten Wert enthält
Prüfung, ob eine Zuordnung einen bestimmten Schlüssel enthält:
Bei der Prüfung, ob eine Zuordnungsvariable einen bestimmten Schlüssel enthält, wird der in
-Matcher verwendet. Weitere Informationen finden Sie unter Routing-Policy-Sprache für Load Balancer.
Beispiel:
'Foo' in (http.request.cookies)
Diese Bedingung ist erfüllt, wenn die HTTP-Anforderung ein Cookie mit dem Namen Foo
enthält.
Prüfung, ob eine Zuordnung einen bestimmten Schlüssel mit einem bestimmten Wert enthält:
Bei der Prüfung, ob eine Zuordnung einen bestimmten Schlüssel mit einem bestimmten Wert hat, wird der Notation []
mit Klammer verwendet, um die Werte für einen bestimmten Schlüssel abzurufen. Die Syntax für die Notation mit Klammern lautet wie folgt:
<variable>[<key>]
<key>
muss als Zeichenfolge angegeben werden, bei der Groß-/Kleinschreibung beachtet wird, oder nicht.
Die eigentliche Prüfung für einen bestimmten Wert erfolgt mit dem Matcher eq
, um zu prüfen, ob die any
der Werte bei diesem Schlüssel mit dem spezifischen Wert übereinstimmt. Das Prädikat ergibt eine Übereinstimmung, wenn mindestens einer der Werte in diesem Schlüssel mit diesem spezifischen Wert übereinstimmt.
Beispiele:
- Übereinstimmung, wenn ein Wert des Headers
header-name
gleichheader-value
ist:http.request.headers[(i 'header-name')] eq 'header-value'
Bei Header
name
wird die Groß-/Kleinschreibung wird nicht beachtet. Bei Headervalue
wird jedoch Groß-/Kleinschreibung beachtet. - Übereinstimmung, wenn ein Wert des Cookies "cookie-name" gleich
cookie-value
ist:http.request.cookies['cookie-name'] eq 'cookie-value'
Mit dem Matcher not eq
können Sie prüfen, ob none
der Werte bei diesem Schlüssel einem bestimmten Wert entspricht.
Beispiele:
- Übereinstimmung, wenn kein Wert des Headers
header-name
gleichheader-value
ist:http.request.headers[(i 'header-name')] not eq 'header-value'
Bei "header-name" wird die Groß-/Kleinschreibung nicht beachtet. Bei "header-value" wird jedoch die Groß-/Kleinschreibung beachtet.
- Übereinstimmung, wenn kein Wert des Cookies "cookie-name" gleich
cookie-value
ist:http.request.cookies['cookie-name'] not eq 'cookie-value'
Alle verfügbaren Variablen
Folgende Variablen können in den Bedingungen verwendet werden:
Name | Beschreibung | Beispiel |
---|---|---|
http.request.headers |
Eine Zuordnung mit HTTP-Anforderungsheadern. Diese Zuordnung weist ein besonderes Verhalten auf: bei den Schlüsseln (Headernamen) muss die Groß-/Kleinschreibung nicht beachtet werden. Zeichenfolgen, bei denen in Prädikaten die Groß-/Kleinschreibung beachtet wird, für |
|
http.request.url.path |
URL-Pfad für HTTP-Anforderung. Dies ist die Anforderungs-URL ohne Protokoll, Domain, Port und Abfragezeichenfolge. | |
http.request.url.query |
Eine Zuordnung, die Abfrageelemente der HTTP-Anforderungs-URL enthält. Wenn die Anforderungs-URL keine Abfrage (das Zeichen ? fehlt) oder wenn die Abfrage leer ist (das Zeichen ? ist das letzte Zeichen in der URL), ist diese Zuordnung leer.Die Abfrage wird geparst, um die Zuordnung
Das erste Innerhalb eines Schlüssel/Wert-Paares trennt das erste =-Zeichen den Schlüssel vom Wert. Wenn zusätzliche =-Zeichen vorhanden sind, werden diese als Teil des Wertes behandelt. Schlüssel und Werte werden entsprechend den URL-Maskierungsregeln nicht maskiert. |
URL:https://www.domain.com/path?key=value&key=%61&another%20key=another+value Die
In diesem Beispiel wird für den Abgleich von Schlüssel und Wert die Groß-/Kleinschreibung beachtet. Wenn die URL also anstelle von Ein Schlüssel/Wert-Paar aus der URL-Abfragezeichenfolge wird jedoch in folgenden Fällen nicht zur
Wenn rechts von dem |
http.request.cookies |
Eine Zuordnung mit HTTP-Anforderungscookies, die aus dem Anforderungsheader "Cookie" wie in RFC-6265 beschrieben geparst wurden, wobei der Schlüssel ein Cookienamen und der Wert der entsprechenden Cookiewert ist. Wenn der Anforderungsheader "Cookie" nicht in der Anforderung vorhanden sind, ist diese Zuordnung leer. |
Beispiele
Eine eingehende HTTP/1.1-Anforderung sieht folgendermaßen aus (Anforderungszeile und Header):
GET /category/some_category?action=search&query=search+terms&filters[]=5&features[]=12 HTTP/1.1
Accept-Encoding: gzip, deflate, br
Cookie: cookie_a=1; cookie_b=foo
Host: www.domain.com
User-Agent: Browser Foo/1.0
X-Forwarded-For: 1.2.3.4, 5.6.7.8
X-Forwarded-For: 9.10.11.12
Anschließend werden die für Regeln verfügbaren Variablen wie folgt mit Daten aus dieser Anforderung aufgefüllt (die Daten für strukturierte Variablen werden im JSON-Format angezeigt):
http.request.url.path: "/category/some_category"
http.request.url.query: {
"action": ["search"],
"query": ["search terms"],
"filters[]": ["5", "12"]
}
http.request.headers: {
"Accept-Encoding": ["gzip, deflate, br"],
"Cookie": ["some_cookie=1; another_cookie=foo"],
"Host": ["www.domain.com"],
"User-Agent": ["Browser Foo/1.0"],
"X-Forwarded-For": ["1.2.3.4, 5.6.7.8", "9.10.11.12"]
}
http.request.cookies: {
"cookie_a": ["1"],
"cookie_b": ["foo"]
}
Hier finden Sie einige Beispiele, wie diese Anforderung abgeglichen werden könnte:
- Wenn Anforderungen mit der Domain
www.domain.com
und URL-Pfaden, die mit/category/
beginnen, abgeglichen werden sollen, wird eine Bedingung wie die Folgende verwendet:all(http.request.headers[(i 'Host')] eq 'www.domain.com', http.request.url.path sw '/category')
- So werden Anforderungen gefunden, bei denen der URL-Pfad genau
/category/some_category
oder das Abfrageelementaction=search
der Anforderung lautet:any(http.request.url.path eq '/category/some_category', http.request.url.query['action'] eq 'search')
- So werden Anforderungen, die ein Abfragezeichenfolgenelement namens
query
mit dem Wertsearch terms
(nach der URL-Demaskierung) enthalten, abgeglichen:http.request.url.query['query'] eq 'search terms'
- So werden Anforderungen mit dem Cookie
cookie_a
, aber ohne Cookiecookie_c
abgeglichen:all('cookie_a' in (http.request.cookies), 'cookie_c' not in (http.request.cookies))