Crear un esquema para un tema

En este documento se explica cómo crear esquemas para temas de Pub/Sub.

Antes de empezar

Antes de crear un esquema, haz lo siguiente:

Roles y permisos necesarios

Para obtener los permisos que necesitas para crear y gestionar esquemas, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Editor de Pub/Sub (roles/pubsub.editor) en tu proyecto. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para crear y gestionar esquemas. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para crear y gestionar esquemas, se necesitan los siguientes permisos:

  • Crear esquema: pubsub.schemas.create
  • Adjuntar un esquema a un tema: pubsub.schemas.attach
  • Confirmar una revisión del esquema: pubsub.schemas.commit
  • Eliminar un esquema o una revisión de un esquema: pubsub.schemas.delete
  • Obtener un esquema o revisiones de un esquema: pubsub.schemas.get
  • Ver esquemas: pubsub.schemas.list
  • Lista de revisiones del esquema: pubsub.schemas.listRevisions
  • Restaurar un esquema: pubsub.schemas.rollback
  • Validar un mensaje: pubsub.schemas.validate
  • Obtener la política de gestión de identidades y accesos de un esquema: pubsub.schemas.getIamPolicy
  • Configura la política de gestión de identidades y accesos de un esquema: pubsub.schemas.setIamPolicy

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

Puedes conceder roles y permisos a entidades principales, como usuarios, grupos, dominios o cuentas de servicio. Puedes crear un esquema en un proyecto y adjuntarlo a un tema ubicado en otro proyecto. Asegúrate de que tienes los permisos necesarios para cada proyecto.

Crear un esquema

Puedes crear un esquema con la Google Cloud consola, la CLI de gcloud, la API de Pub/Sub o las bibliotecas de cliente de Cloud.

Antes de crear un esquema, consulta esta información importante sobre los esquemas.

Consola

Para crear un esquema, sigue estos pasos:

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

    Ir a Esquemas

  2. Haz clic en Crear esquema.

  3. En el campo ID de esquema, introduce un ID para tu esquema.

    Para consultar las directrices sobre cómo asignar un nombre a un esquema, consulta Directrices para asignar un nombre a un tema, una suscripción o una captura.

  4. En Tipo de esquema, seleccione Avro o Búfer de protocolo.

    Más información sobre los tipos de esquema

  5. En el campo Schema definition (Definición de esquema), introduce la definición de Avro o Protocol Buffer de tu esquema.

    Por ejemplo, aquí se muestra un esquema de ejemplo en Avro.

    {
      "type": "record",
      "name": "Avro",
      "fields": [
        {
          "name": "ProductName",
          "type": "string",
          "default": ""
        },
        {
          "name": "SKU",
          "type": "int",
          "default": 0
        },
        {
          "name": "InStock",
          "type": "boolean",
          "default": false
        }
      ]
    }
    
    
  6. Opcional: Haz clic en Validar definición para comprobar si la definición del esquema es correcta.

    La comprobación de validación no comprueba la compatibilidad del esquema con los mensajes que se van a publicar. Prueba los mensajes en el siguiente paso.

  7. Opcional: Puedes probar si se publican los mensajes con el esquema correcto.

    1. Haz clic en Mensaje de prueba.

    2. En la ventana Mensaje de prueba, selecciona un tipo de Codificación de mensaje.

    3. En Cuerpo del mensaje, escribe un mensaje de prueba.

    4. Haz clic en Test (Probar).

      Por ejemplo, aquí tienes un mensaje de muestra para el esquema de prueba. En este ejemplo, selecciona Codificación de mensajes como JSON.

      {"ProductName":"GreenOnions", "SKU":34543, "InStock":true}
      
    5. Sal de la página del mensaje de prueba.

  8. Haz clic en Crear para guardar el esquema.

gcloud

gcloud pubsub schemas create SCHEMA_ID \
        --type=SCHEMA_TYPE \
        --definition=SCHEMA_DEFINITION

Donde:

  • SCHEMA_TYPE puede ser avro o protocol-buffer.
  • SCHEMA_DEFINITION es un string que contiene la definición del esquema, con el formato del tipo de esquema elegido.

También puede especificar la definición del esquema en un archivo:

gcloud pubsub schemas create SCHEMA_ID \
        --type=SCHEMA_TYPE \
        --definition-file=SCHEMA_DEFINITION_FILE

