Esta página aplica-se ao Apigee e ao Apigee Hybrid.
Veja a documentação do
Apigee Edge.
O quê
A política ExternalCallout permite-lhe enviar pedidos gRPC ao seu servidor gRPC para implementar um comportamento personalizado que não é suportado pelas políticas do Apigee. No código do servidor, pode aceder e modificar facilmente as variáveis de fluxo no fluxo de um proxy.
O Apigee comunica com um servidor gRPC através de uma política ExternalCallout através de uma API. O Apigee usa a API para enviar variáveis de fluxo para o servidor gRPC. No seu servidor gRPC, pode ler e, consoante a variável, modificar as variáveis de fluxo indicadas na página de referência Variáveis de fluxo, bem como variáveis adicionais que especifica no XML da política.
Se configurar o servidor gRPC com o Apigee e incluir esta política num proxy, o Apigee processa os pedidos de API da seguinte forma:
- O Apigee envia uma mensagem que contém as variáveis de fluxo para o seu servidor gRPC.
- O código do servidor gRPC é executado, acedendo e modificando as variáveis conforme definido no código. Em seguida, o servidor gRPC envia uma resposta que contém todas as variáveis de fluxo de volta para o Apigee.
- O Apigee lê a resposta do seu servidor gRPC. Se forem adicionadas variáveis ou as variáveis de fluxo modificáveis forem modificadas, estas são atualizadas no Apigee.
Esta política é uma política padrão e pode ser implementada em qualquer tipo de ambiente. Para obter informações sobre os tipos de políticas e a disponibilidade com cada tipo de ambiente, consulte Tipos de políticas.
Para saber mais sobre o envio de pedidos gRPC, consulte os seguintes links:
<ExternalCallout>
Define uma política ExternalCallout.
<ExternalCallout async="true" continueOnError="true" enabled="true" name="EC">
Este elemento tem os seguintes atributos comuns a todas as políticas:
Atributo | Predefinição | Obrigatório? | Descrição |
---|---|---|---|
name |
N/A | Obrigatório |
O nome interno da política. O valor do atributo Opcionalmente, use o elemento |
continueOnError |
falso | Opcional | Definido como false para devolver um erro quando uma política falha. Este comportamento é o esperado para a maioria das políticas. Definido como true para que a execução do fluxo continue mesmo depois de uma política falhar. Veja também:
|
enabled |
verdadeiro | Opcional | Defina como true para aplicar a política. Defina como false para desativar a política. A política não é aplicada, mesmo que permaneça anexada a um fluxo. |
async |
falso | Descontinuado | Este atributo foi descontinuado. |
A tabela seguinte descreve os elementos secundários de
<ExternalCallout>
.
Elemento secundário | Obrigatória | Descrição |
---|---|---|
<TimeoutMs> |
Obrigatória | O limite de tempo do pedido em milissegundos para pedidos gRPC. |
<GrpcConnection> |
Obrigatória | Especifica o nome de um TargetServer existente para ser o servidor gRPC para o qual
enviar pedidos.
|
<Configurations> |
Opcional | Permite-lhe configurar vários aspetos da política ExternalCallout, incluindo os elementos <Property> e <FlowVariable> . |
Exemplo 1
Estão disponíveis exemplos funcionais de ExternalCallout em Amostras de chamadas externas no GitHub.
O exemplo seguinte ilustra uma configuração da política ExternalCallout.
<ExternalCallout enabled="true" continueOnError="false" name="ExternalCallout-1"> <DisplayName>External Callout 1</DisplayName> <TimeoutMs>5000</TimeoutMs> <GrpcConnection> <Server name="external-target-server"/> </GrpcConnection> <Configurations> <Property name="with.request.content">true</Property> <Property name="with.request.headers">false</Property> <Property name="with.response.content">true</Property> <Property name="with.response.headers">false</Property> <FlowVariable>example1.flow.variable</FlowVariable> <FlowVariable>example2.flow.variable</FlowVariable> </Configurations> <ExternalCallout>
O exemplo envia um pedido a um servidor gRPC externo representado pelo
TargetServer denominado external-target-server
, com as seguintes configurações:
<Property>
: Inclua o conteúdo do pedido e da resposta, mas não os cabeçalhos do pedido e da resposta, no pedido enviado para o servidor gRPC.<FlowVariable>
: Inclua variáveis de fluxo adicionaisexample1.flow.variable
eexample2.flow.variable
, especificadas pelos elementosFlowVariable
, no pedido enviado para o servidor gRPC.
Exemplo 2
No exemplo seguinte, o atributo useTargetUrl
do elemento Audience
está definido como true
. Quando useTargetUrl
é true
,
o nome do anfitrião do servidor de destino gRPC é usado como público-alvo. Por exemplo, se o anfitrião do servidor for my-grpc-server-java.a.run.app
, o público-alvo usado será https://my-grpc-server-java.a.run.app
.
<ExternalCallout continueOnError="false" enabled="true" name="External-Callout-1"> <DisplayName>External-Callout-1</DisplayName> <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <GoogleIDToken> <Audience useTargetUrl="true"/> </GoogleIDToken> </Authentication> </GrpcConnection> <TimeoutMs>5000</TimeoutMs> <Configurations> <Property name="with.request.content">true</Property> <Property name="with.request.headers">true</Property> <Property name="with.response.content">true</Property> <Property name="with.response.headers">true</Property> <FlowVariable>example.flow.variable</FlowVariable> <FlowVariable>another.flow.variable</FlowVariable> </Configurations> </ExternalCallout>
Referência de elemento secundário
As secções seguintes descrevem os elementos secundários de ExternalCallout
.
<TimeoutMs>
O limite de tempo do pedido em milissegundos para pedidos gRPC. <TimeoutMs>
tem de ser
um número positivo.
<GrpcConnection>
O elemento <GrpcConnection>
define o servidor gRPC como um TargetServer
existente, especificado pelo atributo name
. Consulte a página de referência de recursos
TargetServer
.
Nota: o
protocolo para o TargetServer
tem de ser GRPC
.
Por exemplo, o seguinte código
<GrpcConnection> <Server name="external-target-server"/> </GrpcConnection>
especifica que o servidor gRPC é um TargetServer
existente denominado
external-target-server
.
Use o elemento <Authentication>
(descrito mais adiante nesta secção) para gerar um token OpenID Connect emitido pela Google para fazer chamadas autenticadas a serviços baseados em gRPC, como serviços personalizados alojados no Cloud Run.
A tabela seguinte descreve os elementos secundários de
<GrpcConnection>
.
Elemento secundário | Obrigatório? | Descrição |
---|---|---|
<Server> elemento |
Obrigatório | Especifica o servidor gRPC. |
<Authentication> elemento |
Opcional | Gera um token OpenID Connect emitido pela Google para fazer chamadas autenticadas a serviços baseados em gRPC, como o Cloud Run. |
<Server>
elemento
Especifica o servidor gRPC.
A tabela seguinte descreve os atributos do elemento <Server>
.
Atributo | Descrição | Predefinição | Presença | Tipo |
---|---|---|---|---|
name |
O nome de um |
N/A | Obrigatória | String |
<Authentication>
elemento
Gera um token OpenID Connect emitido pela Google para fazer chamadas autenticadas a serviços baseados em gRPC, como serviços personalizados alojados no Cloud Run. A utilização deste elemento requer passos de configuração e implementação descritos no artigo Usar a autenticação Google. Com a configuração adequada, a política cria um token de autenticação para si e adiciona-o ao pedido de serviço.
Este elemento tem um elemento secundário obrigatório: GoogleIDToken
.
Predefinição | N/A |
Obrigatório? | Opcional. |
Tipo | Tipo complexo |
Elemento principal | <GrpcConnection> |
Elementos subordinados |
<GoogleIDToken> |
O elemento Authentication
usa a seguinte sintaxe:
Sintaxe
<ExternalCallout> ... <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <HeaderName ref="FLOW_VARIABLE">STRING</HeaderName> <GoogleIDToken> <Audience ref="variable-1">STRING</Audience> <IncludeEmail ref="variable-2">BOOLEAN</IncludeEmail> </GoogleIDToken> </Authentication> </GrpcConnection> </ExternalCallout>
Exemplo
O exemplo seguinte mostra o elemento GoogleIDToken
:
<ExternalCallout continueOnError="false" enabled="true" name="External-Callout-1"> <DisplayName>External-Callout-1</DisplayName> <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <HeaderName ref='my-variable'>X-Serverless-Authorization</HeaderName> <GoogleIDToken> <Audience>https://cloudrun-hostname.a.run.app</Audience> </GoogleIDToken> </Authentication> </GrpcConnection> <TimeoutMs>5000</TimeoutMs> <Configurations> <Property name="with.request.content">true</Property> <Property name="with.request.headers">true</Property> <Property name="with.response.content">true</Property> <Property name="with.response.headers">true</Property> <FlowVariable>example.flow.variable</FlowVariable> <FlowVariable>another.flow.variable</FlowVariable> </Configurations> </ExternalCallout>
Atributos
Nenhum.
Elemento secundário <HeaderName>
Por predefinição, quando existe uma configuração de autenticação, o Apigee gera um token de autorização
e injeta-o no cabeçalho Authorization
na mensagem enviada para o sistema de destino.
O elemento HeaderName
permite especificar o nome de um cabeçalho diferente
para conter esse token de portador. Esta funcionalidade é particularmente útil quando o destino é um serviço do Cloud Run que usa o cabeçalho X-Serverless-Authorization
. O cabeçalho Authorization
, se estiver presente, é deixado inalterado e também enviado no pedido.
Predefinição | N/A |
Obrigatório? | Não |
Tipo | String |
Elemento principal | <Authentication> |
Elementos subordinados | Nenhum |
O elemento HeaderName
usa a seguinte sintaxe:
Sintaxe
<ExternalCallout> ... <Authentication> <HeaderName ref="FLOW_VARIABLE">STRING</HeaderName> <GoogleIDToken> ... </GoogleIDToken> </Authentication> ... </ExternalCallout>
Com string estática
Neste exemplo, o token de autorização gerado é adicionado, por predefinição, a um cabeçalho denominado X-Serverless-Authorization
que é enviado para o sistema de destino. O cabeçalho Authorization
, se estiver presente, é deixado inalterado e também enviado no pedido.
<Authentication> <HeaderName>X-Serverless-Authorization</HeaderName> <GoogleIDToken> <Audience>https://cloudrun-hostname.a.run.app</Audience> </GoogleIDToken> </Authentication>
Com referência a variáveis
Neste exemplo, o token de autorização gerado é adicionado, por predefinição, a um cabeçalho denominado X-Serverless-Authorization
que é enviado para o sistema de destino. Se my-variable
tiver um valor, esse valor é usado em vez da string predefinida. O cabeçalho Authorization
, se estiver presente, é deixado inalterado e também enviado no pedido.
<Authentication> <HeaderName ref='my-variable'>X-Serverless-Authorization</HeaderName> <GoogleIDToken> <Audience>https://cloudrun-hostname.a.run.app</Audience> </GoogleIDToken> </Authentication>
Elemento secundário <GoogleIDToken>
Gera tokens OpenID Connect emitidos pela Google para fazer chamadas autenticadas aos serviços Google, como serviços personalizados alojados no Cloud Run.
Predefinição | N/A |
Obrigatório? | Obrigatória |
Tipo | String |
Elemento principal | <Authentication> |
Elementos subordinados | <Audience> <IncludeEmail> |
O elemento GoogleIDToken
usa a seguinte sintaxe:
Sintaxe
<ExternalCallout> ... <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <GoogleIDToken> <Audience ref="context-variable" useTargetUrl='BOOLEAN'>STRING</Audience> <IncludeEmail ref="context-variable">BOOLEAN</IncludeEmail> </GoogleIDToken> </Authentication> </GrpcConnection> </ExternalCallout>
Exemplo
O exemplo seguinte mostra o elemento GoogleIDToken
:
<Authentication> <GoogleIDToken> <Audience>https://httpserver0-bar.run.app</Audience> <IncludeEmail>true</IncludeEmail> </GoogleIDToken> </Authentication>
Elemento secundário <Audience>
O público-alvo do token de autenticação gerado, como a API ou a conta à qual o token concede acesso.
Se o valor de Audience
estiver vazio, o valor de ref
estiver vazio ou for resolvido para um valor vazio e useTargetUrl
for true
, é usado "https://" + (nome do anfitrião do servidor de destino gRPC) como público-alvo.
Por exemplo, se o anfitrião do servidor for my-grpc-server-java.a.run.app
, o público-alvo usado é https://my-grpc-server-java.a.run.app
.
Por predefinição, useTargetUrl
é false
.
<Audience>explicit-audience-value-here</Audience> or: <Audience ref='variable-name-here'/> or: <Audience ref='variable-name-here' useTargetUrl='true'/> or: <Audience useTargetUrl='true'/>
Predefinição | N/A |
Obrigatório? | Obrigatória |
Tipo | String |
Elemento principal | <GoogleIDToken> |
Elementos subordinados | Nenhum. |
Elemento secundário <IncludeEmail>
Se estiver definido como true
, o token de autenticação gerado vai conter as reivindicações da
conta de serviço email
e email_verified
.
Predefinição | falso |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal | <GoogleIDToken> |
Elementos subordinados | Nenhum. |
<Configurations>
O elemento <Configurations>
permite-lhe configurar vários aspetos da política ExternalCallout, incluindo <Property>
e <FlowVariable>
.
A tabela seguinte descreve os elementos secundários de
<Configurations>
.
Elemento secundário | Obrigatório? | Descrição |
---|---|---|
<Property> |
Obrigatório | Especifica se os cabeçalhos e/ou o conteúdo de pedido/resposta vão ser enviados para o servidor. Os valores possíveis são |
<FlowVariable> |
Obrigatório | Especifica que variáveis de fluxo adicionais devem ser enviadas para o servidor. |
<Property>
O elemento <Property>
especifica se os cabeçalhos e/ou o conteúdo de pedido/resposta
serão enviados para o servidor. Os valores possíveis são true
(o item é enviado) ou false
(o item não é enviado). O valor predefinido
é false
.
A tabela seguinte descreve os atributos do elemento <Property>
.
Atributo | Descrição | Predefinição | Presença | Tipo |
---|---|---|---|---|
name |
Especifica o conteúdo que vai ser enviado para o servidor. Os valores possíveis para
|
N/A | Obrigatória | String |
<FlowVariable>
O elemento <FlowVariable>
especifica que variáveis de fluxo adicionais
serão enviadas para o servidor. O valor de
<FlowVariable>
é um prefixo de uma variável, em vez do nome completo da variável.
Por exemplo , se o elemento a.b.c
, o valor de uma variável denominada a.b.c
é enviado para o servidor. Da mesma forma, o valor
de uma variável
denominada a.b.c.my-variable
é enviado para o servidor. Mas o valor de uma variável
denominada a.x.another-variable
não é enviado porque não tem o
prefixo a.b.c
. Seguem-se alguns exemplos
<Configurations> <FlowVariable>a.b.c</FlowVariable> <FlowVariable>d.e.f</FlowVariable> </Configurations>
Referência de erros
Erros de implementação
Nome do erro | Causa |
---|---|
FAILED_PRECONDITION |
Este erro ocorre se a conta de serviço estiver em falta quando o proxy é configurado com a etiqueta <Authentication> .
Por exemplo: Deployment of \"organizations/foo/apis/apiproxy/revisions/1\" requires a service account identity, but one was not provided with the request. |
PERMISSION_DENIED |
Este erro ocorre se houver um problema de autorização com a conta de serviço se o proxy estiver configurado com a etiqueta <Authentication>. Causas possíveis:
|
Erros de tempo de execução
A tabela abaixo descreve os erros de tempo de execução, que podem ocorrer quando a política é executada.
Código de falha | Estado de HTTP | Causa |
---|---|---|
GrpcTlsInitFailed |
500 |
Este erro ocorre se existirem problemas com a inicialização do TLS com o servidor gRPC (como problemas de keystore ou truststore). |
steps.externalcallout.[error_code] |
500 |
|
steps.externalcallout.ExecutionError |
500 |
Este erro ocorre se ocorrer alguma outra exceção durante a execução desta política. A exceção subjacente é exposta no faultstring. Se tiver ocorrido um problema com as credenciais do servidor gRPC, o erro terá um aspeto semelhante ao seguinte: { "fault": { "faultstring": "Encountered the following exception while sending the gRPC request or processing the response: [io.grpc.StatusRuntimeException: UNAVAILABLE: Credentials failed to obtain metadata].", "detail": { "errorcode": "steps.externalcallout.ExecutionError" } } } Pode consultar os registos do MP para obter mais indicações de depuração. |
googletoken.EmptyIDTokenAudience |
500 |
|
steps.externalcallout.ExecutionError
com a string de falha:
|
500 |
Este erro ocorre se o proxy de API estiver configurado com o elemento
|
steps.externalcallout.ExecutionError com faultstring contendo
PERMISSION DENIED .
Por exemplo, a faultstring terá o seguinte aspeto para o Cloud Run:
|
500 |
Este erro ocorre se o proxy da API estiver configurado com o elemento
|
Erros diversos
A tabela abaixo descreve erros diversos. Consulte a causa para ver mais detalhes.
Código de falha | Causa |
---|---|
ReferencesExistToGrpcServer |
Este erro ocorre se um utilizador tentar eliminar um servidor de destino gRPC, mas o servidor ainda estiver a ser usado por outras políticas. |
Falhas
As variáveis de falha na tabela seguinte são definidas para todas as políticas por predefinição. Consulte as variáveis específicas dos erros de políticas.
Variáveis | Onde | Exemplos |
---|---|---|
fault.name="fault_name" |
fault_name é o nome da falha, conforme indicado na tabela de erros de tempo de execução acima. O nome da falha é a última parte do código de falha. |
fault.name corresponde a "ExecutionError". |
externalcallout.[policy_name].failed |
policy_name é o nome especificado pelo utilizador da política que gerou a falha. |
externalcallout.ExternalCallout-1.failed = true |