Crie subscrições de notificações push

Este documento descreve como criar uma subscrição push. Pode usar a Trusted Cloud consola, a CLI Google Cloud, a biblioteca cliente ou a API Pub/Sub para criar uma subscrição push.

Antes de começar

Funções e autorizações necessárias

Para criar uma subscrição, tem de configurar o controlo de acesso ao nível do projeto. Também precisa de autorizações ao nível do recurso se as suas subscrições e tópicos estiverem em projetos diferentes, conforme abordado mais adiante nesta secção.

Para receber as autorizações de que precisa para criar subscrições push, peça ao seu administrador para lhe conceder a função IAM Editor do Pub/Sub (roles/pubsub.editor) no projeto. Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Esta função predefinida contém as autorizações necessárias para criar subscrições push. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

São necessárias as seguintes autorizações para criar subscrições push:

  • Crie uma subscrição: pubsub.subscriptions.create
  • Elimine uma subscrição: pubsub.subscriptions.delete
  • Obtenha uma subscrição: pubsub.subscriptions.get
  • Anuncie uma subscrição: pubsub.subscriptions.list
  • Atualize uma subscrição: pubsub.subscriptions.update
  • Anexe uma subscrição a um tópico: pubsub.topics.attachSubscription
  • Obtenha a Política IAM para uma subscrição: pubsub.subscriptions.getIamPolicy
  • Configure a política IAM para uma subscrição: pubsub.subscriptions.setIamPolicy

Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.

Se precisar de criar subscrições push num projeto associadas a um tópico noutro projeto, peça ao administrador do tópico que lhe conceda também a função de IAM (roles/pubsub.editor)editor do Pub/Sub no tópico.

Envie propriedades de subscrição de emissão

Quando configura uma subscrição push, pode especificar as seguintes propriedades.

Propriedades comuns

Saiba mais sobre as propriedades de subscrição comuns que pode definir em todas as subscrições.

Pontos finais

URL do ponto final (obrigatório). Um endereço HTTPS acessível publicamente. O servidor do ponto final de envio por push tem de ter um certificado SSL válido assinado por uma autoridade de certificação. O serviço Pub/Sub envia mensagens para pontos finais push a partir da mesma região em que o serviço Pub/Sub armazena as mensagens. Trusted Cloud O serviço Pub/Sub envia mensagens da mesma Trusted Cloud região com base no melhor esforço.

  • Se os subscritores usarem uma firewall, não podem receber pedidos push. Para receber pedidos push, tem de desativar a firewall e validar o símbolo da Web JSON (JWT) usado no pedido. Se um subscritor tiver uma firewall, pode receber um erro 403 permission denied.

  • O Pub/Sub já não requer prova de propriedade para domínios de URL de subscrição push. Se o seu domínio receber pedidos POST inesperados do Pub/Sub, pode denunciar suspeitas de abuso.

Autenticação

Ative a autenticação. Quando ativada, as mensagens enviadas pelo Pub/Sub para o ponto final de envio push incluem um cabeçalho de autorização para permitir que o ponto final autentique o pedido. Os mecanismos de autenticação e autorização automáticos estão disponíveis para os pontos finais das funções do App Engine Standard e do Cloud Run alojados no mesmo projeto que a subscrição.

A configuração de autenticação para uma subscrição push autenticada consiste numa conta de serviço gerida pelo utilizador e nos parâmetros de público-alvo que são especificados numa chamada create, patch ou ModifyPushConfig. Também tem de conceder uma função específica a uma conta de serviço, conforme abordado na secção seguinte.

  • Público-alvo. Uma única string não sensível a maiúsculas e minúsculas que o webhook usa para validar o público-alvo pretendido deste token específico.

  • Conta de serviço. O Pub/Sub cria automaticamente uma conta de serviço para si no formato service-{PROJECT_NUMBER}@gcp-sa-pubsub.s3ns-system.iam.gserviceaccount.com.

Pré-requisitos para ativar a autenticação

A conta de serviço gerida pelo utilizador é a conta de serviço associada à subscrição push. Esta conta é usada como a reivindicação email do símbolo da Web JSON (JWT) gerado. Segue-se uma lista de requisitos para a conta de serviço:

  • Esta conta de serviço gerida pelo utilizador tem de estar no mesmo projeto que a subscrição push.

  • O principal que está a criar ou modificar a subscrição push tem de ter a autorização iam.serviceAccounts.actAs na conta de serviço gerida pelo utilizador para anexar a conta de serviço à subscrição push. Para mais informações, consulte o artigo Anexar contas de serviço a recursos.

  • Autorizações necessárias: esta conta de serviço tem de ter a autorização iam.serviceAccounts.getOpenIdToken (incluída na função roles/iam.serviceAccountTokenCreator) para permitir que o Pub/Sub crie tokens JWT para a conta de serviço especificada autenticar pedidos push.

Unwrapping do payload

A opção Ativar a anulação da união de payloads remove todos os metadados das mensagens do Pub/Sub, exceto os dados das mensagens. Com a anulação da união do payload, os dados da mensagem são entregues diretamente como o corpo HTTP.

Também pode ativar a opção Escrever metadados. A opção Escrever metadados adiciona novamente os metadados de mensagens removidos anteriormente ao cabeçalho do pedido.

Efetue a entrega em endereços VPC privados

O Pub/Sub funciona fora das redes da VPC e não pode enviar mensagens diretamente para endereços da VPC privados. No entanto, pode usar o Eventarc para encaminhar mensagens para serviços na sua VPC. O Pub/Sub pode enviar mensagens para um acionador do Eventarc, que, por sua vez, pode encaminhá-las para um serviço na sua VPC, como um serviço do Cloud Run ou uma execução do Workflows. Para mais informações, consulte a documentação do Eventarc.

