Cómo crear un tema

Dentro de Pub/Sub, un tema es un recurso con nombre que representa un feed de mensajes. Debes crear un tema antes de poder publicarlo o suscribirte a él. Pub/Sub admite dos tipos de temas: uno estándar y uno de importación.

En este documento, se describe cómo crear un tema estándar de Pub/Sub. Si quieres obtener más información sobre un tema de importación y cómo crear uno, consulta Crea un tema de importación.

Para crear un tema, puedes usar la consola de Google Cloud, Google Cloud CLI, la biblioteca cliente o la API de Pub/Sub.

Antes de comenzar

Roles y permisos obligatorios para administrar temas

A fin de obtener los permisos que necesitas para crear y administrar temas, pídele a tu administrador que te otorgue el rol de IAM de Editor de Pub/Sub(roles/pubsub.editor) en tu tema o proyecto. Para obtener más información sobre cómo otorgar roles, consulta Cómo administrar el acceso.

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

Permisos necesarios

Se requieren los siguientes permisos para crear y administrar temas:

  • Crea un tema: pubsub.topics.create
  • Borrar un tema: pubsub.topics.delete
  • Desconecta una suscripción de un tema: pubsub.topics.detachSubscription
  • Obtener un tema: pubsub.topics.get
  • Obtén una lista de un tema: pubsub.topics.list
  • Publicar en un tema: pubsub.topics.publish
  • Actualiza un tema: pubsub.topics.update
  • Obtén la política de IAM para un tema: pubsub.topics.getIamPolicy
  • Configura la política de IAM para un tema: pubsub.topics.setIamPolicy

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

Puedes configurar el control de acceso a nivel de proyecto y a nivel de recursos individuales. Puedes crear una suscripción en un proyecto y adjuntarla a un tema ubicado en un proyecto diferente. Asegúrate de tener los permisos necesarios para cada proyecto.

Propiedades de un tema

Cuando creas o actualizas un tema, debes especificar sus propiedades.

  • Agrega una suscripción predeterminada. Agrega una suscripción predeterminada al tema de Pub/Sub. Puedes crear otra suscripción para el tema después de crearlo. La suscripción predeterminada tiene las siguientes propiedades:

    • ID de suscripción de -sub
    • Tipo de entrega de extracción
    • Período de retención de mensajes de siete días
    • Vencimiento después de 31 días de inactividad
    • El plazo límite de confirmación de recepción es de 10 segundos
    • Política de reintento inmediato
  • Esquema. Un esquema es un formato que debe seguir el campo de datos del mensaje. Un esquema es un contrato entre el publicador y el suscriptor que Pub/Sub aplica de manera forzosa. Los esquemas de temas ayudan a estandarizar los tipos de mensajes y los permisos para permitir que los diferentes equipos de tu organización los consuman. Pub/Sub crea una autoridad central para los tipos de mensajes y permisos. Para crear un tema con un esquema, consulta Descripción general del esquema.
  • Habilita la transferencia. Habilitar esta propiedad te permite transferir datos de transmisión de fuentes externas a un tema para que puedas aprovechar las funciones de Google Cloud. Si quieres crear un tema de importación para transferencia, consulta Crea un tema de importación.

  • Duración de la retención de mensajes. Especifica por cuánto tiempo el tema de Pub/Sub retiene mensajes después de la publicación. Una vez que finalice el período de retención de mensajes, es posible que Pub/Sub descarte el mensaje sin importar su estado de confirmación. Se cobran tarifas de almacenamiento de mensajes por almacenar todos los mensajes publicados en el tema.

    • Configuración predeterminada = No habilitada
    • Valor mínimo = 10 minutos
    • Valor máximo = 31 días
  • Usa una clave de encriptación administrada por el cliente (CMEK). Especifica si el tema está encriptado con una CMEK. Pub/Sub encripta los mensajes con claves administradas por Google y de Google de forma predeterminada. Si especificas esta opción, Pub/Sub usará el patrón de encriptación de sobre con CMEK. Con este enfoque, Cloud KMS no encripta los mensajes. En cambio, Cloud KMS encripta las claves de encriptación de datos (DEK) que Pub/Sub crea para cada tema. Pub/Sub encripta los mensajes con la DEK más reciente que se generó para el tema. Pub/Sub desencripta los mensajes poco antes de entregarlos a los suscriptores. Para obtener más información sobre cómo crear una clave, consulta Configura la encriptación de mensajes.

