TopicArgs

data class TopicArgs(val ingestionDataSourceSettings: Output<TopicIngestionDataSourceSettingsArgs>? = null, val kmsKeyName: Output<String>? = null, val labels: Output<Map<String, String>>? = null, val messageRetentionDuration: Output<String>? = null, val messageStoragePolicy: Output<TopicMessageStoragePolicyArgs>? = null, val name: Output<String>? = null, val project: Output<String>? = null, val schemaSettings: Output<TopicSchemaSettingsArgs>? = null) : ConvertibleToJava<TopicArgs>

A named resource to which messages are sent by publishers. To get more information about Topic, see:

Note: You can retrieve the email of the Google Managed Pub/Sub Service Account used for forwarding by using the gcp.projects.ServiceIdentity resource.

Example Usage

Pubsub Topic Basic

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const example = new gcp.pubsub.Topic("example", {
name: "example-topic",
labels: {
foo: "bar",
},
messageRetentionDuration: "86600s",
});
import pulumi
import pulumi_gcp as gcp
example = gcp.pubsub.Topic("example",
name="example-topic",
labels={
"foo": "bar",
},
message_retention_duration="86600s")
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var example = new Gcp.PubSub.Topic("example", new()
{
Name = "example-topic",
Labels =
{
{ "foo", "bar" },
},
MessageRetentionDuration = "86600s",
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v7/go/gcp/pubsub"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := pubsub.NewTopic(ctx, "example", &pubsub.TopicArgs{
Name: pulumi.String("example-topic"),
Labels: pulumi.StringMap{
"foo": pulumi.String("bar"),
},
MessageRetentionDuration: pulumi.String("86600s"),
})
if err != nil {
return err
}
return nil
})
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.pubsub.Topic;
import com.pulumi.gcp.pubsub.TopicArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var example = new Topic("example", TopicArgs.builder()
.name("example-topic")
.labels(Map.of("foo", "bar"))
.messageRetentionDuration("86600s")
.build());
}
}
resources:
example:
type: gcp:pubsub:Topic
properties:
name: example-topic
labels:
foo: bar
messageRetentionDuration: 86600s

Pubsub Topic Cmek

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const keyRing = new gcp.kms.KeyRing("key_ring", {
name: "example-keyring",
location: "global",
});
const cryptoKey = new gcp.kms.CryptoKey("crypto_key", {
name: "example-key",
keyRing: keyRing.id,
});
const example = new gcp.pubsub.Topic("example", {
name: "example-topic",
kmsKeyName: cryptoKey.id,
});
import pulumi
import pulumi_gcp as gcp
key_ring = gcp.kms.KeyRing("key_ring",
name="example-keyring",
location="global")
crypto_key = gcp.kms.CryptoKey("crypto_key",
name="example-key",
key_ring=key_ring.id)
example = gcp.pubsub.Topic("example",
name="example-topic",
kms_key_name=crypto_key.id)
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var keyRing = new Gcp.Kms.KeyRing("key_ring", new()
{
Name = "example-keyring",
Location = "global",
});
var cryptoKey = new Gcp.Kms.CryptoKey("crypto_key", new()
{
Name = "example-key",
KeyRing = keyRing.Id,
});
var example = new Gcp.PubSub.Topic("example", new()
{
Name = "example-topic",
KmsKeyName = cryptoKey.Id,
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v7/go/gcp/kms"
"github.com/pulumi/pulumi-gcp/sdk/v7/go/gcp/pubsub"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
keyRing, err := kms.NewKeyRing(ctx, "key_ring", &kms.KeyRingArgs{
Name: pulumi.String("example-keyring"),
Location: pulumi.String("global"),
})
if err != nil {
return err
}
cryptoKey, err := kms.NewCryptoKey(ctx, "crypto_key", &kms.CryptoKeyArgs{
Name: pulumi.String("example-key"),
KeyRing: keyRing.ID(),
})
if err != nil {
return err
}
_, err = pubsub.NewTopic(ctx, "example", &pubsub.TopicArgs{
Name: pulumi.String("example-topic"),
KmsKeyName: cryptoKey.ID(),
})
if err != nil {
return err
}
return nil
})
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.kms.KeyRing;
import com.pulumi.gcp.kms.KeyRingArgs;
import com.pulumi.gcp.kms.CryptoKey;
import com.pulumi.gcp.kms.CryptoKeyArgs;
import com.pulumi.gcp.pubsub.Topic;
import com.pulumi.gcp.pubsub.TopicArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var keyRing = new KeyRing("keyRing", KeyRingArgs.builder()
.name("example-keyring")
.location("global")
.build());
var cryptoKey = new CryptoKey("cryptoKey", CryptoKeyArgs.builder()
.name("example-key")
.keyRing(keyRing.id())
.build());
var example = new Topic("example", TopicArgs.builder()
.name("example-topic")
.kmsKeyName(cryptoKey.id())
.build());
}
}
resources:
example:
type: gcp:pubsub:Topic
properties:
name: example-topic
kmsKeyName: ${cryptoKey.id}
cryptoKey:
type: gcp:kms:CryptoKey
name: crypto_key
properties:
name: example-key
keyRing: ${keyRing.id}
keyRing:
type: gcp:kms:KeyRing
name: key_ring
properties:
name: example-keyring
location: global

