Learn about troubleshooting steps that you might find helpful if you run into problems using Pub/Sub.
Cannot create a topic
Verify that you have the necessary
permissions.
To create a Pub/Sub topic, you need
the Pub/Sub Editor (roles/pubsub.editor) Identity and Access Management
role on the project. If you don't have this role, contact your administrator.
For more troubleshooting information regarding topics, see the following pages:
Cannot create a subscription
Check that you have done the following:
Verify that you have the necessary permissions. To create a Pub/Sub subscription, you need the Pub/Sub Editor (roles/pubsub.editor) IAM role on the project. If you don't have this role, contact your administrator.
Specified a name for the subscription.
Specified the name of an existing topic to which you want to attach the subscription.
If creating a push subscription, specified
https://in lower case (nothttp://orHTTPS://) as the protocol for your receiving URL in thepushEndpointfield.
For more troubleshooting information about subscriptions, see the following pages:
Troubleshooting pull, push, BigQuery, or Cloud Storage
Troubleshooting subscriptions with Single Message Transforms
Troubleshoot permission issues
Pub/Sub permissions control which users and service accounts can perform actions on your Pub/Sub resources. When permissions are misconfigured, it can lead to permission denied errors and disrupt message flow. Audit logs provide a detailed record of all permission changes, allowing you to identify the source of these issues.
To troubleshoot Pub/Sub permission issues with audit logs:
Get the required permissions to view Logs Explorer.
For more information, see Before you begin.
In the Google Cloud console, go to the Logs Explorer page.
Select an existing Google Cloud project, folder, or organization.
Here is a list of filters that you can use to find relevant logs:
resource.type="pubsub_topic" OR resource.type="pubsub_subscription": Use this query as a starting point when you're troubleshooting any issue that might involve changes to topic or subscription configurations, or access control. You can combine it with other filters to further refine your search.protoPayload.methodName="google.iam.v1.SetIamPolicy": Use this query when you suspect that an issue is caused by incorrect or missing permissions. It helps you track who made changes to the IAM policy and what those changes were. This can be useful for troubleshooting issues like users unable to publish to topics or subscribe to subscriptions, applications denied access to Pub/Sub resources, or unexpected changes in access control.protoPayload.status.code=7: Use this query when you encounter errors explicitly related to permissions. This helps you pinpoint which actions are failing and who is attempting them. You can combine this query with the previous ones to identify the specific resource and IAM policy change that might be causing the permission denial.
Analyze the logs to determine factors such as the timestamp of the event, the principal who made the change, and the type of changes that were made.
Based on the information gathered from the audit logs, you can take corrective actions.
Troubleshoot Terraform permission issues
When you use Pub/Sub with Terraform, explicitly grant the required
roles in your Terraform code. For example, for publishing, your
application's service account needs the roles/pubsub.publisher role. If
this role is not explicitly defined in your Terraform code, a future
terraform apply could remove it. This often happens during unrelated updates,
causing a reliable application to suddenly fail with PERMISSION_DENIED errors.
Explicitly defining the role in your code prevents these accidental regressions.
Subscription got deleted
Pub/Sub subscriptions can be deleted in two primary ways:
A user or service account with sufficient permissions intentionally deletes the subscription.
A subscription is automatically deleted after a period of inactivity, which is 31 days by default. For more information about the subscription expiration policy, see Expiration period.
To troubleshoot a deleted subscription, perform the following steps:
In the Google Cloud console, go to the Pub/Sub subscriptions page and verify that the subscription is no longer listed. For more information on how to list subscriptions, see List a subscription.
Check the audit logs. Navigate to Logs Explorer. Use the filter
protoPayload.methodName="google.pubsub.v1.Subscriber.DeleteSubscription"to find deleted subscriptions. Examine the logs to determine if someone deleted the subscription or it was deleted due to inactivity.InternalExpireInactiveSubscriptionindicates a subscription was deleted due to inactivity. For more information on how to use audit logs for troubleshooting, see Troubleshoot Pub/Sub issues with audit logs.
403 (Forbidden) error
A 403 error typically means you don't have the correct permissions to
perform an action. For example, you might get a 403 User not authorized error
when trying to publish to a topic or pull from a subscription.
If you get this error, do the following:
- Make sure you've enabled the Pub/Sub API in the Google Cloud console.
Make sure that the principal making the request has the required permissions on the relevant Pub/Sub API resources, especially if you are using Pub/Sub API for cross-project communication.
If you're using Dataflow, make sure that both
{PROJECT_NUMBER}@cloudservices.gserviceaccount.comand the Compute Engine Service account{PROJECT_NUMBER}-compute@developer.gserviceaccount.comhave the required permissions on the relevant Pub/Sub API resource. For more information, see Dataflow Security and Permissions.If you're using App Engine, check your project's Permissions page to see if an App Engine Service Account is listed as a Pub/Sub Editor. If it is not, add your App Engine Service Account as a Pub/Sub Editor. Normally, the App Engine Service Account is of the form
<project-id>@appspot.gserviceaccount.com.You can use audit logs to troubleshoot permission issues.
Other common error codes
For a list of other common error codes related to the Pub/Sub API and their descriptions, see Error Codes.
Connection timeouts, latency, or network errors
You might experience intermittent or persistent failures when your Pub/Sub client applications attempt to connect to Google Cloud services. These issues can manifest as:
- Significant delays when publishing messages, potentially causing application backlogs.
- Timeout errors, such as gRPC
DEADLINE_EXCEEDED,code = DeadlineExceeded, orjava.net.SocketTimeoutException. - Network I/O failures, such as
UNAVAILABLE: io exception, orConnection refusederrors when trying to reach services likepubsub.googleapis.comoroauth2.googleapis.com.
These connectivity issues can arise even without changes to your Pub/Sub configuration or application code. This frequently occurs when on-premises or VPC firewalls use hardcoded IP address allowlists for Google APIs. Google services, including Pub/Sub and its dependencies like authentication services, use a dynamic range of IP addresses. If your firewall doesn't account for new IP addresses, it can block traffic to the new IP addresses, causing connection and authentication failures.
To ensure stable connectivity, avoid static IP-based firewall rules for Google services. Instead:
- Configure your firewall to allow traffic using Google's published IP ranges for default domains rather than hardcoded addresses. To learn how to obtain these ranges and automate updates to your firewall rules, see IP addresses for default domains.
- Enable Private Google Access, which allows instances within your VPC network to reach Google APIs and services without traversing the public internet, simplifying firewall management.
Invalid JWT: Token must be a short-lived token
If you receive an error like Invalid JWT: Token must be a short-lived token (60
minutes) and in a reasonable timeframe when your application interacts with the
Pub/Sub API, this typically indicates an issue with the timing of
the authentication credentials.
This error occurs during the validation of the JSON Web Token (JWT) used to authenticate API requests. A common cause is a significant time difference (time skew) between the client machine running the Pub/Sub library and Google's authentication servers. Because JWTs have a limited validity window, clock discrepancies can cause them to be treated as expired or not yet valid.
To resolve this issue, synchronize your client machine's clock:
Verify that the date, time, and timezone on your machine are correct.
Use a Network Time Protocol (NTP) service to keep the system time synchronized, and verify that the service is running and configured correctly.
Using excessive administrative operations
If you find that you're using up too much of your
quota for administrative operations,
you might need to refactor your code. As an illustration, consider
this pseudo-code. In this example, an administrative operation (GET)
is being used to check for the presence of a subscription before it
attempts to consume its resources. Both GET and CREATE are administrator operations:
if !GetSubscription my-sub {
CreateSubscription my-sub
}
Consume from subscription my-sub
A more efficient pattern is to try to consume messages from the subscription (assuming that you can be reasonably sure of the subscription's name). In this optimistic approach, you only get or create the subscription if there is an error. Consider this example:
try {
Consume from subscription my-sub
} catch NotFoundError {
CreateSubscription my-sub
Consume from subscription my-sub
}
You can use the following code samples to implement this pattern in the language of your choice:
Go
The following sample uses the major version of the Go Pub/Sub client library (v2). If you are still using the v1 library, see the migration guide to v2. To see a list of v1 code samples, see the deprecated code samples.
Before trying this sample, follow the Go setup instructions in Quickstart: Using Client Libraries. For more information, see the Pub/Sub Go API reference documentation.
Java
Before trying this sample, follow the Java setup instructions in Quickstart: Using Client Libraries. For more information, see the Pub/Sub Java API reference documentation.
Node.js
Before trying this sample, follow the Node.js setup instructions in Quickstart: Using Client Libraries. For more information, see the Pub/Sub Node.js API reference documentation.
Node.ts
Before trying this sample, follow the Node.js setup instructions in Quickstart: Using Client Libraries. For more information, see the Pub/Sub Node.js API reference documentation.
Python
Before trying this sample, follow the Python setup instructions in Quickstart: Using Client Libraries. For more information, see the Pub/Sub Python API reference documentation.
C++
Before trying this sample, follow the C++ setup instructions in Quickstart: Using Client Libraries. For more information, see the Pub/Sub C++ API reference documentation.