Donde:

  • SCHEMA_TYPE puede ser avro o protocol-buffer.
  • SCHEMA_DEFINITION_FILE es un string que contiene la ruta al archivo con la definición del esquema, con el formato correspondiente al tipo de esquema elegido.

REST

Para crear un esquema, envía una solicitud POST como la siguiente:

POST https://pubsub.googleapis.com/v1/projects/PROJECT_ID/schemas?schemaId=SCHEMA_ID
Authorization: Bearer $(gcloud auth application-default print-access-token)
Content-Type: application/json --data @response-body.json

Especifica los siguientes campos en el cuerpo de la solicitud:

{
  "definition": SCHEMA_DEFINITION
  "type": SCHEMA_TYPE
}

Donde:

  • SCHEMA_TYPE puede ser avro o protocol-buffer.
  • SCHEMA_DEFINITION es una cadena que contiene la definición del esquema, con el formato del tipo de esquema elegido.

El cuerpo de la respuesta debe contener una representación JSON de un recurso de esquema. Por ejemplo:

{
  "name": SCHEMA_NAME,
  "type": SCHEMA_TYPE,
  "definition": SCHEMA_DEFINITION
  "revisionId": REVISION_ID
  "revisionCreateTime": REVISION_CREATE_TIME
}

Donde:

  • REVISION_ID es el ID generado por el servidor de la revisión.
  • REVISION_CREATE_TIME es la marca de tiempo ISO 8601 en la que se creó la revisión.

C++

Antes de probar este ejemplo, sigue las instrucciones de configuración de C++ que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de C++ de Pub/Sub.

Avro

namespace pubsub = ::google::cloud::pubsub;
[](pubsub::SchemaServiceClient client, std::string const& project_id,
   std::string const& schema_id, std::string const& schema_definition_file) {
  std::string const definition = ReadFile(schema_definition_file);

  google::pubsub::v1::CreateSchemaRequest request;
  request.set_parent(google::cloud::Project(project_id).FullName());
  request.set_schema_id(schema_id);
  request.mutable_schema()->set_type(google::pubsub::v1::Schema::AVRO);
  request.mutable_schema()->set_definition(definition);
  auto schema = client.CreateSchema(request);
  if (schema.status().code() == google::cloud::StatusCode::kAlreadyExists) {
    std::cout << "The schema already exists\n";
    return;
  }
  if (!schema) throw std::move(schema).status();

  std::cout << "Schema successfully created: " << schema->DebugString()
            << "\n";
}

Proto

namespace pubsub = ::google::cloud::pubsub;
[](pubsub::SchemaServiceClient client, std::string const& project_id,
   std::string const& schema_id, std::string const& schema_definition_file) {
  std::string const definition = ReadFile(schema_definition_file);

  google::pubsub::v1::CreateSchemaRequest request;
  request.set_parent(google::cloud::Project(project_id).FullName());
  request.set_schema_id(schema_id);
  request.mutable_schema()->set_type(
      google::pubsub::v1::Schema::PROTOCOL_BUFFER);
  request.mutable_schema()->set_definition(definition);
  auto schema = client.CreateSchema(request);
  if (schema.status().code() == google::cloud::StatusCode::kAlreadyExists) {
    std::cout << "The schema already exists\n";
    return;
  }
  if (!schema) throw std::move(schema).status();
  std::cout << "Schema successfully created: " << schema->DebugString()
            << "\n";
}

C#

Antes de probar este ejemplo, sigue las instrucciones de configuración de C# que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de C# de Pub/Sub.

Avro


using Google.Api.Gax.ResourceNames;
using Google.Cloud.PubSub.V1;
using Grpc.Core;
using System;
using System.IO;

public class CreateAvroSchemaSample
{
    public Schema CreateAvroSchema(string projectId, string schemaId, string pathToDefinition)
    {
        SchemaServiceClient schemaService = SchemaServiceClient.Create();
        var schemaName = SchemaName.FromProjectSchema(projectId, schemaId);
        string schemaDefinition = File.ReadAllText(pathToDefinition);
        Schema schema = new Schema
        {
            SchemaName = schemaName,
            Type = Schema.Types.Type.Avro,
            Definition = schemaDefinition
        };