Pubsub Topic Geo Restricted

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const example = new gcp.pubsub.Topic("example", {
name: "example-topic",
messageStoragePolicy: {
allowedPersistenceRegions: ["europe-west3"],
},
});
import pulumi
import pulumi_gcp as gcp
example = gcp.pubsub.Topic("example",
name="example-topic",
message_storage_policy={
"allowed_persistence_regions": ["europe-west3"],
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var example = new Gcp.PubSub.Topic("example", new()
{
Name = "example-topic",
MessageStoragePolicy = new Gcp.PubSub.Inputs.TopicMessageStoragePolicyArgs
{
AllowedPersistenceRegions = new[]
{
"europe-west3",
},
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v7/go/gcp/pubsub"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := pubsub.NewTopic(ctx, "example", &pubsub.TopicArgs{
Name: pulumi.String("example-topic"),
MessageStoragePolicy: &pubsub.TopicMessageStoragePolicyArgs{
AllowedPersistenceRegions: pulumi.StringArray{
pulumi.String("europe-west3"),
},
},
})
if err != nil {
return err
}
return nil
})
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.pubsub.Topic;
import com.pulumi.gcp.pubsub.TopicArgs;
import com.pulumi.gcp.pubsub.inputs.TopicMessageStoragePolicyArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var example = new Topic("example", TopicArgs.builder()
.name("example-topic")
.messageStoragePolicy(TopicMessageStoragePolicyArgs.builder()
.allowedPersistenceRegions("europe-west3")
.build())
.build());
}
}
resources:
example:
type: gcp:pubsub:Topic
properties:
name: example-topic
messageStoragePolicy:
allowedPersistenceRegions:
- europe-west3