VPC Service Controls

Para um projeto protegido pelos VPC Service Controls, tenha em atenção as seguintes limitações para subscrições push:

  • Só pode criar novas subscrições push para as quais o ponto final push esteja definido para um serviço do Cloud Run com um URL run.app predefinido ou uma execução do Workflows. Os domínios personalizados não funcionam.

  • Quando encaminha eventos através do Eventarc para destinos do Workflows para os quais o ponto final de envio está definido para uma execução do Workflows, só pode criar novas subscrições de envio através do Eventarc.

  • Não pode atualizar as subscrições push existentes. Estas subscrições push continuam a funcionar, embora não estejam protegidas pelo VPC Service Controls.

Crie uma subscrição push

Os exemplos seguintes demonstram como criar uma subscrição com entrega push, usando as predefinições fornecidas.

Por predefinição, as subscrições usam a entrega por obtenção, a menos que defina explicitamente uma configuração de envio, conforme mostrado nos exemplos seguintes.

Consola

Para criar uma subscrição de push, conclua os seguintes passos:

  1. Na Trusted Cloud consola, aceda à página Subscrições.

    Aceder a Subscrições

  2. Clique em Criar subscrição.
  3. No campo ID da subscrição, introduza um nome.

    Para obter informações sobre como atribuir um nome a uma subscrição, consulte as diretrizes para atribuir um nome a um tópico ou a uma subscrição.

  4. Escolha ou crie um tópico no menu pendente. A subscrição recebe mensagens do tópico.
  5. Selecione o Tipo de fornecimento como Push.
  6. Especifique um URL do ponto final.
  7. Mantenha todos os outros valores predefinidos.
  8. Clique em Criar.

Também pode criar uma subscrição na secção Tópicos. Este atalho é útil para associar tópicos a subscrições.

  1. Na Trusted Cloud consola, aceda à página Tópicos.

    Aceda a Tópicos

  2. Clique emjunto ao tópico no qual quer criar uma subscrição.
  3. No menu de contexto, selecione Criar subscrição.
  4. Introduza o ID da subscrição.

    Para obter informações sobre como atribuir um nome a uma subscrição, consulte as diretrizes para atribuir um nome a um tópico ou a uma subscrição.

  5. Selecione o Tipo de fornecimento como Push.
  6. Especifique um URL do ponto final.
  7. Mantenha todos os outros valores predefinidos.
  8. Clique em Criar.

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 criar uma subscrição push, execute o comando gcloud pubsub subscriptions create.

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

    Substitua o seguinte:

    • SUBSCRIPTION_ID: o nome ou o ID da sua nova subscrição push.
    • TOPIC_ID: o nome ou o ID do seu tópico.
    • PUSH_ENDPOINT: o URL a usar como ponto final para esta subscrição. Por exemplo, https://myproject.appspot.com/myhandler.
  3. REST

    Para criar uma subscrição push, use o método projects.subscriptions.create:

    Pedido:

    O pedido tem de ser autenticado com um token de acesso no cabeçalho Authorization. Para obter uma chave de acesso para as Credenciais padrão da aplicação atuais: gcloud auth application-default print-access-token.

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

    Corpo do pedido:

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

    Onde:

  4. PROJECT_ID é o ID do seu projeto.
  5. SUBSCRIPTION_ID é o ID da sua subscrição.
  6. TOPIC_ID é o ID do seu tópico.
  7. PUSH_ENDPOINT é um URL a usar como ponto final. Por exemplo, https://myproject.appspot.com/myhandler.
  8. Resposta:

    {
    "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 experimentar este exemplo, siga as instruções de configuração do C++ no artigo Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API C++ do Pub/Sub.

    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 experimentar este exemplo, siga as instruções de configuração do C# em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API C# do Pub/Sub.

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

    Ir

    O exemplo seguinte usa a versão principal da biblioteca de cliente Go Pub/Sub (v2). Se ainda estiver a usar a biblioteca v1, consulte o guia de migração para a v2. Para ver uma lista de exemplos de código da v1, consulte os exemplos de código descontinuados.

    Antes de experimentar este exemplo, siga as instruções de configuração do Go em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Go do Pub/Sub.

    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 experimentar este exemplo, siga as instruções de configuração do Java no artigo Início rápido: usar bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Java do Pub/Sub.

    
    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 experimentar este exemplo, siga as instruções de configuração do Node.js em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Node.js do Pub/Sub.

    /**
     * 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 experimentar este exemplo, siga as instruções de configuração do Node.js em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Node.js do Pub/Sub.

    /**
     * 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 experimentar este exemplo, siga as instruções de configuração do PHP no artigo Início rápido: usar bibliotecas cliente. Para mais informações, consulte a documentação de referência da API PHP Pub/Sub.

    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 experimentar este exemplo, siga as instruções de configuração do Python em Início rápido: usar bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Python Pub/Sub.

    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

    O exemplo seguinte usa a biblioteca cliente Ruby Pub/Sub v3. Se ainda estiver a usar a biblioteca v2, consulte o guia de migração para a v3. Para ver uma lista de exemplos de código do Ruby v2, consulte os exemplos de código descontinuados.

    Antes de experimentar este exemplo, siga as instruções de configuração do Ruby em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Ruby Pub/Sub.

    # 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."

Monitorize as subscrições de notificações push

O Cloud Monitoring fornece várias métricas para monitorizar subscrições.

Para ver uma lista de todas as métricas disponíveis relacionadas com o Pub/Sub e as respetivas descrições, consulte a documentação de monitorização do Pub/Sub.

Também pode monitorizar as subscrições no Pub/Sub.

O que se segue?