Crea suscripciones de envío

En este documento, se describe cómo crear una suscripción push. Puedes usar la consola deTrusted Cloud , Google Cloud CLI, la biblioteca cliente o la API de Pub/Sub para crear una suscripción push.

Antes de comenzar

Roles y permisos requeridos

Para crear una suscripción, debes configurar el control de acceso a nivel del proyecto. También necesitas permisos a nivel del recurso si tus suscripciones y temas están en proyectos diferentes, como se explica más adelante en esta sección.

Para obtener los permisos que necesitas para crear suscripciones push, pídele a tu administrador que te otorgue el rol de IAM de Editor de Pub/Sub (roles/pubsub.editor) en el proyecto. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para crear suscripciones push. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para crear suscripciones push:

  • Crea una suscripción: pubsub.subscriptions.create
  • Borra una suscripción: pubsub.subscriptions.delete
  • Obtén una suscripción: pubsub.subscriptions.get
  • Enumera una suscripción: pubsub.subscriptions.list
  • Actualiza una suscripción: pubsub.subscriptions.update
  • Adjunta una suscripción a un tema: pubsub.topics.attachSubscription
  • Obtén la política de IAM para una suscripción: pubsub.subscriptions.getIamPolicy
  • Configura la política de IAM para una suscripción: pubsub.subscriptions.setIamPolicy

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Si necesitas crear suscripciones push en un proyecto que estén asociadas a un tema en otro proyecto, pídele al administrador del tema que también te otorgue el rol de IAM de editor de Pub/Sub (roles/pubsub.editor) en el tema.

Propiedades de suscripción de envío

Cuando configuras una suscripción de envío, puedes especificar las siguientes propiedades.

Propiedades comunes

Obtén información sobre las propiedades comunes de las suscripciones que puedes establecer en todas las suscripciones.

Extremos

URL del extremo (obligatoria). Una dirección HTTPS de acceso público. El servidor para el extremo de envío debe tener un certificado SSL válido firmado por una autoridad certificada. El servicio de Pub/Sub entrega mensajes a los extremos de envío desde la misma Trusted Cloud región en la que el servicio de Pub/Sub almacena los mensajes. El servicio de Pub/Sub entrega mensajes de la misma Trusted Cloud región según el criterio del mejor esfuerzo.

  • Si los suscriptores usan un firewall, no pueden recibir solicitudes de envío. Para recibir solicitudes de envío, debes desactivar el firewall y verificar el token web JSON (JWT) que se usa en la solicitud. Si un suscriptor tiene un firewall, es posible que recibas un error 403 permission denied.

  • Pub/Sub ya no requiere títulos de propiedad para los dominios de URL de suscripción de envío. Si tu dominio recibe solicitudes POST inesperadas de Pub/Sub, puedes informar sospechas de abuso.

Autenticación

Habilita la autenticación. Cuando está habilitada, los mensajes que Pub/Sub entrega al extremo de envío incluyen un encabezado de autorización para permitir que el extremo autentique la solicitud. Los mecanismos de autenticación y autorización automáticos están disponibles para los extremos del entorno estándar de App Engine y Cloud Run Functions alojados en el mismo proyecto que la suscripción.

La configuración de autenticación para una suscripción push autenticada consta de una cuenta de servicio administrada por el usuario y los parámetros de público que se especifican en una llamada create, patch o ModifyPushConfig. También debes otorgar un rol específico a una cuenta de servicio, como se explica en la siguiente sección.

  • Público: Es una cadena única que no distingue mayúsculas de minúsculas y que el webhook usa para validar el público objetivo de este token en particular.

  • Cuenta de servicio: Pub/Sub crea automáticamente una cuenta de servicio para ti con el formato service-{PROJECT_NUMBER}@gcp-sa-pubsub.s3ns-system.iam.gserviceaccount.com.

Requisitos previos para habilitar la autenticación

