gocloud.dev: gocloud.dev/pubsub/awssnssqs Index | Examples | Files

package awssnssqs

import "gocloud.dev/pubsub/awssnssqs"

Package awssnssqs provides two implementations of pubsub.Topic, one that sends messages to AWS SNS (Simple Notification Service), and one that sends messages to SQS (Simple Queuing Service). It also provides an implementation of pubsub.Subscription that receives messages from SQS.

URLs

For pubsub.OpenTopic, awssnssqs registers for the scheme "awssns" for an SNS topic, and "awssqs" for an SQS topic. For pubsub.OpenSubscription, it registers for the scheme "awssqs".

The default URL opener will use an AWS session with the default credentials and configuration; see https://docs.aws.amazon.com/sdk-for-go/api/aws/session/ for more details. To customize the URL opener, or for more details on the URL format, see URLOpener. See https://gocloud.dev/concepts/urls/ for background information.

Message Delivery Semantics

AWS SQS supports at-least-once semantics; applications must call Message.Ack after processing a message, or it will be redelivered. See https://godoc.org/gocloud.dev/pubsub#hdr-At_most_once_and_At_least_once_Delivery for more background.

Escaping

Go CDK supports all UTF-8 strings; to make this work with services lacking full UTF-8 support, strings must be escaped (during writes) and unescaped (during reads). The following escapes are required for awssnssqs:

- Metadata keys: Characters other than "a-zA-z0-9_-.", and additionally "."
  when it's at the start of the key or the previous character was ".",
  are escaped using "__0x<hex>__". These characters were determined by
  experimentation.
- Metadata values: Escaped using URL encoding.
- Message body: AWS SNS/SQS only supports UTF-8 strings. See the
  BodyBase64Encoding enum in TopicOptions for strategies on how to send
  non-UTF-8 message bodies. By default, non-UTF-8 message bodies are base64
  encoded.

As

awssnssqs exposes the following types for As:

- Topic: *sns.SNS for OpenSNSTopic; *sqs.SQS for OpenSQSTopic
- Subscription: *sqs.SQS
- Message: *sqs.Message
- Message.BeforeSend: *sns.PublishInput for OpenSNSTopic; *sqs.SendMessageBatchRequestEntry or *sqs.SendMessageInput(deprecated) for OpenSQSTopic
- Error: awserror.Error

Code:

// PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored.
// PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/awssnssqs"
// PRAGMA: On gocloud.dev, hide lines until the next blank line.
ctx := context.Background()

const topicARN = "arn:aws:sns:us-east-2:123456789012:mytopic"
// Note the 3 slashes; ARNs have multiple colons and therefore aren't valid
// as hostnames in the URL.
topic, err := pubsub.OpenTopic(ctx, "awssns:///"+topicARN+"?region=us-east-2")
if err != nil {
    log.Fatal(err)
}
defer topic.Shutdown(ctx)

Code:

// PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored.
// PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/awssnssqs"
// PRAGMA: On gocloud.dev, hide lines until the next blank line.
ctx := context.Background()

// https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/QueueURL.html
const queueURL = "https://sqs.us-east-2.amazonaws.com/123456789012/myqueue"
topic, err := pubsub.OpenTopic(ctx, "awssqs://"+queueURL+"?region=us-east-2")
if err != nil {
    log.Fatal(err)
}
defer topic.Shutdown(ctx)

Code:

// PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored.
// PRAGMA: On gocloud.dev, add a blank import: _ "gocloud.dev/pubsub/awssnssqs"
// PRAGMA: On gocloud.dev, hide lines until the next blank line.
ctx := context.Background()

// pubsub.OpenSubscription creates a *pubsub.Subscription from a URL.
// This URL will open the subscription with the URL
// "https://sqs.us-east-2.amazonaws.com/123456789012/myqueue".
subscription, err := pubsub.OpenSubscription(ctx,
    "awssqs://sqs.us-east-2.amazonaws.com/123456789012/"+
        "myqueue?region=us-east-2")
