Esta página se aplica à Apigee e à Apigee híbrida.
Confira a documentação da
Apigee Edge.
Com a política PublishMessage, você pode publicar as informações do fluxo do proxy de API em um tópico do Google Cloud Pub/Sub. O Pub/Sub do Google permite que os serviços se comuniquem de forma assíncrona, com uma latência significativamente menor. Para mais informações sobre o Pub/Sub, consulte O que é o Pub/Sub?. As informações que você quer publicar em um tópico do Pub/Sub podem ser um texto literal ou uma variável de fluxo. Também é possível especificar uma combinação de variáveis literais de texto e fluxo usando um modelo de mensagem.
Se a solicitação de publicação for bem-sucedida, a Apigee definirá a variável de fluxo
publishmessage.message.id para o valor retornado pelo servidor do Pub/Sub. Para mais informações, consulte
Variáveis de fluxo.
Esta é uma política padrão e pode ser implantada em qualquer tipo de ambiente. Para informações sobre os tipos de políticas e a disponibilidade de cada tipo de ambiente, consulte Tipos de políticas.
Autenticação e implantação de proxy
Para executar a política PublishMessage, você precisa de um token de autenticação. No entanto, não há um elemento <Authentication> explícito na definição da política. Você precisa implantar seu proxy de API para usar a autenticação do Google, que adiciona o token de autenticação à solicitação internamente. Para informações sobre como implantar um proxy de API que usa a autenticação do Google, consulte Etapas de implantação.
É preciso implantar o proxy de API com uma conta de serviço que tenha um papel com a permissão
pubsub.topics.publish. Para mais informações sobre os papéis do Identity and Access Management (IAM) para o
Pub/Sub, consulte Permissões e papéis.
A conta de serviço também precisa ter o papel roles/iam.serviceAccountTokenCreator para gerar o token da conta de serviço do proxy. Consulte
Criador de tokens da conta de serviço
para mais informações.
<PublishMessage>
Especifica a política PublishMessage.
| Valor padrão | N/A |
| Obrigatório? | Obrigatório |
| Tipo | Tipo complexo |
| Elemento pai | N/A |
| Elemento filho |
<Attributes><CloudPubSub><DisplayName><IgnoreUnresolvedVariables><Source><UseMessageAsSource> |
A tabela a seguir fornece uma descrição de alto nível dos elementos-filhos de <PublishMessage>:
| Elemento filho | Obrigatório? | Descrição |
|---|---|---|
<Attributes> |
Opcional | Um conjunto de atributos a serem anexados à mensagem do Pub/Sub. |
<CloudPubSub> |
Obrigatório | Elemento-pai de <Topic>. O elemento <Topic> especifica
o tópico do Pub/Sub em que você quer publicar a mensagem. |
<DisplayName> |
Opcional | Um nome personalizado para a política. |
<IgnoreUnresolvedVariables> |
Opcional | Especifica se o processamento será interrompido se a Apigee encontrar uma variável não resolvida. |
<Source> |
Opcional | Especifica a mensagem a ser publicada no tópico do Pub/Sub. Esse elemento é opcional, mas
você precisa usar <Source> ou <UseMessageAsSource>.
|
<UseMessageAsSource> |
Opcional | Especifica a mensagem a ser publicada no tópico do Pub/Sub. Esse elemento é opcional, mas
você precisa usar <Source> ou <UseMessageAsSource>.
|
| Outros elementos filhos | ||
<Topic> |
Obrigatório | Um elemento filho de <CloudPubSub>. Especifica o tópico do Pub/Sub em que você quer
publicar a mensagem. |
<Endpoint> |
Opcional | Um elemento filho de <CloudPubSub>. Especifica o endpoint regional para
mensagens do Pub/Sub e oferece suporte à residência de dados avançada.
O padrão é o endpoint global pubsub.googleapis.com:443 se não for especificado. |
O elemento <PublishMessage> usa a seguinte sintaxe:
Sintaxe
<PublishMessage continueOnError="[true|false]" enabled="[true|false]" name="Publish-Message-1"> <DisplayName>DISPLAY_NAME</DisplayName> <Source>SOURCE_VALUE</Source> <Attributes> <Attribute> name=ATTRIBUTE_NAME>ATTRIBUTE_VALUE</Attribute> </Attributes> <CloudPubSub> <Topic>TOPIC_NAME</Topic> <Endpoint>REGIONAL_ENDPOINT</Endpoint> </CloudPubSub> <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables> </PublishMessage>
Exemplo: origem
O exemplo a seguir mostra a definição da política <PublishMessage>:
<PublishMessage continueOnError="false" enabled="true" name="Publish-Message-1"> <DisplayName>Publish Message-1</DisplayName> <Source>this is a message template {flow-variable1}</Source> <CloudPubSub> <Topic>projects/{flow-variable-project-id}/topics/{flow-variable-topic-name}</Topic> </CloudPubSub> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </PublishMessage>
Exemplo: UseMessageAsSource
Esta política <PublishMessage> especifica o elemento UseMessageAsSource:
<PublishMessage continueOnError="false" enabled="true" name="Publish-Message-2"> <UseMessageAsSource>request</UseMessageAsSource> <CloudPubSub> <Topic>projects/{flow-variable-project-id}/topics/{flow-variable-topic-name}</Topic> </CloudPubSub> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </PublishMessage>
Exemplo: atributos
Esta política <PublishMessage> especifica o elemento Attributes:
<PublishMessage name="Publish-Message-3"> <Source>this is a message template {flow-variable1}</Source> <Attributes> <Attribute name='attr-name-0'>fixed-value</Attribute> <Attribute name='another-attribute-name'>{request.queryparam.attr1}</Attribute> <Attribute name='a-third-attribute-name'>{request.queryparam.attr2:default-value}</Attribute> </Attributes> <CloudPubSub> <Topic>projects/{flow-variable-project-id}/topics/{flow-variable-topic-name}</Topic> </CloudPubSub> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </PublishMessage>
Exemplo: residência de dados
Esta política <PublishMessage> especifica o elemento Endpoint:
<PublishMessage name="Publish-Message-3"> <Source>this is a message template {flow-variable1}</Source> <CloudPubSub> <Topic>projects/{flow-variable-project-id}/topics/{flow-variable-topic-name}</Topic> <Endpoint>pubsub.us.rep.googleapis.com:443</Endpoint> </CloudPubSub> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </PublishMessage>
Este elemento tem os seguintes atributos comuns a todas as políticas:
| Atributo | Padrão | Obrigatório? | Descrição |
|---|---|---|---|
name |
N/A | Valor |
O nome interno da política. O valor do atributo Opcionalmente, use o elemento |
continueOnError |
falso | Opcional | Defina como false para retornar um erro quando uma política falhar. Esse é o comportamento esperado para
a maioria das políticas. Defina como true para que a execução do fluxo continue, mesmo depois que uma política
falhar. Consulte também:
|
enabled |
true | Opcional | Defina como true para aplicar a política. Defina como false para desativar a política. A política não será aplicada mesmo que permaneça vinculada a um fluxo. |
async |
falso | Obsoleto | Esse atributo está obsoleto. |
Referência a elementos filhos
Esta seção descreve os elementos filhos de<PublishMessage>.
<Attributes>
Especifica os atributos a serem anexados à mensagem do Pub/Sub.
Cada atributo é um par de chave-valor. O nome associado ao atributo precisa ser exclusivo. O valor de cada um é determinado dinamicamente no tempo de execução por um modelo de mensagem.
| Valor padrão | N/A |
| Obrigatório? | Obrigatório |
| Tipo | String |
| Elemento pai |
<PublishMessage> |
| Elemento filho | Nenhum |
O elemento <Attributes> usa a seguinte sintaxe:
Sintaxe
<Attributes> <Attribute name='NAME-1'>fixed-value</Attribute> <Attribute name='NAME-2'>{flow-variable}</Attribute> ... <Attribute name='NAME-N'>message template here {flow-variable:default-value}</Attribute> </Attributes>
Exemplo 1
O exemplo a seguir define um único atributo com um valor fixo na mensagem à medida que ela é publicada:
<PublishMessage name="PM-with-one-attribute">
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<Source>{request.queryparam.message}</Source>
<Attributes>
<Attribute name='my-attribute-1'>fixed-value</Attribute>
</Attributes>
<CloudPubSub>
<Topic>projects/{request.queryparam.project}/topics/{request.queryparam.topic}</Topic>
</CloudPubSub>
</PublishMessage>Exemplo 2
O exemplo a seguir define vários atributos na mensagem à medida que ela é publicada. Os valores de alguns deles são determinados dinamicamente no tempo de execução:
<PublishMessage name="PM-with-multiple-attributes"> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Source>{my-assembled-message}</Source> <Attributes> <Attribute name='attr-0'>fixed-value</Attribute> <Attribute name='attr-1'>{flow-variable1}</Attribute> <Attribute name='attr-2'>fixed portion {flow-variable2:default-value}</Attribute> </Attributes> <CloudPubSub> <Topic>projects/{propertyset.settings.project}/topics/{propertyset.settings.topic}</Topic> </CloudPubSub> </PublishMessage>
<DisplayName>
Use além do atributo name para rotular a política no editor de proxy da IU de gerenciamento com um nome de som diferente e mais natural.
O elemento <DisplayName> é comum a todas as políticas.
| Valor padrão | N/A |
| Obrigatório? | Opcional. Se você omitir <DisplayName>, o valor do atributo name da política será usado |
| Tipo | String |
| Elemento pai | <PolicyElement> |
| Elemento filho | Nenhum |
O elemento <DisplayName> usa a seguinte sintaxe:
Sintaxe
<PolicyElement> <DisplayName>POLICY_DISPLAY_NAME</DisplayName> ... </PolicyElement>
Exemplo
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
O elemento <DisplayName> não tem atributos ou elementos filhos.
<Source>
Especifica a mensagem a ser publicada.
A mensagem pode ser um texto literal, uma variável de fluxo ou uma combinação de ambos na forma de um modelo de mensagem.
| Valor padrão | N/A |
| Obrigatório? | Opcional |
| Tipo | String |
| Elemento pai |
<PublishMessage> |
| Elemento filho | Nenhum |
O elemento <Source> usa a seguinte sintaxe:
Sintaxe
<Source>SOURCE</Source>
Example-1
O exemplo a seguir define a mensagem de origem para o valor da variável de fluxo flow-var-1:
<Source>{flow-var-1}</Source>
Example-2
O exemplo a seguir usa um modelo de mensagem para publicar uma mensagem JSON com conteúdo dinâmico:
<PublishMessage name="PM-with-source-template"> <Source>{ "name": "value-1", "count": "{flow-variable1}", "action": "{flow-variable2}" }</Source> <Attributes> <Attribute name='content-type'>application/json</Attribute> </Attributes> <CloudPubSub> <Topic>projects/{propertyset.settings.project}/topics/{propertyset.settings.topic}</Topic> </CloudPubSub> </PublishMessage>
<CloudPubSub>
Elemento-pai de <Topic>.
Só é possível publicar em um tópico do Pub/Sub. Portanto, só é possível ter um elemento <Topic> no
elemento <CloudPubSub>.
| Valor padrão | N/A |
| Obrigatório? | Obrigatório |
| Tipo | Tipo complexo |
| Elemento pai |
<PublishMessage> |
| Elemento filho |
<Topic><Endpoint> |
O elemento <CloudPubSub> usa a seguinte sintaxe:
Sintaxe
<CloudPubSub> <Topic>TOPIC_NAME</Topic> <Endpoint>REGIONAL_ENDPOINT</Endpoint> </CloudPubSub>
Exemplo
O exemplo a seguir mostra os atributos do elemento <CloudPubSub>:
<CloudPubSub>
<Topic>projects/{my-project}/topics/{my-topic}</Topic>
<Endpoint>pubsub.us.rep.googleapis.com:443</Endpoint>
</CloudPubSub><Topic>
Especifica o tópico do Pub/Sub em que você quer publicar a mensagem <Source>.
Use o seguinte formato: projects/project-id/topics/topic-name
| Valor padrão | N/A |
| Obrigatório? | Obrigatório |
| Tipo | String |
| Elemento pai |
<CloudPubSub> |
| Elemento filho | Nenhum |
O elemento <Topic> usa a seguinte sintaxe:
Sintaxe
<Topic>TOPIC_NAME</Topic>
Exemplo
O exemplo a seguir especifica o tópico do Pub/Sub a ser publicado:
<Topic>projects/project-id-marketing/topics/topic-name-test1</Topic>
Neste exemplo, project-id-marketing é o ID do projeto Google Cloud , e
topic-name-test1 é o
tópico em que a mensagem será publicada.
<Endpoint>
Especifica o endpoint regional para
mensagens do Pub/Sub e oferece suporte à residência de dados.
| Valor padrão | pubsub.googleapis.com:443 (endpoint global) |
| Obrigatório? | Opcional |
| Tipo | String |
| Elemento pai |
<CloudPubSub> |
| Elemento filho | Nenhum |
O elemento <Endpoint> usa a seguinte sintaxe:
Sintaxe
<Endpoint>pubsub.CONTROL_PLANE_LOCATION.rep.googleapis.com:443</Endpoint>Em que CONTROL_PLANE_LOCATION é o local físico em que os dados do plano de controle da Apigee serão armazenados. Para ver uma lista de locais disponíveis do plano de controle, consulte Locais da Apigee.
Exemplo
O exemplo a seguir especifica o URL do endpoint regional a ser usado para mensagens do Pub/Sub nos EUA para oferecer suporte à residência de dados:
<Endpoint>pubsub.us.rep.googleapis.com:443</Endpoint>Exemplo: com o VPC Service Controls
O exemplo a seguir especifica o URL do endpoint regional a ser usado para mensagens do Pub/Sub nos EUA para oferecer suporte à residência de dados com o VPC Service Controls:
<Endpoint>us-pubsub.googleapis.com:443</Endpoint><UseMessageAsSource>
Especifica a mensagem a ser publicada.
Use isso como uma alternativa ao elemento <Source>.
O valor precisa ser o nome de uma variável de fluxo que se refere a uma mensagem, como
request, response ou message. Quando você especifica esse
elemento, a política usa o conteúdo da mensagem como a mensagem a ser publicada. Use esse elemento em vez de <Source> quando o conteúdo da mensagem for um fluxo de octetos que não pode ser representado como uma string, por exemplo, conteúdo de um arquivo binário.
| Valor padrão | N/A |
| Obrigatório? | Opcional |
| Tipo | String |
| Elemento pai |
<PublishMessage> |
| Elemento filho | Nenhum |
O elemento <UseMessageAsSource> usa a seguinte sintaxe:
Sintaxe
<PublishMessage name="PM-with-use-message-as-source"> <UseMessageAsSource>MESSAGE_NAME</UseMessageAsSource> <Attributes> <Attribute name='attr-1'>{flowvar1}</Attribute> </Attributes> <CloudPubSub> <Topic>projects/{flowvar1}/topics/{flowvar-topic}</Topic> </CloudPubSub> </PublishMessage>
Example-1
O exemplo a seguir instrui a política a usar o conteúdo da mensagem de solicitação como o payload da mensagem do Pub/Sub:
<PublishMessage name="PM-with-use-message-as-source"> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <UseMessageAsSource>request</UseMessageAsSource> <Attributes> <Attribute name='attr-1'>{flowvar1}</Attribute> </Attributes> <CloudPubSub> <Topic>projects/{propertyset.settings.project}/topics/{propertyset.settings.topic}</Topic> </CloudPubSub> </PublishMessage>
<IgnoreUnresolvedVariables>
Especifica se o processamento será interrompido se a Apigee encontrar uma variável não resolvida.
| Valor padrão | Falso |
| Obrigatório? | Opcional |
| Tipo | Booleano |
| Elemento pai |
<PublishMessage>
|
| Elemento filho | Nenhum |
Defina o valor como true para ignorar variáveis não resolvidas e continuar o processamento. Caso contrário, false. O
valor padrão é false.
Definir <IgnoreUnresolvedVariables> como true é diferente de definir o continueOnError do <PublishMessage>
como true. Se você definir continueOnError como true, a Apigee vai ignorar todos os erros, e não
apenas os erros nas variáveis.
O elemento <IgnoreUnresolvedVariables> usa a seguinte sintaxe:
Sintaxe
<IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>
Exemplo
O exemplo a seguir define <IgnoreUnresolvedVariables> como true:
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
Variáveis de fluxo
As variáveis de fluxo são objetos que contêm dados específicos e estão disponíveis para você no contexto de um fluxo de proxy de API. Essas variáveis armazenam informações, como informações de payload, caminho do URL, endereços IP e dados da execução da política. Para mais informações sobre variáveis de fluxo, consulte Como usar variáveis de fluxo.
Se a política PublishMessage for publicada com sucesso no tópico Pub/Sub,
a Apigee definirá a variável de fluxo publishmessage.message.id para o
messageId retornado pelo
servidor Pub/Sub. A variável de fluxo é do tipo string, e a variável está disponível para você
a partir do fluxo de solicitação do proxy. Com base no seu requisito, é possível usar a variável de fluxo em
outras políticas downstream. No entanto, se a publicação falhar,
a Apigee não definirá a variável publishmessage.message.id,
e o acesso a essa variável causará erros.
Para mais informações sobre vários tipos de variáveis de fluxo, consulte a Referência das variáveis de fluxo.
Códigos de erro
This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Cause |
|---|---|---|
steps.publishmessage.PermissionDeniedError |
500 |
This error occurs when the runtime service account cannot impersonate the proxy service account or the proxy service account does not have the permission to publish to the topic. |
steps.publishmessage.ExecutionError |
500 |
This error occurs if there was an unexpected error while publishing the message to Pub/Sub. You can view the details of the error in the error message. |
steps.publishmessage.MessageVariableNotMessageType |
500 |
This error occurs if the variable name you specified in UseMessageAsSource
cannot be resolved, or is not a message type.
|
Fault variables
Whenever there are execution errors in a policy, Apigee generates error messages. You can view these error messages in the error response. Many a time, system generated error messages might not be relevant in the context of your product. You might want to customize the error messages based on the type of error to make the messages more meaningful.
To customize the error messages, you can use either fault rules or the RaiseFault policy. For
information about differences between fault rules and the RaiseFault policy, see
FaultRules vs. the RaiseFault policy.
You must check for conditions using the Condition element in both the fault rules and the RaiseFault policy.
Apigee provides fault variables unique to each policy and the values of the fault variables are set when a policy triggers runtime errors.
By using these variables, you can check for specific error conditions and take appropriate actions. For more information about checking error
conditions, see Building conditions.
| Variables | Where | Example |
|---|---|---|
fault.name |
The fault.name can match to any of the faults listed in the Runtime errors table.
The fault name is the last part of the fault code. |
fault.name Matches "UnresolvedVariable" |
publishmessage.POLICY_NAME.failed |
POLICY_NAME is the user-specified name of the policy that threw the fault. | publishmessage.publish-message-1.failed = true |