A Common Expression Language (CEL) é uma
linguagem de código aberto sem completude de Turing que implementa semânticas comuns para
avaliação de expressões. As extensões de serviço usam um subconjunto de condições CEL para tomar decisões de avaliação de cadeia com base em dados de atributos. Em geral, uma expressão condicional consiste em uma ou mais instruções unidas por operadores lógicos (&&, || ou !).
Atributos
Para qualquer solicitação de conexão, o proxy extrai atributos,
que são um conjunto de informações contextuais. Os atributos têm um tipo fixo (como
string ou int) e podem estar ausentes ou presentes, dependendo do contexto.
Os atributos são expostos ao ambiente de execução da CEL durante o processamento da condição de correspondência. Para
encaminhar atributos específicos ao serviço ou plug-in de extensão, use o
campo forwardAttributes. Para mais informações, consulte Atributos
compatíveis.
Atributos de solicitação
É possível extrair os seguintes atributos das solicitações:
| Atributo | Tipo | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
Descrição |
|---|---|---|---|---|---|---|---|
request.headers |
mapa | ✓ | ✓ | ✓ | ✓ | ✓ | Um mapa string-para-string dos cabeçalhos da solicitação HTTP, em que todas as chaves estão em minúsculas. |
request.method |
string | ✓ | ✓ | ✓ | ✓ | ✓ | O método de solicitação HTTP (por exemplo, GET, POST). |
request.host |
string | ✓ | ✓ | ✓ | ✓ | ✓ | Conveniência equivalente a request.headers['host']. |
request.path |
string | ✓ | ✓ | ✓ | ✓ | ✓ | O caminho do URL HTTP solicitado. |
request.query |
string | ✓ | ✓ | ✓ | ✓ | ✓ | A string de consulta do URL (name1=value&name2=value2). |
request.scheme |
string | ✓ | ✓ | ✓ | ✓ | ✓ | O esquema de URL (http ou https). |
request.backend_service_name |
string | — | ✓ | ✓ | — | — | O nome do serviço de back-end. |
request.backend_service_project_number |
int | — | ✓ | ✓ | — | — | Número do projeto do serviço de back-end. |
Atributos de conexão
É possível extrair os seguintes atributos das conexões:
| Atributo | Tipo | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
Descrição |
|---|---|---|---|---|---|---|---|
source.ip |
string | ✓ | ✓ | ✓ | ✓ | — | Endereço IP do cliente. |
source.port |
int | ✓ | ✓ | ✓ | ✓ | ✓ | Número da porta de conexão do cliente. |
source.client_region |
string | ✓ | — | ✓ | — | ✓ | Código de duas letras do país ou da região do cliente. |
connection.sni |
string | ✓ | — | ✓ | ✓ | ✓ | Indicação de nome do servidor TLS downstream. |
connection.tls_version |
string | ✓ | — | ✓ | ✓ | ✓ | Versão TLS de downstream (por exemplo, TLSv1.2, TLSv1.3). |
connection.sha256_peer_certificate_digest |
string | ✓ | — | ✓ | ✓ | — | Resumo SHA-256 do certificado de peering. |
Operadores
As extensões de serviço são compatíveis com vários operadores que podem ser usados
para criar condições de correspondência complexas com base em instruções de expressão simples.
As extensões de serviço são compatíveis com
operadores lógicos, como &&, || e !, e operadores de manipulação de strings,
como x.contains('y').
Os operadores de manipulação de strings correspondem a strings ou substrings que você define. Por
exemplo, request.host.endsWith('.example.com') será avaliado como true se a solicitação
HTTP tiver sido feita para uma terminação de domínio que termina com example.com.
Os operadores lógicos permitem verificar várias variáveis em uma expressão
condicional. Por exemplo,
request.method == 'GET' && request.host.matches('.example.com') une duas
instruções e exige que ambas sejam true para produzir um
resultado geral de true.
Operadores lógicos
A tabela a seguir descreve os operadores lógicos compatíveis com as Extensões de Serviço.
| Expressão de exemplo | Descrição |
|---|---|
x == "foo" |
Retorna true se x for igual ao argumento literal de string constante. |
x == R"fo'o" |
Retorna true se x for igual à literal de string bruta fornecida que não interpreta sequências de escape. As literais de string bruta são convenientes para expressar strings que o código precisa usar para caracteres de sequência de escape. |
x == y |
Retornará true se x for igual a
y. |
x != y |
Retorna true se x não for igual a
y. |
x && y |
Retorna true se x e y
forem true. |
x || y |
Retorna true se x, y ou ambos
forem true. |
!x |
Retorna true se o valor booleano x for
false ou retorna false se o valor booleano
x for true. |
m['k'] |
Se a chave k estiver presente, vai retornar o valor na chave
k no mapa string a string m. Se a chave
k não estiver presente, vai retornar um erro que
faz com que a regra em avaliação não corresponda. |
k in m |
Retorna true se a chave k estiver presente no
mapa com chave de string m. Caso contrário, retornará
false. |
Operadores de manipulação de strings
A tabela a seguir descreve os operadores de manipulação de strings compatíveis com as extensões de serviço.
| Expressão | Descrição |
|---|---|
x.contains(y) |
Retorna true se a string x contiver a
substring y. |
x.startsWith(y) |
Retorna true se a string x começar com a
substring y. |
x.endsWith(y) |
Retorna true se a string x terminar com a
substring y. |
x.matches(y) |
Retorna As extensões de serviço usam a opção RE2::Latin1 ao compilar o padrão RE2, que desativa os recursos Unicode. As extensões do Edge permitem usar apenas uma expressão regular por expressão CEL. |
int(x) |
Converte o resultado da string de x em um tipo int. É possível usar a string convertida para comparação de números inteiros usando
operadores aritméticos padrão, como maior que (>)
e menor ou igual a (≤).
Isso funciona apenas para valores que podem ser inteiros. |
Exemplos de expressões
Combine todas as solicitações para hospedar example.com com o serviço de back-end bs1 em 123
como destino final:
request.host == "example.com" && request.backend_service_name == "bs1" && request.backend_service_project_number == 123
Combine todas as solicitações do caminho */inventory com um cabeçalho HTTP Hello. Os nomes de cabeçalho não diferenciam maiúsculas de minúsculas para correspondência de CEL:
request.path.endsWith("/inventory") && "Hello" in request.headers
Limitações
As limitações a seguir se aplicam às expressões CEL quando especificadas para extensões de serviço:
- Máximo de expressões por extensão: 1 para extensões de borda e 5 para outras extensões
- Número máximo de caracteres por expressão regular: 100
- Número máximo de caracteres por expressão CEL: 500