if err != nil {
    log.Fatal(err)
}
defer subscription.Shutdown(ctx)

Index

Examples

Package Files

awssnssqs.go

Constants

const SNSScheme = "awssns"

SNSScheme is the URL scheme for pubsub.OpenTopic (for an SNS topic) that awssnssqs registers its URLOpeners under on pubsub.DefaultMux.

const SQSScheme = "awssqs"

SQSScheme is the URL scheme for pubsub.OpenTopic (for an SQS topic) and for pubsub.OpenSubscription that awssnssqs registers its URLOpeners under on pubsub.DefaultMux.

Variables

var Set = wire.NewSet(
    wire.Struct(new(URLOpener), "ConfigProvider"),
)

Set holds Wire providers for this package.

func OpenSNSTopic Uses

func OpenSNSTopic(ctx context.Context, sess client.ConfigProvider, topicARN string, opts *TopicOptions) *pubsub.Topic

OpenSNSTopic opens a topic that sends to the SNS topic with the given Amazon Resource Name (ARN).

Code:

// PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored.
// PRAGMA: On gocloud.dev, hide lines until the next blank line.
ctx := context.Background()

// Establish an AWS session.
// See https://docs.aws.amazon.com/sdk-for-go/api/aws/session/ for more info.
// The region must match the region for the SNS topic "mytopic".
sess, err := session.NewSession(&aws.Config{
    Region: aws.String("us-east-2"),
})
if err != nil {
    log.Fatal(err)
}

// Create a *pubsub.Topic.
const topicARN = "arn:aws:sns:us-east-2:123456789012:mytopic"
topic := awssnssqs.OpenSNSTopic(ctx, sess, topicARN, nil)
defer topic.Shutdown(ctx)

func OpenSQSTopic Uses

func OpenSQSTopic(ctx context.Context, sess client.ConfigProvider, qURL string, opts *TopicOptions) *pubsub.Topic

OpenSQSTopic opens a topic that sends to the SQS topic with the given SQS queue URL.

Code:

// PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored.
// PRAGMA: On gocloud.dev, hide lines until the next blank line.
ctx := context.Background()

// Establish an AWS session.
// See https://docs.aws.amazon.com/sdk-for-go/api/aws/session/ for more info.
// The region must match the region for the SQS queue "myqueue".
sess, err := session.NewSession(&aws.Config{
    Region: aws.String("us-east-2"),
})
if err != nil {
    log.Fatal(err)
}

// Create a *pubsub.Topic.
const queueURL = "https://sqs.us-east-2.amazonaws.com/123456789012/myqueue"
topic := awssnssqs.OpenSQSTopic(ctx, sess, queueURL, nil)
defer topic.Shutdown(ctx)

func OpenSubscription Uses

func OpenSubscription(ctx context.Context, sess client.ConfigProvider, qURL string, opts *SubscriptionOptions) *pubsub.Subscription

OpenSubscription opens a subscription based on AWS SQS for the given SQS queue URL. The queue is assumed to be subscribed to some SNS topic, though there is no check for this.

Code:

// PRAGMA: This example is used on gocloud.dev; PRAGMA comments adjust how it is shown and can be ignored.
// PRAGMA: On gocloud.dev, hide lines until the next blank line.
ctx := context.Background()

// Establish an AWS session.
// See https://docs.aws.amazon.com/sdk-for-go/api/aws/session/ for more info.
// The region must match the region for "MyQueue".
sess, err := session.NewSession(&aws.Config{
    Region: aws.String("us-east-2"),
})
if err != nil {
    log.Fatal(err)
}

// Construct a *pubsub.Subscription.
// https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/QueueURL.html
const queueURL = "https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue"
subscription := awssnssqs.OpenSubscription(ctx, sess, queueURL, nil)
defer subscription.Shutdown(ctx)

func OpenTopic Uses