La cuenta de servicio administrada por el usuario es la cuenta de servicio asociada con la suscripción de envío. Esta cuenta se usa como el reclamo email del token web JSON (JWT) generado. A continuación, se incluye una lista de requisitos para la cuenta de servicio:

  • Esta cuenta de servicio administrada por el usuario debe estar en el mismo proyecto que la suscripción push.

  • La principal que crea o modifica la suscripción de envío debe tener el permiso iam.serviceAccounts.actAs en la cuenta de servicio administrada por el usuario para adjuntar la cuenta de servicio a la suscripción de envío. Para obtener más información, consulta Conecta cuentas de servicio a recursos.

  • Permisos requeridos: A esta cuenta de servicio se le debe otorgar el permiso iam.serviceAccounts.getOpenIdToken (incluido en el rol roles/iam.serviceAccountTokenCreator) para permitir que Pub/Sub cree tokens de JWT para que la cuenta de servicio especificada autentique las solicitudes push.

Separación de la carga útil

La opción Habilitar la separación de la carga útil quita todos los metadatos de los mensajes de Pub/Sub, excepto los datos del mensaje. Con el desencapsulado de la carga útil, los datos del mensaje se entregan directamente como el cuerpo HTTP.

También puedes habilitar la opción Escribir metadatos. La opción Escribir metadatos agrega los metadatos del mensaje que se quitaron anteriormente al encabezado de la solicitud.

Entrega a direcciones de VPC privadas

Pub/Sub opera fuera de las redes de VPC y no puede enviar mensajes directamente a direcciones de VPC privadas. Sin embargo, puedes usar Eventarc para enrutar mensajes a servicios dentro de tu VPC. Pub/Sub puede enviar mensajes a un activador de Eventarc, que luego puede reenviarlos a un servicio dentro de tu VPC, como un servicio de Cloud Run o una ejecución de Workflows. Para obtener más información, consulta la documentación de Eventarc.

Controles del servicio de VPC

En el caso de un proyecto protegido por los Controles del servicio de VPC, ten en cuenta las siguientes limitaciones para las suscripciones de envío:

  • Solo puedes crear suscripciones de envío nuevas para las que el extremo de envío esté configurado en un servicio de Cloud Run con una URL run.app predeterminada o una ejecución de Workflows. Los dominios personalizados no funcionan.

  • Cuando enrutas eventos a través de Eventarc a destinos de Workflows para los que el extremo de envío está configurado en una ejecución de Workflows, solo puedes crear suscripciones de envío nuevas a través de Eventarc.

  • No puedes actualizar las suscripciones push existentes. Estas suscripciones de envío seguirán funcionando, aunque no estarán protegidas por los Controles del servicio de VPC.

Crea una suscripción de envío

En los siguientes ejemplos, se muestra cómo crear una suscripción con entrega de inserción, utilizando la configuración predeterminada proporcionada.

De forma predeterminada, las suscripciones usan la entrega de extracción, a menos que establezcas explícitamente una configuración de envío, como se muestra en los siguientes ejemplos.

Console

Para crear una suscripción de envío, completa los siguientes pasos:

  1. En la consola de Trusted Cloud , ve a la página Suscripciones.

    Ir a Suscripciones

  2. Haz clic en Crear suscripción.
  3. En el campo ID de suscripción, ingresa un nombre.

    Para obtener información sobre cómo asignar un nombre a una suscripción, consulta Lineamientos para asignar un nombre a un tema o una suscripción.

  4. Elige o crea un tema desde el menú desplegable. La suscripción recibe mensajes del tema.
  5. Selecciona Envío como el Tipo de entrega.
  6. Especifica una URL de extremo.
  7. Conserva todos los demás valores predeterminados.
  8. Haz clic en Crear.

Desde la sección Temas también puedes crear una suscripción. Este acceso directo es útil para asociar temas a suscripciones.

  1. En la consola de Trusted Cloud , ve a la página Temas.

    Ir a temas

  2. Haz clic en junto al tema en el que se creará una suscripción.
  3. En el menú contextual, selecciona Crear suscripción (Create subscription).
  4. Ingresa el ID de suscripción.

    Para obtener información sobre cómo asignar un nombre a una suscripción, consulta Lineamientos para asignar un nombre a un tema o una suscripción.

  5. Selecciona Envío como el Tipo de entrega.
  6. Especifica una URL de extremo.
  7. Conserva todos los demás valores predeterminados.
  8. Haz clic en Crear.

