Política PublishMessage

Política estándar

Esta página se aplica a Apigee y Apigee Hybrid.

Consulta la documentación de Apigee Edge.

La política PublishMessage te permite publicar la información de flujo del proxy de API en un tema de Google CloudPub/Sub. Pub/Sub de Google permite que los servicios se comuniquen de forma asíncrona con una latencia considerablemente menor. Para obtener más información sobre Pub/Sub, consulta ¿Qué es Pub/Sub?. La información que deseas publicar en un tema de Pub/Sub puede ser un texto literal o una variable de flujo. También puedes especificar una combinación de texto literal y variables de flujo con una plantilla de mensajes.

Si la solicitud de publicación se realiza correctamente, Apigee configura la variable de flujo publishmessage.message.id en el valor que muestra el servidor de Pub/Sub. Para obtener más información, consulta Variables de flujo.

Esta es una política estándar y se puede implementar en cualquier tipo de entorno. Para obtener información sobre los tipos de políticas y la disponibilidad con cada tipo de entorno, consulta Tipos de políticas.

Implementación del proxy y autenticación

Para ejecutar la política PublishMessage, necesitas un token de autenticación. Sin embargo, no hay un elemento <Authentication> explícito en la definición de la política. Debes implementar el proxy de API para usar la autenticación de Google, que agrega el token de autenticación a la solicitud de forma interna. Para obtener información sobre cómo implementar un proxy de API que use la autenticación de Google, consulta Pasos para la implementación.

Debes implementar tu proxy de API con una cuenta de servicio que tenga un rol con el permiso pubsub.topics.publish. Para obtener más información sobre los roles de Identity and Access Management (IAM) para Pub/Sub, consulta Permisos y roles.

La cuenta de servicio también debe tener el rol roles/iam.serviceAccountTokenCreator para generar el token de la cuenta de servicio del proxy. Consulta Service Account Token Creator para obtener más información.

<PublishMessage>

Especifica la política PublishMessage.

Valor predeterminado N/A
¿Es obligatorio? Obligatorio
Tipo Tipo complejo
Elemento principal N/A
Elementos secundarios <Attributes>
<CloudPubSub>
<DisplayName>
<IgnoreUnresolvedVariables>
<Source>
<UseMessageAsSource>

En la siguiente tabla, se proporciona una descripción de alto nivel de los elementos secundarios de <PublishMessage>.

Elemento secundario ¿Es obligatorio? Descripción
<Attributes> Opcional Es un conjunto de atributos que se adjuntarán al mensaje de Pub/Sub.
<CloudPubSub> Obligatorio Elemento principal de <Topic>. El elemento <Topic> especifica el tema de Pub/Sub en el que deseas publicar tu mensaje.
<DisplayName> Opcional Un nombre personalizado para la política
<IgnoreUnresolvedVariables> Opcional Especifica si el procesamiento se detiene en caso de que Apigee encuentre una variable sin resolver.
<Source> Opcional Especifica el mensaje que se publicará en el tema de Pub/Sub. Este elemento es opcional, pero debes usar <Source> o <UseMessageAsSource>.
<UseMessageAsSource> Opcional Especifica el mensaje que se publicará en el tema de Pub/Sub. Este elemento es opcional, pero debes usar <Source> o <UseMessageAsSource>.
Otros elementos secundarios
<Topic> Obligatorio Es un elemento secundario de <CloudPubSub>. Especifica el tema de Pub/Sub en el que deseas publicar el mensaje.
<Endpoint> Opcional Es un elemento secundario de <CloudPubSub>. Especifica el extremo regional para la mensajería de Pub/Sub para admitir la residencia de datos avanzada. Si no se especifica, se usa el extremo global pubsub.googleapis.com:443 de forma predeterminada.

El elemento <PublishMessage> usa la siguiente sintaxis:

Sintaxis

<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>

Ejemplo: Fuente

En el siguiente ejemplo, se muestra la definición de la 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>

Ejemplo: UseMessageAsSource

Esta política <PublishMessage> especifica el 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>

Ejemplo: Atributos

Esta política <PublishMessage> especifica el 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>

Ejemplo: Residencia de datos

Esta política <PublishMessage> especifica el 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 tiene los siguientes atributos que son comunes a todas las políticas:

Atributo Predeterminada (obligatorio) Descripción
name N/A Obligatorio

El nombre interno de la política. El valor del atributo name puede contener letras, números, espacios, guiones, guiones bajos y puntos. Este valor no puede superar los 255 caracteres.