func OpenTopic(ctx context.Context, sess client.ConfigProvider, topicARN string, opts *TopicOptions) *pubsub.Topic

OpenTopic is a shortcut for OpenSNSTopic, provided for backwards compatibility.

type BodyBase64Encoding Uses

type BodyBase64Encoding int

BodyBase64Encoding is an enum of strategies for when to base64 message bodies.

const (
    // NonUTF8Only means that message bodies that are valid UTF-8 encodings are
    // sent as-is. Invalid UTF-8 message bodies are base64 encoded, and a
    // MessageAttribute with key "base64encoded" is added to the message.
    // When receiving messages, the "base64encoded" attribute is used to determine
    // whether to base64 decode, and is then filtered out.
    NonUTF8Only BodyBase64Encoding = 0
    // Always means that all message bodies are base64 encoded.
    // A MessageAttribute with key "base64encoded" is added to the message.
    // When receiving messages, the "base64encoded" attribute is used to determine
    // whether to base64 decode, and is then filtered out.
    Always BodyBase64Encoding = 1
    // Never means that message bodies are never base64 encoded. Non-UTF-8
    // bytes in message bodies may be modified by SNS/SQS.
    Never BodyBase64Encoding = 2
)

type SubscriptionOptions Uses

type SubscriptionOptions struct {
    // Raw determines how the Subscription will process message bodies.
    //
    // If the subscription is expected to process messages sent directly to
    // SQS, or messages from SNS topics configured to use "raw" delivery,
    // set this to true. Message bodies will be passed through untouched.
    //
    // If false, the Subscription will use best-effort heuristics to
    // identify whether message bodies are raw or SNS JSON; this may be
    // inefficient for raw messages.
    //
    // See https://aws.amazon.com/sns/faqs/#Raw_message_delivery.
    Raw bool
}

SubscriptionOptions will contain configuration for subscriptions.

type TopicOptions Uses

type TopicOptions struct {
    // BodyBase64Encoding determines when message bodies are base64 encoded.
    // The default is NonUTF8Only.
    BodyBase64Encoding BodyBase64Encoding
}

TopicOptions contains configuration options for topics.

type URLOpener Uses

type URLOpener struct {
    // ConfigProvider configures the connection to AWS.
    ConfigProvider client.ConfigProvider

    // TopicOptions specifies the options to pass to OpenTopic.
    TopicOptions TopicOptions
    // SubscriptionOptions specifies the options to pass to OpenSubscription.
    SubscriptionOptions SubscriptionOptions
}

URLOpener opens AWS SNS/SQS URLs like "awssns:///sns-topic-arn" for SNS topics or "awssqs://sqs-queue-url" for SQS topics and subscriptions.

For SNS topics, the URL's host+path is used as the topic Amazon Resource Name (ARN). Since ARNs have ":" in them, and ":" precedes a port in URL hostnames, leave the host blank and put the ARN in the path (e.g., "awssns:///arn:aws:service:region:accountid:resourceType/resourcePath").

For SQS topics and subscriptions, the URL's host+path is prefixed with "https://" to create the queue URL.

The following query parameters are supported:

- raw (for "awssqs" Subscriptions only): sets SubscriberOptions.Raw. The
  value must be parseable by `strconv.ParseBool`.

See gocloud.dev/aws/ConfigFromURLParams for other query parameters that affect the default AWS session.

func (*URLOpener) OpenSubscriptionURL Uses

func (o *URLOpener) OpenSubscriptionURL(ctx context.Context, u *url.URL) (*pubsub.Subscription, error)

OpenSubscriptionURL opens a pubsub.Subscription based on u.

func (*URLOpener) OpenTopicURL Uses

func (o *URLOpener) OpenTopicURL(ctx context.Context, u *url.URL) (*pubsub.Topic, error)

OpenTopicURL opens a pubsub.Topic based on u.

Package awssnssqs imports 23 packages (graph) and is imported by 7 packages. Updated 2019-08-15. Refresh now. Tools for package owners.