Pubsub Topic Schema Settings

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const example = new gcp.pubsub.Schema("example", {
name: "example",
type: "AVRO",
definition: `{
"type" : "record",
"name" : "Avro",
"fields" : [
{
"name" : "StringField",
"type" : "string"
},
{
"name" : "IntField",
"type" : "int"
}
]
}
`,
});
const exampleTopic = new gcp.pubsub.Topic("example", {
name: "example-topic",
schemaSettings: {
schema: "projects/my-project-name/schemas/example",
encoding: "JSON",
},
}, {
dependsOn: [example],
});
import pulumi
import pulumi_gcp as gcp
example = gcp.pubsub.Schema("example",
name="example",
type="AVRO",
definition="""{
"type" : "record",
"name" : "Avro",
"fields" : [
{
"name" : "StringField",
"type" : "string"
},
{
"name" : "IntField",
"type" : "int"
}
]
}
""")
example_topic = gcp.pubsub.Topic("example",
name="example-topic",
schema_settings={
"schema": "projects/my-project-name/schemas/example",
"encoding": "JSON",
},
opts = pulumi.ResourceOptions(depends_on=[example]))
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var example = new Gcp.PubSub.Schema("example", new()
{
Name = "example",
Type = "AVRO",
Definition = @"{
""type"" : ""record"",
""name"" : ""Avro"",
""fields"" : [
{
""name"" : ""StringField"",
""type"" : ""string""
},
{
""name"" : ""IntField"",
""type"" : ""int""
}
]
}
",
});
var exampleTopic = new Gcp.PubSub.Topic("example", new()
{
Name = "example-topic",
SchemaSettings = new Gcp.PubSub.Inputs.TopicSchemaSettingsArgs
{
Schema = "projects/my-project-name/schemas/example",
Encoding = "JSON",
},
}, new CustomResourceOptions
{
DependsOn =
{
example,
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v7/go/gcp/pubsub"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
example, err := pubsub.NewSchema(ctx, "example", &pubsub.SchemaArgs{
Name: pulumi.String("example"),
Type: pulumi.String("AVRO"),
Definition: pulumi.String(`{
"type" : "record",
"name" : "Avro",
"fields" : [
{
"name" : "StringField",
"type" : "string"
},
{
"name" : "IntField",
"type" : "int"
}
]
}
`),
})
if err != nil {
return err
}
_, err = pubsub.NewTopic(ctx, "example", &pubsub.TopicArgs{
Name: pulumi.String("example-topic"),
SchemaSettings: &pubsub.TopicSchemaSettingsArgs{
Schema: pulumi.String("projects/my-project-name/schemas/example"),
Encoding: pulumi.String("JSON"),
},
}, pulumi.DependsOn([]pulumi.Resource{
example,
}))
if err != nil {
return err
}
return nil
})
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.pubsub.Schema;
import com.pulumi.gcp.pubsub.SchemaArgs;
import com.pulumi.gcp.pubsub.Topic;
import com.pulumi.gcp.pubsub.TopicArgs;
import com.pulumi.gcp.pubsub.inputs.TopicSchemaSettingsArgs;
import com.pulumi.resources.CustomResourceOptions;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var example = new Schema("example", SchemaArgs.builder()
.name("example")
.type("AVRO")
.definition("""
{
"type" : "record",
"name" : "Avro",
"fields" : [
{
"name" : "StringField",
"type" : "string"
},
{
"name" : "IntField",
"type" : "int"
}
]
}
""")
.build());
var exampleTopic = new Topic("exampleTopic", TopicArgs.builder()
.name("example-topic")
.schemaSettings(TopicSchemaSettingsArgs.builder()
.schema("projects/my-project-name/schemas/example")
.encoding("JSON")
.build())
.build(), CustomResourceOptions.builder()
.dependsOn(example)
.build());
}
}
resources:
example:
type: gcp:pubsub:Schema
properties:
name: example
type: AVRO
definition: |
{
"type" : "record",
"name" : "Avro",
"fields" : [
{
"name" : "StringField",
"type" : "string"
},
{
"name" : "IntField",
"type" : "int"
}
]
}
exampleTopic:
type: gcp:pubsub:Topic
name: example
properties:
name: example-topic
schemaSettings:
schema: projects/my-project-name/schemas/example
encoding: JSON
options:
dependson:
- ${example}

Pubsub Topic Ingestion Kinesis

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const example = new gcp.pubsub.Topic("example", {
name: "example-topic",
ingestionDataSourceSettings: {
awsKinesis: {
streamArn: "arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name",
consumerArn: "arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name/consumer/consumer-1:1111111111",
awsRoleArn: "arn:aws:iam::111111111111:role/fake-role-name",
gcpServiceAccount: "fake-service-account@fake-gcp-project.iam.gserviceaccount.com",
},
},
});
import pulumi
import pulumi_gcp as gcp
example = gcp.pubsub.Topic("example",
name="example-topic",
ingestion_data_source_settings={
"aws_kinesis": {
"stream_arn": "arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name",
"consumer_arn": "arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name/consumer/consumer-1:1111111111",
"aws_role_arn": "arn:aws:iam::111111111111:role/fake-role-name",
"gcp_service_account": "fake-service-account@fake-gcp-project.iam.gserviceaccount.com",
},
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var example = new Gcp.PubSub.Topic("example", new()
{
Name = "example-topic",
IngestionDataSourceSettings = new Gcp.PubSub.Inputs.TopicIngestionDataSourceSettingsArgs
{
AwsKinesis = new Gcp.PubSub.Inputs.TopicIngestionDataSourceSettingsAwsKinesisArgs
{
StreamArn = "arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name",
ConsumerArn = "arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name/consumer/consumer-1:1111111111",
AwsRoleArn = "arn:aws:iam::111111111111:role/fake-role-name",
GcpServiceAccount = "fake-service-account@fake-gcp-project.iam.gserviceaccount.com",
},
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v7/go/gcp/pubsub"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := pubsub.NewTopic(ctx, "example", &pubsub.TopicArgs{
Name: pulumi.String("example-topic"),
IngestionDataSourceSettings: &pubsub.TopicIngestionDataSourceSettingsArgs{
AwsKinesis: &pubsub.TopicIngestionDataSourceSettingsAwsKinesisArgs{
StreamArn: pulumi.String("arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name"),
ConsumerArn: pulumi.String("arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name/consumer/consumer-1:1111111111"),
AwsRoleArn: pulumi.String("arn:aws:iam::111111111111:role/fake-role-name"),
GcpServiceAccount: pulumi.String("fake-service-account@fake-gcp-project.iam.gserviceaccount.com"),
},
},
})
if err != nil {
return err
}
return nil
})
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.pubsub.Topic;
import com.pulumi.gcp.pubsub.TopicArgs;
import com.pulumi.gcp.pubsub.inputs.TopicIngestionDataSourceSettingsArgs;
import com.pulumi.gcp.pubsub.inputs.TopicIngestionDataSourceSettingsAwsKinesisArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var example = new Topic("example", TopicArgs.builder()
.name("example-topic")
.ingestionDataSourceSettings(TopicIngestionDataSourceSettingsArgs.builder()
.awsKinesis(TopicIngestionDataSourceSettingsAwsKinesisArgs.builder()
.streamArn("arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name")
.consumerArn("arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name/consumer/consumer-1:1111111111")
.awsRoleArn("arn:aws:iam::111111111111:role/fake-role-name")
.gcpServiceAccount("fake-service-account@fake-gcp-project.iam.gserviceaccount.com")
.build())
.build())
.build());
}
}
resources:
example:
type: gcp:pubsub:Topic
properties:
name: example-topic
ingestionDataSourceSettings:
awsKinesis:
streamArn: arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name
consumerArn: arn:aws:kinesis:us-west-2:111111111111:stream/fake-stream-name/consumer/consumer-1:1111111111
awsRoleArn: arn:aws:iam::111111111111:role/fake-role-name
gcpServiceAccount: fake-service-account@fake-gcp-project.iam.gserviceaccount.com