gcloud

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para crear una suscripción push, ejecuta el comando gcloud pubsub subscriptions create.

    gcloud pubsub subscriptions create SUBSCRIPTION_ID \
    --topic=TOPIC_ID \
    --push-endpoint=PUSH_ENDPOINT

    Reemplaza lo siguiente:

    • SUBSCRIPTION_ID: Es el nombre o ID de tu nueva suscripción a notificaciones push.
    • TOPIC_ID: Es el nombre o ID de tu tema.
    • PUSH_ENDPOINT: Es la URL que se usará como extremo para esta suscripción. Por ejemplo, https://myproject.appspot.com/myhandler
  3. REST

    Para crear una suscripción de envío, usa el método projects.subscriptions.create:

    Solicitud:

    La solicitud debe autenticarse con un token de acceso en el encabezado Authorization. A fin de obtener un token de acceso para las credenciales predeterminadas actuales de la aplicación, usa gcloud auth application-default print-access-token.

    PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID
    Authorization: Bearer ACCESS_TOKEN
    

    Cuerpo de la solicitud:

    {
    "topic": "projects/PROJECT_ID/topics/TOPIC_ID",
    // Only needed if you are using push delivery
    "pushConfig": {
    "pushEndpoint": "PUSH_ENDPOINT"
    }
    }

    Aquí:

  4. PROJECT_ID es el ID del proyecto.
  5. SUBSCRIPTION_ID es tu ID de suscripción.
  6. TOPIC_ID es el ID del tema.
  7. PUSH_ENDPOINT es una URL que se usará como extremo. Por ejemplo, https://myproject.appspot.com/myhandler
  8. Respuesta:

    {
    "name": "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID",
    "topic": "projects/PROJECT_ID/topics/TOPIC_ID",
    "pushConfig": {
    "pushEndpoint": "https://PROJECT_ID.appspot.com/myhandler",
    "attributes": {
      "x-goog-version": "v1"
    }
    },
    "ackDeadlineSeconds": 10,
    "messageRetentionDuration": "604800s",
    "expirationPolicy": {
    "ttl": "2678400s"
    }
    }

    C++

    Antes de probar esta muestra, sigue las instrucciones de configuración de C++ en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para C++.

    namespace pubsub = ::google::cloud::pubsub;
    namespace pubsub_admin = ::google::cloud::pubsub_admin;
    [](pubsub_admin::SubscriptionAdminClient client,
       std::string const& project_id, std::string const& topic_id,
       std::string const& subscription_id, std::string const& endpoint) {
      google::pubsub::v1::Subscription request;
      request.set_name(
          pubsub::Subscription(project_id, subscription_id).FullName());
      request.set_topic(pubsub::Topic(project_id, topic_id).FullName());
      request.mutable_push_config()->set_push_endpoint(endpoint);
      auto sub = client.CreateSubscription(request);
      if (sub.status().code() == google::cloud::StatusCode::kAlreadyExists) {
        std::cout << "The subscription already exists\n";
        return;
      }
      if (!sub) throw std::move(sub).status();
    
      std::cout << "The subscription was successfully created: "
                << sub->DebugString() << "\n";

    C#

    Antes de probar esta muestra, sigue las instrucciones de configuración de C# en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para C#.

    
    using Google.Cloud.PubSub.V1;
    
    public class CreatePushSubscriptionSample
    {
        public Subscription CreatePushSubscription(string projectId, string topicId, string subscriptionId, string pushEndpoint)
        {
            SubscriberServiceApiClient subscriber = SubscriberServiceApiClient.Create();
            TopicName topicName = TopicName.FromProjectTopic(projectId, topicId);
            SubscriptionName subscriptionName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId);
    
            PushConfig pushConfig = new PushConfig { PushEndpoint = pushEndpoint };
    
            // The approximate amount of time in seconds (on a best-effort basis) Pub/Sub waits for the
            // subscriber to acknowledge receipt before resending the message.
            var ackDeadlineSeconds = 60;
            var subscription = subscriber.CreateSubscription(subscriptionName, topicName, pushConfig, ackDeadlineSeconds);
            return subscription;
        }
    }

    Go

    En el siguiente ejemplo, se usa la versión principal de la biblioteca cliente de Pub/Sub de Go (v2). Si aún usas la biblioteca de la versión 1, consulta la guía de migración a la versión 2. Para ver una lista de muestras de código de la versión 1, consulta las muestras de código obsoletas.

    Antes de probar esta muestra, sigue las instrucciones de configuración de Go en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Go.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/pubsub/v2"
    	"cloud.google.com/go/pubsub/v2/apiv1/pubsubpb"
    )
    
    func createWithEndpoint(w io.Writer, projectID, topic, subscription, endpoint string) error {
    	// projectID := "my-project-id"
    	// topic := "projects/my-project-id/topics/my-topic"
    	// subscription := "projects/my-project/subscriptions/my-sub"
    	// endpoint := "https://my-test-project.appspot.com/push"
    	ctx := context.Background()
    	client, err := pubsub.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("pubsub.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	sub, err := client.SubscriptionAdminClient.CreateSubscription(ctx, &pubsubpb.Subscription{
    		Name:               subscription,
    		Topic:              topic,
    		AckDeadlineSeconds: 10,
    		PushConfig:         &pubsubpb.PushConfig{PushEndpoint: endpoint},
    	})
    	if err != nil {
    		return fmt.Errorf("failed to create push sub: %w", err)
    	}
    	fmt.Fprintf(w, "Created push subscription: %v\n", sub)
    	return nil
    }
    

    Java

    Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Java.

    
    import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
    import com.google.pubsub.v1.PushConfig;
    import com.google.pubsub.v1.Subscription;
    import com.google.pubsub.v1.SubscriptionName;
    import com.google.pubsub.v1.TopicName;
    import java.io.IOException;
    
    public class CreatePushSubscriptionExample {
      public static void main(String... args) throws Exception {
        // TODO(developer): Replace these variables before running the sample.
        String projectId = "your-project-id";
        String subscriptionId = "your-subscription-id";
        String topicId = "your-topic-id";
        String pushEndpoint = "https://my-test-project.appspot.com/push";
    
        createPushSubscriptionExample(projectId, subscriptionId, topicId, pushEndpoint);
      }
    
      public static void createPushSubscriptionExample(
          String projectId, String subscriptionId, String topicId, String pushEndpoint)
          throws IOException {
        try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
          TopicName topicName = TopicName.of(projectId, topicId);
          SubscriptionName subscriptionName = SubscriptionName.of(projectId, subscriptionId);
          PushConfig pushConfig = PushConfig.newBuilder().setPushEndpoint(pushEndpoint).build();
    
          // Create a push subscription with default acknowledgement deadline of 10 seconds.
          // Messages not successfully acknowledged within 10 seconds will get resent by the server.
          Subscription subscription =
              subscriptionAdminClient.createSubscription(subscriptionName, topicName, pushConfig, 10);
          System.out.println("Created push subscription: " + subscription.getName());
        }
      }
    }

    Node.js

    Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Node.js.

    /**
     * TODO(developer): Uncomment these variables before running the sample.
     */
    // const pushEndpoint = 'YOUR_ENDPOINT_URL';
    // const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';
    // const subscriptionNameOrId = 'YOUR_SUBSCRIPTION_NAME_OR_ID';
    
    // Imports the Google Cloud client library
    const {PubSub} = require('@google-cloud/pubsub');
    
    // Creates a client; cache this for further use
    const pubSubClient = new PubSub();
    
    async function createPushSubscription(
      pushEndpoint,
      topicNameOrId,
      subscriptionNameOrId,
    ) {
      const options = {
        pushConfig: {
          // Set to an HTTPS endpoint of your choice. If necessary, register
          // (authorize) the domain on which the server is hosted.
          pushEndpoint,
        },
      };
    
      await pubSubClient
        .topic(topicNameOrId)
        .createSubscription(subscriptionNameOrId, options);
      console.log(`Subscription ${subscriptionNameOrId} created.`);
    }

    Node.ts

    Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Node.js.

    /**
     * TODO(developer): Uncomment these variables before running the sample.
     */
    // const pushEndpoint = 'YOUR_ENDPOINT_URL';
    // const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';
    // const subscriptionNameOrId = 'YOUR_SUBSCRIPTION_NAME_OR_ID';
    
    // Imports the Google Cloud client library
    import {PubSub, CreateSubscriptionOptions} from '@google-cloud/pubsub';
    
    // Creates a client; cache this for further use
    const pubSubClient = new PubSub();
    
    async function createPushSubscription(
      pushEndpoint: string,
      topicNameOrId: string,
      subscriptionNameOrId: string,
    ) {
      const options: CreateSubscriptionOptions = {
        pushConfig: {
          // Set to an HTTPS endpoint of your choice. If necessary, register
          // (authorize) the domain on which the server is hosted.
          pushEndpoint,
        },
      };
    
      await pubSubClient
        .topic(topicNameOrId)
        .createSubscription(subscriptionNameOrId, options);
      console.log(`Subscription ${subscriptionNameOrId} created.`);
    }

    PHP

    Antes de probar esta muestra, sigue las instrucciones de configuración de PHP en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para PHP.

    use Google\Cloud\PubSub\PubSubClient;
    
    /**
     * Creates a Pub/Sub push subscription.
     *
     * @param string $projectId  The Google project ID.
     * @param string $topicName  The Pub/Sub topic name.
     * @param string $subscriptionName  The Pub/Sub subscription name.
     * @param string $endpoint  The endpoint for the push subscription.
     */
    function create_push_subscription($projectId, $topicName, $subscriptionName, $endpoint)
    {
        $pubsub = new PubSubClient([
            'projectId' => $projectId,
        ]);
        $topic = $pubsub->topic($topicName);
        $subscription = $topic->subscription($subscriptionName);
        $subscription->create([
            'pushConfig' => ['pushEndpoint' => $endpoint]
        ]);
    
        printf('Subscription created: %s' . PHP_EOL, $subscription->name());
    }

    Python

    Antes de probar esta muestra, sigue las instrucciones de configuración de Python en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Python.

    from google.cloud import pubsub_v1
    
    # TODO(developer)
    # project_id = "your-project-id"
    # topic_id = "your-topic-id"
    # subscription_id = "your-subscription-id"
    # endpoint = "https://my-test-project.appspot.com/push"
    
    publisher = pubsub_v1.PublisherClient()
    subscriber = pubsub_v1.SubscriberClient()
    topic_path = publisher.topic_path(project_id, topic_id)
    subscription_path = subscriber.subscription_path(project_id, subscription_id)
    
    push_config = pubsub_v1.types.PushConfig(push_endpoint=endpoint)
    
    # Wrap the subscriber in a 'with' block to automatically call close() to
    # close the underlying gRPC channel when done.
    with subscriber:
        subscription = subscriber.create_subscription(
            request={
                "name": subscription_path,
                "topic": topic_path,
                "push_config": push_config,
            }
        )
    
    print(f"Push subscription created: {subscription}.")
    print(f"Endpoint for subscription is: {endpoint}")

    Ruby

    En el siguiente ejemplo, se usa la versión 3 de la biblioteca cliente de Pub/Sub de Ruby. Si aún usas la biblioteca de la versión 2, consulta la guía de migración a la versión 3. Para ver una lista de muestras de código de Ruby v2, consulta las muestras de código obsoletas.

    Antes de probar esta muestra, sigue las instrucciones de configuración de Ruby en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Ruby.

    # topic_id          = "your-topic-id"
    # subscription_id   = "your-subscription-id"
    # endpoint          = "https://your-test-project.appspot.com/push"
    
    pubsub = Google::Cloud::PubSub.new
    subscription_admin = pubsub.subscription_admin
    
    subscription = subscription_admin.create_subscription \
      name: pubsub.subscription_path(subscription_id),
      topic: pubsub.topic_path(topic_id),
      push_config: {
        push_endpoint: endpoint
      }
    
    puts "Push subscription #{subscription_id} created."

Supervisa las suscripciones de envío

Cloud Monitoring proporciona varias métricas para supervisar las suscripciones.

Para obtener una lista de todas las métricas disponibles relacionadas con Pub/Sub y sus descripciones, consulta la documentación de supervisión de Pub/Sub.

También puedes supervisar las suscripciones desde Pub/Sub.

¿Qué sigue?