Referência da linguagem do comparador de CEL

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 true se a string x corresponder ao padrão RE2 especificado y.

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