Import

Topic can be imported using any of these accepted formats:

  • projects/{{project}}/topics/{{name}}

  • {{project}}/{{name}}

  • {{name}} When using the pulumi import command, Topic can be imported using one of the formats above. For example:

$ pulumi import gcp:pubsub/topic:Topic default projects/{{project}}/topics/{{name}}
$ pulumi import gcp:pubsub/topic:Topic default {{project}}/{{name}}
$ pulumi import gcp:pubsub/topic:Topic default {{name}}

Constructors

Link copied to clipboard
constructor(ingestionDataSourceSettings: Output<TopicIngestionDataSourceSettingsArgs>? = null, kmsKeyName: Output<String>? = null, labels: Output<Map<String, String>>? = null, messageRetentionDuration: Output<String>? = null, messageStoragePolicy: Output<TopicMessageStoragePolicyArgs>? = null, name: Output<String>? = null, project: Output<String>? = null, schemaSettings: Output<TopicSchemaSettingsArgs>? = null)

Properties

Link copied to clipboard

Settings for ingestion from a data source into this topic. Structure is documented below.

Link copied to clipboard
val kmsKeyName: Output<String>? = null

The resource name of the Cloud KMS CryptoKey to be used to protect access to messages published on this topic. Your project's PubSub service account (service-{{PROJECT_NUMBER}}@gcp-sa-pubsub.iam.gserviceaccount.com) must have roles/cloudkms.cryptoKeyEncrypterDecrypter to use this feature. The expected format is projects/*/locations/*/keyRings/*/cryptoKeys/*

Link copied to clipboard
val labels: Output<Map<String, String>>? = null

A set of key/value label pairs to assign to this Topic. Note: This field is non-authoritative, and will only manage the labels present in your configuration. Please refer to the field effective_labels for all of the labels present on the resource.

Link copied to clipboard
val messageRetentionDuration: Output<String>? = null

Indicates the minimum duration to retain a message after it is published to the topic. If this field is set, messages published to the topic in the last messageRetentionDuration are always available to subscribers. For instance, it allows any attached subscription to seek to a timestamp that is up to messageRetentionDuration in the past. If this field is not set, message retention is controlled by settings on individual subscriptions. The rotation period has the format of a decimal number, followed by the letter s (seconds). Cannot be more than 31 days or less than 10 minutes.

Link copied to clipboard

Policy constraining the set of Google Cloud Platform regions where messages published to the topic may be stored. If not present, then no constraints are in effect. Structure is documented below.

Link copied to clipboard
val name: Output<String>? = null

Name of the topic.

Link copied to clipboard
val project: Output<String>? = null

The ID of the project in which the resource belongs. If it is not provided, the provider project is used.

Link copied to clipboard

Settings for validating messages published against a schema. Structure is documented below. ////

Functions

Link copied to clipboard
open override fun toJava(): TopicArgs