Crea un tema

Crea un tema antes de publicarlo o suscribirte a él.

Console

Para crear un tema, sigue estos pasos:

  1. En la consola de Google Cloud, ve a la página Temas de Pub/Sub.

    Ir a temas

  2. Haga clic en Crear tema.

  3. En el campo ID de tema, ingresa un ID para tu tema. Para obtener más información sobre la asignación de nombres de temas, consulta los lineamientos para asignar nombres.

  4. Mantén la opción Agregar una suscripción predeterminada.

  5. No selecciones las otras opciones.

  6. Haz clic en Crear tema.

gcloud

  1. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de la consola de Google Cloud, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

  2. Para crear un tema, ejecuta el comando gcloud pubsub topics create:

    gcloud pubsub topics create TOPIC_ID

REST

Para crear un tema, usa el método projects.topics.create:

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 el siguiente comando: gcloud auth application-default print-access-token.

PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
Authorization: Bearer ACCESS_TOKEN
    

Aquí:

  • PROJECT_ID es el ID del proyecto.
  • TOPIC_ID es el ID del tema.
  • Respuesta:

    {
     "name": "projects/PROJECT_ID/topics/TOPIC_ID"
    }
    

    C++

    Antes de probar esta muestra, sigue las instrucciones de configuración de C++ en la guía de inicio rápido de Pub/Sub 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++.

    Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

    namespace pubsub = ::google::cloud::pubsub;
    namespace pubsub_admin = ::google::cloud::pubsub_admin;
    [](pubsub_admin::TopicAdminClient client, std::string project_id,
       std::string topic_id) {
      auto topic = client.CreateTopic(
          pubsub::Topic(std::move(project_id), std::move(topic_id)).FullName());
      // Note that kAlreadyExists is a possible error when the library retries.
      if (topic.status().code() == google::cloud::StatusCode::kAlreadyExists) {
        std::cout << "The topic already exists\n";
        return;
      }
      if (!topic) throw std::move(topic).status();
    
      std::cout << "The topic was successfully created: " << topic->DebugString()
                << "\n";
    }

    C#

    Antes de probar esta muestra, sigue las instrucciones de configuración de C# en la guía de inicio rápido de Pub/Sub 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#.

    Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

    
    using Google.Cloud.PubSub.V1;
    using Grpc.Core;
    using System;
    
    public class CreateTopicSample
    {
        public Topic CreateTopic(string projectId, string topicId)
        {
            PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
            var topicName = TopicName.FromProjectTopic(projectId, topicId);
            Topic topic = null;
    
            try
            {
                topic = publisher.CreateTopic(topicName);
                Console.WriteLine($"Topic {topic.Name} created.");
            }
            catch (RpcException e) when (e.Status.StatusCode == StatusCode.AlreadyExists)
            {
                Console.WriteLine($"Topic {topicName} already exists.");
            }
            return topic;
        }
    }

    Go

    Antes de probar esta muestra, sigue las instrucciones de configuración de Go en la guía de inicio rápido de Pub/Sub 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.

    Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/pubsub"
    )
    
    func create(w io.Writer, projectID, topicID string) error {
    	// projectID := "my-project-id"
    	// topicID := "my-topic"
    	ctx := context.Background()
    	client, err := pubsub.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("pubsub.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	t, err := client.CreateTopic(ctx, topicID)
    	if err != nil {
    		return fmt.Errorf("CreateTopic: %w", err)
    	}
    	fmt.Fprintf(w, "Topic created: %v\n", t)
    	return nil
    }
    

    Java

    Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la guía de inicio rápido de Pub/Sub 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.

    Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

    
    import com.google.cloud.pubsub.v1.TopicAdminClient;
    import com.google.pubsub.v1.Topic;
    import com.google.pubsub.v1.TopicName;
    import java.io.IOException;
    
    public class CreateTopicExample {
      public static void main(String... args) throws Exception {
        // TODO(developer): Replace these variables before running the sample.
        String projectId = "your-project-id";
        String topicId = "your-topic-id";
    
        createTopicExample(projectId, topicId);
      }
    
      public static void createTopicExample(String projectId, String topicId) throws IOException {
        try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
          TopicName topicName = TopicName.of(projectId, topicId);
          Topic topic = topicAdminClient.createTopic(topicName);
          System.out.println("Created topic: " + topic.getName());
        }
      }
    }

    Node.js

    /**
     * TODO(developer): Uncomment this variable before running the sample.
     */
    // const topicNameOrId = 'YOUR_TOPIC_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 createTopic(topicNameOrId) {
      // Creates a new topic
      await pubSubClient.createTopic(topicNameOrId);
      console.log(`Topic ${topicNameOrId} created.`);
    }

    Node.js

    /**
     * TODO(developer): Uncomment this variable before running the sample.
     */
    // const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';
    
    // Imports the Google Cloud client library
    import {PubSub} from '@google-cloud/pubsub';
    
    // Creates a client; cache this for further use
    const pubSubClient = new PubSub();
    
    async function createTopic(topicNameOrId: string) {
      // Creates a new topic
      await pubSubClient.createTopic(topicNameOrId);
      console.log(`Topic ${topicNameOrId} created.`);
    }

    PHP

    Antes de probar esta muestra, sigue las instrucciones de configuración de PHP en la guía de inicio rápido de Pub/Sub 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.

    Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

    use Google\Cloud\PubSub\PubSubClient;
    
    /**
     * Creates a Pub/Sub topic.
     *
     * @param string $projectId  The Google project ID.
     * @param string $topicName  The Pub/Sub topic name.
     */
    function create_topic($projectId, $topicName)
    {
        $pubsub = new PubSubClient([
            'projectId' => $projectId,
        ]);
        $topic = $pubsub->createTopic($topicName);
    
        printf('Topic created: %s' . PHP_EOL, $topic->name());
    }

    Python

    Antes de probar esta muestra, sigue las instrucciones de configuración de Python en la guía de inicio rápido de Pub/Sub 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.

    Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

    from google.cloud import pubsub_v1
    
    # TODO(developer)
    # project_id = "your-project-id"
    # topic_id = "your-topic-id"
    
    publisher = pubsub_v1.PublisherClient()
    topic_path = publisher.topic_path(project_id, topic_id)
    
    topic = publisher.create_topic(request={"name": topic_path})
    
    print(f"Created topic: {topic.name}")

    Ruby

    Antes de probar esta muestra, sigue las instrucciones de configuración de Ruby en la guía de inicio rápido de Pub/Sub 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.

    Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

    # topic_id = "your-topic-id"
    
    pubsub = Google::Cloud::Pubsub.new
    
    topic = pubsub.create_topic topic_id
    
    puts "Topic #{topic.name} created."

    Restricciones de las políticas de la organización

    Las políticas de la organización pueden restringir la creación de temas, por ejemplo, una política puede restringir el almacenamiento de mensajes en una región de Compute Engine. Para evitar errores en la creación de temas, examina y actualiza las políticas de la organización, según sea necesario, antes de crear un tema.

    Si tu proyecto se creó hace poco tiempo, espera unos minutos a que se inicialice la política de la organización antes de crear un tema.

    Ir a Políticas de la organización

    Para obtener más información, consulta Configura políticas de almacenamiento de mensajes.

    ¿Qué sigue?