De forma opcional, usa el elemento <DisplayName> para etiquetar la política en el editor de proxy de la IU de administración con un nombre de lenguaje natural diferente.

continueOnError falso Opcional Configúralo como false para mostrar un error cuando una política falla. Este es el comportamiento previsto para la mayoría de las políticas. Configúralo como true para continuar con la ejecución del flujo incluso después de que una política falle. También consulta:
enabled true Opcional Configúralo como true para aplicar la política. Configúralo como false para desactivar la política. La política no se aplicará, incluso si permanece conectada a un flujo.
async   falso Obsoleta Este atributo dejó de estar disponible.

Referencia del elemento secundario

En esta sección, se describen los elementos secundarios de <PublishMessage>.

<Attributes>

Especifica los atributos que se adjuntarán al mensaje de Pub/Sub.

Cada atributo es un par clave-valor. El nombre asociado al atributo debe ser único. El valor de cada uno se determina de forma dinámica en el tiempo de ejecución a través de una plantilla de mensajes.

Valor predeterminado N/A
¿Es obligatorio? Obligatorio
Tipo String
Elemento principal <PublishMessage>
Elementos secundarios Ninguno

El elemento <Attributes> usa la siguiente sintaxis:

Sintaxis

  <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>

Ejemplo 1

En el siguiente ejemplo, se establece un solo atributo con un valor fijo en el mensaje a medida que se publica:

<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>

Ejemplo 2

En el siguiente ejemplo, se establecen varios atributos en el mensaje a medida que se publica. Los valores de algunos de ellos se determinan de forma dinámica en el tiempo de ejecución:

<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>

Se usan además del atributo name para etiquetar la política en el editor de proxy de la IU de administración con un nombre de lenguaje natural diferente.

El elemento <DisplayName> es común a todas las políticas.

Valor predeterminado N/A
¿Es obligatorio? Opcional. Si omites <DisplayName>, se usa el valor del atributo name de la política.
Tipo String
Elemento principal <PolicyElement>
Elementos secundarios Ninguno

El elemento <DisplayName> usa la siguiente sintaxis:

Sintaxis

<PolicyElement>
  <DisplayName>POLICY_DISPLAY_NAME</DisplayName>
  ...
</PolicyElement>

Ejemplo

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

El elemento <DisplayName> no tiene atributos ni elementos secundarios.

<Source>

Especifica el mensaje que se publicará.

El mensaje puede ser un texto literal, una variable de flujo o una combinación de ambos en forma de una plantilla de mensajes.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String
Elemento principal <PublishMessage>
Elementos secundarios Ninguno

El elemento <Source> usa la siguiente sintaxis:

Sintaxis

 <Source>SOURCE</Source>

Ejemplo-1

En el siguiente ejemplo, se configura el mensaje fuente en el valor de la variable de flujo flow-var-1:

<Source>{flow-var-1}</Source>

Ejemplo-2

En el siguiente ejemplo, se usa una plantilla de mensaje para publicar un mensaje JSON con contenido 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 principal de <Topic>.

Puedes publicar en un solo tema de Pub/Sub. Por lo tanto, solo puedes tener un elemento <Topic> en el elemento <CloudPubSub>.

Valor predeterminado N/A
¿Es obligatorio? Obligatorio
Tipo Tipo complejo
Elemento principal <PublishMessage>
Elementos secundarios <Topic>
<Endpoint>

El elemento <CloudPubSub> usa la siguiente sintaxis:

Sintaxis

<CloudPubSub>
  <Topic>TOPIC_NAME</Topic>
  <Endpoint>REGIONAL_ENDPOINT</Endpoint>
</CloudPubSub>

Ejemplo

En el siguiente ejemplo, se muestran la declaración del elemento <CloudPubSub>:

<CloudPubSub>
  <Topic>projects/{my-project}/topics/{my-topic}</Topic>
  <Endpoint>pubsub.us.rep.googleapis.com:443</Endpoint>
</CloudPubSub>

<Topic>

Especifica el tema de Pub/Sub en el que deseas publicar el mensaje <Source>.

Usa el siguiente formato: projects/project-id/topics/topic-name

Valor predeterminado N/A
¿Es obligatorio? Obligatorio
Tipo String
Elemento principal <CloudPubSub>
Elementos secundarios Ninguno

El elemento <Topic> usa la siguiente sintaxis:

Sintaxis
<Topic>TOPIC_NAME</Topic>
Ejemplo

En el siguiente ejemplo, se especifica el tema de Pub/Sub en el que se publicará lo siguiente:

<Topic>projects/project-id-marketing/topics/topic-name-test1</Topic>

En este ejemplo, project-id-marketing es tu ID del proyecto de Google Cloud y topic-name-test1 es el tema en el que se debe publicar el mensaje.

<Endpoint>

Especifica el extremo regional para la mensajería de Pub/Sub para admitir la residencia de datos.
Valor predeterminado pubsub.googleapis.com:443 (endpoint global)
¿Es obligatorio? Opcional
Tipo String
Elemento principal <CloudPubSub>
Elementos secundarios Ninguno

El elemento <Endpoint> usa la siguiente sintaxis:

Sintaxis
<Endpoint>pubsub.CONTROL_PLANE_LOCATION.rep.googleapis.com:443</Endpoint>

Aquí, CONTROL_PLANE_LOCATION es la ubicación física en la que se almacenarán los datos del plano de control de Apigee. Para obtener una lista de las ubicaciones disponibles del plano de control, consulta Ubicaciones de Apigee.

Ejemplo

En el siguiente ejemplo, se especifica la URL del extremo regional que se usará para la mensajería de Pub/Sub en EE.UU. para admitir la residencia de datos:

<Endpoint>pubsub.us.rep.googleapis.com:443</Endpoint>
Ejemplo: Con Controles del servicio de VPC

En el siguiente ejemplo, se especifica la URL del extremo regional que se usará para la mensajería de Pub/Sub en EE.UU. para admitir la residencia de datos con los Controles del servicio de VPC:

<Endpoint>us-pubsub.googleapis.com:443</Endpoint>

<UseMessageAsSource>

Especifica el mensaje que se publicará.

Úsalo como alternativa al elemento <Source>. El valor debe ser el nombre de una variable de flujo que haga referencia a un mensaje, como request, response o message. Cuando especificas este elemento, la política usa el contenido del mensaje como el mensaje que se publicará. Debes usar este elemento en lugar de <Source> cuando el contenido del mensaje sea un flujo de octetos que no se pueda representar como una cadena, por ejemplo, el contenido de un archivo binario.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String
Elemento principal <PublishMessage>
Elementos secundarios Ninguno

El elemento <UseMessageAsSource> usa la siguiente sintaxis:

Sintaxis

<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>

Ejemplo-1

En el siguiente ejemplo, se indica a la política que use el contenido del mensaje de solicitud como carga útil para el mensaje de 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 si el procesamiento se detiene en caso de que Apigee encuentre una variable sin resolver.

Valor predeterminado Falso
¿Es obligatorio? Opcional
Tipo Booleano
Elemento principal <PublishMessage>
Elementos secundarios Ninguno

Configura el valor en true para ignorar las variables sin resolver y continuar con el procesamiento; de lo contrario, false. El valor predeterminado es false.

Configurar <IgnoreUnresolvedVariables> como true es diferente a configurar continueOnError como <PublishMessage> en true. Si configuras continueOnError como true, Apigee ignora todos los errores, no solo los errores de las variables.

El elemento <IgnoreUnresolvedVariables> usa la siguiente sintaxis:

Sintaxis

<IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>

Ejemplo

En el siguiente ejemplo, se configura <IgnoreUnresolvedVariables> como true:

<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>

Variables de flujo

Las variables de flujo son objetos que contienen datos específicos y están disponibles en el contexto de un flujo del proxy de API. Estas variables almacenan información como la información de la carga útil, la ruta de URL, las direcciones IP y los datos de la ejecución de la política. Para obtener más información sobre las variables de flujo, consulta Usa variables de flujo.

Si la política PublishMessage publica con éxito en el tema Pub/Sub, Apigee establece la variable de flujo publishmessage.message.id en el campo messageId que muestra el servidor de Pub/Sub. La variable de flujo es de tipo de string y está disponible para ti a partir del flujo de solicitud de proxy en adelante. Según tus requisitos, puedes usar la variable de flujo en otras políticas descendentes. Sin embargo, si la publicación falla, Apigee no establece la variable publishmessage.message.id y el acceso a esta variable causará errores.

Para obtener más información sobre varios tipos de variables de flujo, consulta Referencia de las variables de flujo.

Códigos de error

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
For more information about policy errors, see What you need to know about policy errors