From 0d7e9ee64cbf6751f5462c8aed0858c8f7d76ca0 Mon Sep 17 00:00:00 2001 From: Rowena Date: Thu, 10 Apr 2025 14:58:30 +0200 Subject: [PATCH 1/7] feat(topics): start resturcture --- .../api-cli/connect-aws-cli.mdx | 137 ++++++ pages/topics-and-events/api-cli/index.mdx | 8 + .../api-cli/python-node-sns.mdx | 422 ++++++++++++++++++ .../api-cli/sqs-sns-aws-cli.mdx | 191 ++++++++ .../assets/scaleway-topics-create-subs.webp | Bin 0 -> 24710 bytes .../assets/scaleway-topics-create-topic.webp | Bin 0 -> 44744 bytes .../assets/scaleway-topics-gen-creds.webp | Bin 0 -> 38064 bytes pages/topics-and-events/concepts.mdx | 183 ++++++++ pages/topics-and-events/faq.mdx | 46 ++ .../assets/scaleway-topics-create-subs.webp | Bin 0 -> 24710 bytes .../assets/scaleway-topics-create-topic.webp | Bin 0 -> 44744 bytes .../assets/scaleway-topics-gen-creds.webp | Bin 0 -> 38064 bytes .../how-to/create-credentials.mdx | 116 +++++ .../how-to/create-manage-subscriptions.mdx | 117 +++++ .../how-to/create-manage-topics.mdx | 61 +++ .../how-to/deactivate-delete-messaging.mdx | 45 ++ .../topics-and-events/how-to/get-started.mdx | 54 +++ pages/topics-and-events/how-to/index.mdx | 8 + .../how-to/manage-credentials.mdx | 76 ++++ .../how-to/monitor-mnq-cockpit.mdx | 49 ++ pages/topics-and-events/index.mdx | 83 ++++ pages/topics-and-events/quickstart.mdx | 298 +++++++++++++ .../reference-content/index.mdx | 8 + .../reference-content/limitations.mdx | 23 + .../reference-content/sns-overview.mdx | 62 +++ .../reference-content/sns-support.mdx | 279 ++++++++++++ 26 files changed, 2266 insertions(+) create mode 100644 pages/topics-and-events/api-cli/connect-aws-cli.mdx create mode 100644 pages/topics-and-events/api-cli/index.mdx create mode 100644 pages/topics-and-events/api-cli/python-node-sns.mdx create mode 100644 pages/topics-and-events/api-cli/sqs-sns-aws-cli.mdx create mode 100644 pages/topics-and-events/assets/scaleway-topics-create-subs.webp create mode 100644 pages/topics-and-events/assets/scaleway-topics-create-topic.webp create mode 100644 pages/topics-and-events/assets/scaleway-topics-gen-creds.webp create mode 100644 pages/topics-and-events/concepts.mdx create mode 100644 pages/topics-and-events/faq.mdx create mode 100644 pages/topics-and-events/how-to/assets/scaleway-topics-create-subs.webp create mode 100644 pages/topics-and-events/how-to/assets/scaleway-topics-create-topic.webp create mode 100644 pages/topics-and-events/how-to/assets/scaleway-topics-gen-creds.webp create mode 100644 pages/topics-and-events/how-to/create-credentials.mdx create mode 100644 pages/topics-and-events/how-to/create-manage-subscriptions.mdx create mode 100644 pages/topics-and-events/how-to/create-manage-topics.mdx create mode 100644 pages/topics-and-events/how-to/deactivate-delete-messaging.mdx create mode 100644 pages/topics-and-events/how-to/get-started.mdx create mode 100644 pages/topics-and-events/how-to/index.mdx create mode 100644 pages/topics-and-events/how-to/manage-credentials.mdx create mode 100644 pages/topics-and-events/how-to/monitor-mnq-cockpit.mdx create mode 100644 pages/topics-and-events/index.mdx create mode 100644 pages/topics-and-events/quickstart.mdx create mode 100644 pages/topics-and-events/reference-content/index.mdx create mode 100644 pages/topics-and-events/reference-content/limitations.mdx create mode 100644 pages/topics-and-events/reference-content/sns-overview.mdx create mode 100644 pages/topics-and-events/reference-content/sns-support.mdx diff --git a/pages/topics-and-events/api-cli/connect-aws-cli.mdx b/pages/topics-and-events/api-cli/connect-aws-cli.mdx new file mode 100644 index 0000000000..34f61a55d2 --- /dev/null +++ b/pages/topics-and-events/api-cli/connect-aws-cli.mdx @@ -0,0 +1,137 @@ +--- +meta: + title: Connecting Queues or Topics and Events to the AWS-CLI + description: This page explains how to connect Scaleway Queues and/or Topics and Events to the AWS-CLI +content: + h1: Connecting Queues or Topics and Events to the AWS-CLI + paragraph: This page explains how to connect Scaleway Queues and/or Topics and Events to the AWS-CLI +tags: messaging sns sqs aws-cli cli aws sdk python boto +categories: + - messaging +dates: + validation: 2024-10-18 + posted: 2023-01-04 +--- + +The AWS-CLI is an open-source tool built on top of the AWS SDK for Python (Boto) that provides commands for interacting with AWS services. With minimal configuration, you can start using the AWS-CLI with Scaleway Queues or Scaleway Topics and Events. This allows you to create, list and manage your queues and topics, send messages and much more, all from your command line. + +This guide shows you how to install the AWS-CLI and configure it to connect to Scaleway Queues or Scaleway Topics and Events. + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization +- Valid [credentials](/messaging/how-to/create-credentials/) for Queues and/or Topics and Events + + + This page assumes you will use the AWS-CLI v1. + + +## How to install the AWS-CLI + +To interact with Scaleway Queues and Scaleway Topics and Events, both `aws-cli` and `awscli-plugin-endpoint` need to be installed. The `awscli-plugin-endpoint` is a useful plugin to help people more easily access third-party providers such as Scaleway. + +Install both `aws-cli` and `awscli-plugin` using `pip`. + +``` +pip3 install awscli +pip3 install awscli-plugin-endpoint +``` + +## How to configure the AWS-CLI + +Now you have installed the AWS-CLI, you need to configure it for use with Scaleway Queues / Topics and Events. + +1. Create a file named `~/.aws/config` by running the following command: + ``` + aws configure set plugins.endpoint awscli_plugin_endpoint + ``` + + + With the most recent versions of awscli (1.29.0 or 2.13.0), the use of a plugin is not necessary. If you are using one of those versions and wish to skip this step, you can do so. Note that this will also affect your configuration file in the next step. + + +2. Open the `~/.aws/config` file you just created in a text editor and edit it as follows (the Queues (SQS) or Topics and Events (SNS) endpoint URLs can be found in the console on the **Settings** page for the relevant product) + ``` + [plugins] + endpoint = awscli_plugin_endpoint + [profile sns] + region = fr-par + sns = + endpoint_url = https://sns.mnq.fr-par.scaleway.com + [profile sqs] + region = fr-par + sqs = + endpoint_url = https://sqs.mnq.fr-par.scaleway.com + ``` + + Optionally, you can also configure additional profiles by adding new blocks under `[sqs]` and `[sns]`. For example, you can add a third profile, `[profile aws]`, to connect to the AWS SQS/SNS service if you want: + + ``` + [plugins] + endpoint = awscli_plugin_endpoint + [profile sns] + region = fr-par + sns = + endpoint_url = https://sns.mnq.fr-par.scaleway.com + [profile sqs] + region = fr-par + sqs = + endpoint_url = https://sqs.mnq.fr-par.scaleway.com + [profile aws] + region=eu-west-3 + output=json + ``` + + + If you are using the AWS-CLI v2, you must include the path to the plugin in your configuration file. Add `cli_legacy_plugin_path = ` to the `[plugins]` section, replacing `` with the corresponding path. + + + + If you are using aws 1.29.0 or 2.13.0 without the plugin, your configuration file should be as follows: + ``` + [profile sns] + region = fr-par + endpoint_url = https://sns.mnq.fr-par.scaleway.com + [profile sqs] + region = fr-par + endpoint_url = https://sqs.mnq.fr-par.scaleway.com + ``` + + + +3. Generate a credentials file using the following command: + ``` + aws configure + ``` +** +4. Open the `~/.aws/credentials` file you just created, and for each product (out of **Queues** and **Topics and Events**) you want to use, add the access key and secret key you saved when you generated your [credentials](/messaging/how-to/create-credentials/): + ``` + [topics_events] + aws_access_key_id= + aws_secret_access_key= + + [queues] + aws_access_key_id= + aws_secret_access_key= + ``` + + If you have other profiles, you can add a block to indicate their credentials too: + ``` + [aws] + aws_access_key_id= + aws_secret_access_key= + ``` + +6. Test that everything is set up correctly with the following command: + ``` + aws queues list-queues + ``` + + Use the `--profile` option if you want to test it using a different profile. + + + Check out our dedicated documentation to find more common commands for getting started with the AWS CLI: + - The [Queues guide](/messaging/api-cli/sqs-sns-aws-cli/#getting-started-with-scaleway-queues) walks you through creating and listing queues, sending messages to queues, and more. + - The [Topics and Events guide](/messaging/api-cli/sqs-sns-aws-cli/#getting-started-with-topics-and-events) shows you how to create and list topics and subscriptions, send messages to topics, and more. + diff --git a/pages/topics-and-events/api-cli/index.mdx b/pages/topics-and-events/api-cli/index.mdx new file mode 100644 index 0000000000..aef6e7ef1f --- /dev/null +++ b/pages/topics-and-events/api-cli/index.mdx @@ -0,0 +1,8 @@ +--- +meta: + title: NATS, Queues, and Topics and Events - API/CLI Documentation + description: NATS, Queues, and Topics and Events API/CLI Documentation +content: + h1: NATS, Queues, and Topics and Events - API/CLI Documentation + paragraph: NATS, Queues, and Topics and Events API/CLI Documentation +--- diff --git a/pages/topics-and-events/api-cli/python-node-sns.mdx b/pages/topics-and-events/api-cli/python-node-sns.mdx new file mode 100644 index 0000000000..acd87ce96e --- /dev/null +++ b/pages/topics-and-events/api-cli/python-node-sns.mdx @@ -0,0 +1,422 @@ +--- +meta: + title: Using Go, Python or Node.js with Topics and Events + description: This page explains how to use Go, Python or Node.js with Topics and Events and provides code samples +content: + h1: Using Go, Python or Node.js with Topics and Events + paragraph: This page explains how to use Go, Python or Node.js with Topics and Events and provides code samples +tags: messaging boto3 python nodejs sns go topics-events +categories: + - messaging +dates: + validation: 2024-10-18 + posted: 2023-01-04 +--- + +AWS provides a number of **S**oftware **D**evelopment **K**its (SDKs) which provide language-specific APIs for AWS services, including [SNS](/messaging/concepts/#sns), which is the protocol that Scaleway Topics and Events is based on. + +- AWS provides a dedicated [SDK for Go](https://aws.amazon.com/sdk-for-go/). +- The [AWS SDK for Python](https://aws.amazon.com/sdk-for-python/) is Boto3. +- For Node.js, use the [AWS SDK for JavaScript](https://aws.amazon.com/sdk-for-javascript/), which can be [installed from NPM](https://github.com/aws/aws-sdk-js-v3#getting-started). + +This page provides code samples to show you how to get started using these SDKs with Scaleway Topics and Events. + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization +- Valid [credentials](/messaging/how-to/create-credentials/) for Topics and Events +- Installed the relevant AWS SDK [for Go](https://aws.amazon.com/sdk-for-go/), [Python](https://aws.amazon.com/sdk-for-python/) and/or [JavaScript](https://aws.amazon.com/sdk-for-javascript/) + +## Go + +### Connect to Topics and Events (Go) + +The following code shows you how to connect to Scaleway Topics and Events: + +```go +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/sns" +) + +func main() { + awsSession := session.Must(session.NewSession(&aws.Config{ + Region: aws.String("fr-par"), + Endpoint: aws.String("http://sns.mnq.fr-par.scaleway.com"), + Credentials: credentials.NewStaticCredentials(AwsAccessKey, AwsSecretKey, ""), + })) + + awsSns := sns.New(awsSession) + + [...] +} +``` + + + + The `Endpoint` for Scaleway Topics and Events is `https://sns.mnq.fr-par.scaleway.com`. The values for the access and secret keys should be the credentials you [generated](/messaging/how-to/create-credentials/) for Topics and Events. + + + +Once connected, you can use any of the SDK's available functions. Be aware though that some functions are not [supported by Scaleway Topics and Events](/messaging/reference-content/sns-support/), so make sure to check the link for more details on these. See the [official SDK documentation](https://pkg.go.dev/github.com/aws/aws-sdk-go/service/sns) for more information on getting started with the SDK, or keep reading for some code examples. + +### Create topic (Go) + +```go +createTopicResponse, _ := awsSNS.CreateTopic(&sns.CreateTopicInput{ + Name: aws.String("my-test-topic"), +}) +fmt.Println(*createTopicResponse.TopicArn) +``` + +### Publish messages to this topic (Go) + +Be careful: messages sent to topics with no subscriptions are automatically deleted + +```go +for i := 0; i < 10; i++ { + _, _ = awsSNS.Publish(&sns.PublishInput{ + Message: aws.String(fmt.Sprintf("Hello World: %d", i)), + TopicArn: createTopicResponse.TopicArn, + }) +} +``` + +### Create subscriptions to this topic (Go) + +#### Subscribe to a public Scaleway function + +This code triggers the function each time a message is published to the topic. + +You can find the value for `[Function URL]` in the [Scaleway console](https://console.scaleway.com) in the **Endpoints** tab of your function's **Overview** page. + +```go +_, _ = awsSns.Subscribe(&sns.SubscribeInput{ + Endpoint: aws.String(FunctionUrl), + Protocol: aws.String("lambda"), + TopicArn: createTopicResponse.TopicArn, +}) + +#### Subscribe to an HTTP/S endpoint + +```go +_, _ = awsSns.Subscribe(&sns.SubscribeInput{ + Endpoint: aws.String(Url), + Protocol: aws.String("http"), // or https + TopicArn: createTopicResponse.TopicArn, +}) +``` + +The HTTP server should receive an HTTP request with a body in json matching the following format: + +```json +{ +"Type": "SubscriptionConfirmation", +"Token": "", +"MessageId": "", +"TopicArn": "arn:scw:sns:fr-par::MyTopic", +"Message": "You have chosen to subscribe to the topic arn:scw:sns:fr-par::MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.", +"Timestamp": "2022-06-29T10:03:34Z", +"SignatureVersion": "1", +"Signature": "", +"SigningCertURL": "https://messaging.s3.fr-par.scw.cloud/fr-par/sns/sns_certificate_[certSerialNumber].crt", +"SubscribeURL": "" // Get the confirmation link located here +} +``` + +The signing certificate of the message is in the JSON of the `SigningCertURL`. This certificate is also signed by the [trust chain certificate](https://messaging.s3.fr-par.scw.cloud/fr-par/sns/sns-trust-chain.pem) (common name `sns.mnq.srr.scw.cloud`). For more information about verifying the authenticity of the message, refer to the official [AWS documentation](https://docs.aws.amazon.com/sns/latest/dg/sns-verify-signature-of-message.html). + +To confirm the subscription, make a request to the `SubscribeURL` using your browser or curl. + +### Delete all subscriptions (Go) + +```go +listSubscriptions, _ := awsSns.ListSubscriptionsByTopic(&sns.ListSubscriptionsByTopicInput{ + TopicArn: createTopicResponse.TopicArn, +}) +for _, sub := range listSubscriptions.Subscriptions { + awsSns.Unsubscribe(&sns.UnsubscribeInput{ + SubscriptionArn: sub.SubscriptionArn, + }) +} +``` + +## Python + +### Connect to Topics and Events (Python) + +The following code shows you how to connect to Topics and Events using Boto3's `resource()`. You could also use `client()`, but we favor `resource()` as it is more pythonesque: + +```python +sns = boto3.resource('sns', + endpoint_url=[], + aws_access_key_id=[], + aws_secret_access_key=[], + region_name='fr-par') +``` + + + The `endpoint_url` for Scaleway Topics and Events (based on SNS) is `https://sns.mnq.fr-par.scaleway.com`. The values for the access and secret keys should be the credentials you [generated](/messaging/how-to/create-credentials/) for Topics and Events. + + +Once connected to, you can use any of the SDK's available functions. However, some functions are not [supported by Scaleway Topics and Events](/messaging/reference-content/sns-support/), so do check the link to make sure. See the [official SDK documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) for more information, or keep reading for some code examples. + +### Create topic (Python) + +```python +# Create a topic. This returns an SNS.Topic instance +topic = sns.create_topic(Name='test') # You can now access identifiers and attributes +print(topic.arn) +print(topic.attributes) +``` + +### Publish messages to this topic (Python) + +Be careful: messages sent to topics with no subscriptions are automatically deleted + +```python +for i in range (0,10): + topic.publish(Message="Hello World: "+str(i)) +``` + +### Create subscriptions to this topic (Python) + +#### Subscribe to a public Scaleway function + +This code triggers the function each time a message is published to the topic. + +You can find the value for `[Function URL]` in the [Scaleway console](https://console.scaleway.com) in the **Endpoints** tab of your function's **Overview** page. + +```python +subscription_functions = topic.subscribe( + Protocol='lambda', + Endpoint=[Function URL], + ReturnSubscriptionArn=True +) +``` + +```python +subscription_functions = topic.subscribe( + Protocol='lambda', + Endpoint=[Function URL], + ReturnSubscriptionArn=True, + Attributes={ + 'RedrivePolicy': '{"deadLetterTargetArn": "[Queue ARN]"}' + } +) +``` + +#### Subscribe to an HTTP/S endpoint + +```python +subscription = topic.subscribe( + Protocol='http', //or https + Endpoint=url, + ReturnSubscriptionArn=True +) +``` + +The HTTP server should receive an HTTP request with a body in json matching the following format: + +```json +{ +"Type": "SubscriptionConfirmation", +"Token": "", +"MessageId": "", +"TopicArn": "arn:scw:sns:fr-par::MyTopic", +"Message": "You have chosen to subscribe to the topic arn:scw:sns:fr-par::MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.", +"Timestamp": "2022-06-29T10:03:34Z", +"SignatureVersion": "1", +"Signature": "", +"SigningCertURL": "http:///SNStest.crt", +"SubscribeURL": "" // Get the confirmation link located here +} +``` + +To confirm the subscription, make a request to the `SubscribeURL` using your browser or curl. + +### Delete all subscriptions (Python) + +```python +for subs in topic.subscriptions.all(): + subs.delete() +``` + +## Node.js + +### Connect to Topics and Events (NodeJS) + +The following code sample shows how to connect to Topics and Events: + +```javascript +import { + CreateTopicCommand, + DeleteTopicCommand, + ListSubscriptionsByTopicCommand, + ListTopicsCommand, + PublishCommand, + SNSClient, + SubscribeCommand, + UnsubscribeCommand, + } from "@aws-sdk/client-sns"; + +var snsClient = new SNSClient({ + credentials : { + accessKeyId : "", + secretAccessKey: "" + }, + region: "par", + endpoint: "https://sns.mnq.fr-par.scaleway.com", + +}) + +``` + + + The `endpoint_url` for Scaleway Topics and Events is `https://sns.mnq.fr-par.scaleway.com`. For the access and secret key values, use the credentials you [generated](/messaging/how-to/create-credentials/) for Topics and Events. + + +Once connected, you can use any of the SDK's available functions. However, some functions are not [supported by Scaleway Topics and Events](/messaging/reference-content/sns-support), so do check the link to make sure. See the [official SDK documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-sns/) for more information, or keep reading for some code examples. + +### Create topic (NodeJS) + +You can find all available parameters for `createTopic` in the [AWS documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-sns/classes/createtopiccommand.html). + +```javascript +var paramsTopic = { + Name: 'MyTopic' + }; +const commandCreateTopic = new CreateTopicCommand(paramsTopic); +const restCreateTopic = await snsClient.send(commandCreateTopic); +const topicARN= restCreateTopic.TopicArn; +console.log(topicARN); +``` + +### Publish messages to this topic (NodeJS) + +Be careful: messages sent to topics with no subscriptions are automatically deleted. + +This code sample demonstrates how to send a message with `MessageAttributes`. For more information on MessageAttributes, refer to [the official documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-sns/classes/publishcommand.html). + +```javascript +var paramsSend = { + Message: 'MyMessage', + Subject: 'MySubject', + TopicArn: topicARN, + }; +const commandPublishCommand = new PublishCommand(paramsSend); +const restPublishCommand = await snsClient.send(commandPublishCommand); +console.log(restPublishCommand.MessageId); +``` + +### Subscribe to a topic (NodeJS) + +You can find all available parameters for the subscribe operation in the [AWS documentation] (https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-sns/classes/subscribecommand.html) + +#### Subscribe to a public Scaleway function + +This code triggers the function each time a message is published to the topic. + +You can find the value for `[Function URL]` in the [Scaleway console](https://console.scaleway.com) in the **Endpoints** tab of your function's **Overview** page. + +```javascript +var params = { + Protocol: 'lambda', + TopicArn: topicARN, + Endpoint: 'YOUR FUNCTION ENDPOINT', + ReturnSubscriptionArn: true + }; +const command = new SubscribeCommand(params); +const rest = await snsClient.send(command); +console.log(rest.SubscriptionArn); +``` + +#### Subscribe to an HTTP/S endpoint + +```javascript +var paramsHttpsSubscription = { + Protocol: 'https', + TopicArn: topicARN, + Endpoint: 'YOUR SERVER ENDPOINT', + ReturnSubscriptionArn: true + }; +const commandHttpsSubscription = new SubscribeCommand(paramsHttpsSubscription); +const restHttpsSubscription = await snsClient.send(commandHttpsSubscription); +console.log(restHttpsSubscription.SubscriptionArn); + +``` +The HTTP server receives an HTTP request with a `json` body matching the following format: + +```json +{ +"Type": "SubscriptionConfirmation", +"Token": "", +"MessageId": "", +"TopicArn": "arn:scw:sns:fr-par::MyTopic", +"Message": "You have chosen to subscribe to the topic arn:scw:sns:fr-par::MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.", +"Timestamp": "2022-06-29T10:03:34Z", +"SignatureVersion": "1", +"Signature": "", +"SigningCertURL": "http:///SNStest.crt", +"SubscribeURL": "" // Get the confirmation link located here +} +``` + +To confirm the subscription, make a request to the `SubscribeURL` using your browser or curl. + +### Delete all subscriptions (NodeJS) + +The following code sample deletes all subscriptions to a topic. + +```javascript +var paramsListSubs = { + TopicArn: topicARN, + }; +const commandListSubs = new ListSubscriptionsByTopicCommand(paramsListSubs); +const restListSubs = await snsClient.send(commandListSubs); +const subscriptionsList = restListSubs.Subscriptions; +subscriptionsList.forEach(async function (element) { +try { + var params = { + SubscriptionArn: element.SubscriptionArn + }; + const command = new UnsubscribeCommand(params) + const rest = await snsClient.send(command) + console.log("Unsubscribing : ",rest.$metadata.httpStatusCode) + +} catch (e) { + throw new Error(e.message) +} +}); + +``` + +### Delete all topics (NodeJS) + +The following code sample deletes all your topics. + +```javascript +// First List Topics +const commandList = new ListTopicsCommand({}); +const restTopicList = await snsClient.send(commandList); +const TopicList = restTopicList.Topics + +// For Each Topic in the list, apply the Delete Topic Command +TopicList.forEach(async function (element) { + try { + var params = { + TopicArn: element.TopicArn + }; + const command = new DeleteTopicCommand(params) + const rest = await snsClient.send(command) + console.log("Deleting : ",rest.$metadata.httpStatusCode) + + } catch (e) { + throw new Error(e.message) + } + }); + +``` diff --git a/pages/topics-and-events/api-cli/sqs-sns-aws-cli.mdx b/pages/topics-and-events/api-cli/sqs-sns-aws-cli.mdx new file mode 100644 index 0000000000..ac152c9f78 --- /dev/null +++ b/pages/topics-and-events/api-cli/sqs-sns-aws-cli.mdx @@ -0,0 +1,191 @@ +--- +meta: + title: Using Scaleway Queues and Scaleway Topics and Events with the AWS-CLI + description: This page explains how to use Scaleway Queues and Scaleway Topics and Events for creating queues and sending and receiving messages with the AWS CLI +content: + h1: Using Scaleway Queues and Scaleway Topics and Events with the AWS-CLI + paragraph: This page explains how to use Scaleway Queues and Scaleway Topics and Events for creating queues and sending and receiving messages with the AWS CLI +tags: messaging sns sqs aws-cli cli aws queues messages subscribe publish +categories: + - messaging +dates: + validation: 2024-10-18 + posted: 2023-04-04 +validation_frequency: 8 +--- + +The AWS-CLI is an open-source tool built on top of the AWS SDK for Python (Boto) that provides commands for interacting with AWS services. Once you have [connected Scaleway Queues and/or Topics and Events to the AWS-CLI](/messaging/api-cli/connect-aws-cli/), you can start creating, listing and managing your queues and topics, sending messages and much more, all from your command line. + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization +- Valid [credentials](/messaging/how-to/create-credentials/) for Queues and/or Topics and Events +- [Connected Queues and/or Topics and Events to the AWS-CLI](/messaging/api-cli/connect-aws-cli/) +- [jq](https://stedolan.github.io/jq/download/) installed on your machine + +## Getting started with Scaleway Queues + +1. Use the following command to create a queue: + + ```sh + aws sqs create-queue --queue-name MyQueue | tee my-queue.json + ``` + +2. Use the following command to list existing queues: + + ```sh + aws sqs list-queues + ``` + +3. Use the following command to send messages to a queue: + + ```sh + aws sqs send-message --queue-url $(jq -r .QueueUrl my-queue.json) --message-body "Hello world!" + + aws sqs send-message --queue-url $(jq -r .QueueUrl my-queue.json) --message-body "Second Message." + ``` + +4. Use the following command to receive messages: + + ```sh + aws sqs receive-message --queue-url $(jq -r .QueueUrl my-queue.json) | tee message1.json + + aws sqs receive-message --queue-url $(jq -r .QueueUrl my-queue.json) | tee message2.json + ``` + +5. Use the following command to delete messages. This is necessary as once a message has been processed on your consumer side (typically by a worker), it will be re-queued unless it is explicitly deleted. + + ```sh + aws sqs delete-message --queue-url $(jq -r .QueueUrl my-queue.json) --receipt-handle $(jq -r .Messages[0].ReceiptHandle message1.json) + + aws sqs delete-message --queue-url $(jq -r .QueueUrl my-queue.json) --receipt-handle $(jq -r .Messages[0].ReceiptHandle message2.json) + ``` + +6. Use the following command to delete the queue itself: + + ```sh + aws sqs delete-queue --queue-url $(jq -r .QueueUrl my-queue.json) + ``` + +## Getting started with Topics and Events + +1. Use the following command to create a topic: + + ```sh + aws sns create-topic --name MyTopic | tee my-topic.json + ``` + +2. Use the following command to list existing topics: + + ```sh + aws sns list-topics + ``` + +### Preparing and subscribing to an HTTP/HTTPS target for Topics and Events messages + +1. Get the public endpoint of the HTTP server you want to forward your messages to. + +2. Use the following command to configure a subscription to push each new message sent on the topic to the HTTP server: + + ```sh + aws sns subscribe --topic-arn $(jq -r .TopicArn my-topic.json) --protocol http --notification-endpoint | tee my-subscription.json + ``` + +3. Find the HTTP request received by the HTTP server. It should have a body in json matching the following format. It contains information necessary to complete the subscription process: + + ```json + { + "Type": "SubscriptionConfirmation", + "Token": "", + "MessageId": "", + "TopicArn": "arn:scw:sns:fr-par::MyTopic", + "Message": "You have chosen to subscribe to the topic arn:scw:sns:fr-par::MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.", + "Timestamp": "2022-06-29T10:03:34Z", + "SignatureVersion": "1", + "Signature": "", + "SigningCertURL": "http:///SNStest.crt", + "SubscribeURL": "" // Get the confirmation link located here + } + ``` + +4. Use the following command to confirm the subscription: + + ```sh + curl "" + ``` + +### Preparing and subscribing to a lambda (Scaleway Serverless Functions) target for Topics and Events messages + +1. Create the function following the steps detailed in the [Scaleway Functions Quickstart](/serverless-functions/quickstart/). + +2. Get the function endpoint from the [Scaleway console](https://console.scaleway.com/functions) under "Functions" -> "[YOUR-FUNCTION-NAMESPACE]" -> "[YOUR-FUNCTION-NAME]" -> "Function Settings" tab -> "Function Endpoint" + + + Only the main generated endpoint of the function will work, not the aliases. The endpoint should match the following format: + + ```sh + https://-.functions.fnc.fr-par.scw.cloud + example: "https://mynamespacexxxxxxxx-myfunction.functions.fnc.fr-par.scw.cloud)" + ``` + + +3. Use the following command to configure a subscription to push each new message sent on this topic to the function: + + ```sh + aws sns subscribe --topic-arn $(jq -r .TopicArn my-topic.json) --protocol lambda --notification-endpoint | tee my-subscription.json + + ``` + +## Continuing with Topics and Events + +1. Use the following command to list subscriptions: + + ```sh + aws sns list-subscriptions + ``` + +2. Use the following command to publish a message on the topic: + + ```sh + aws sns publish --topic-arn $(jq -r .TopicArn my-topic.json) --message "Hello world!" --message-deduplication-id $(date +%s) + ``` + +3. Use the following command to read the message received on a **Scaleway Queues** target: + + + - For **HTTP**/**HTTPS** targets, you should have received the message on your server + - For **lambda** targets, your function should have been called with the message as argument + + + ```sh + aws sqs receive-message --queue-url $(jq -r .QueueUrl my-queue.json) | tee message1.json + ``` + +4. Use the following command to delete the message received on a **Scaleway Queues** target. This is necessary to prevent it from being re-queued: + + ```sh + aws sqs delete-message --queue-url $(jq -r .QueueUrl my-queue.json) --receipt-handle $(jq -r .Messages[0].ReceiptHandle message1.json) + ``` + +5. Use the following command to delete the subscription: + + ```sh + aws sns unsubscribe --subscription-arn $(jq -r .SubscriptionArn my-subscription.json) + ``` + +6. Use the following command to delete the Scaleway queue (if you had a Scaleway Queues target): + + ```sh + aws sqs delete-queue --queue-url $(jq -r .QueueUrl my-queue.json) + ``` + + + For **lambda**, delete the function (if necessary), using the [Scaleway console](https://console.scaleway.com/functions) + + +7. Use the following command to delete the topic: + + ```sh + aws sns delete-topic --topic-arn $(jq -r .TopicArn my-topic.json) + ``` diff --git a/pages/topics-and-events/assets/scaleway-topics-create-subs.webp b/pages/topics-and-events/assets/scaleway-topics-create-subs.webp new file mode 100644 index 0000000000000000000000000000000000000000..f9aec9f4b7d090f7f17a9f5d99957656471ff9fe GIT binary patch literal 24710 zcmV*3Kz6@UNk&F~U;qGDMM6+kP&iC-U;qFwr9yE4Rg2=bZ5&JcZ+*SKBVqz_ETwEb zkl!Tin`9rzt?5){&m;h83i)_K?@q2tAApJ~3L=U%3jt9itq2q$O{*x#>e~3EsktG* zHha_QuDPg^vj1NkMcOV`gTi!Qbr8f1b&&@U^&NqM{~xs+1TQ z1CbX2wGtJD+-f7r;-nf@OjT7u42+il69cPaeEbYWPER!uOA%RFy*X+m$&r%7KF30N*SqnY|K^AG zjDL(vx?kz)N>`SB6 zEL(;#%9brlmUU%GSNh)j{T|=%_w&7XJoX$*8(i+v<`2k8$ILKY7%FCJnW4>|n_s`_ zncTPwGnC8Rg|S+$l8Tv`+2LOuPFio6nVBl+w%aMg%*>o>%j|KOnQ2ic^>P=6$?rs6 zm>K_o{LT$CGj`0(DLD#r%bavMt1xxj?RlLnwp{+|FsJ2;Q{8ZGI4PHRl|8dvIH_@| zoO8m=P~k7z1xqaBa2DFoq}qdJnC9dhYy$uwN^EP2?k>SV1pzx~&pms0_ul{czW3WY z=iDnZl!^(8fTDDFPLGEH01zeCwr!H>VCYVRk~C067(BhZ_m94JuRVuQVQmypN{~>x zr~kBI+X~w{iy5_OBifGY!wLQUHTryYCw%_12`%Hp{50Fh+f!$6mO_%HkGMEO(@<-q5uG-8a=dL=GnG= z_hG)-JB7LHy_ek(X5`u#v%NHCygXXlwx-#(ZAT1uX>s@9EvX=J!M!eHT(j#_;CA2j zQk;{d|B~27awJI&G|;^+BC6JJoXNY_OTeUo|KPv(I!hP#B2B}(a!Dq@%>l-e6e`Ws zzJ0^As*%Nk695AahTEng9J%10dSSG8~yp_UM3PRs35NqE~zUP zSTsGqHDly`&;-i>Czu>wv*}?+3MjihA2NMVS1ce+S#5;?_{6H6WdVM}!}p$SBuw3E zMDb4Np0L1blKoL;0?k;~jA402L@SyU_A_e4mZyfQu7R!@qZoB@!g9a~L?Nv=-0g@! zhTmE3~}utXF(Yg6XsYjpGkl!p~!+NJ39A=9>OG+M5+2j0L$HkJ*U~4A}MzHFkNY zL}m(ZD@-GTSu=>Wog|ev7!hIIX;vg)B+C;;g5LT7IG%D{5n1%*&_qV}aDiN+7VjI~AaS_WpS5m4s7=UT1?yZx4;v|N|F#TMdX4+02 z^Kn(Ro;bD^7@EHNnS%(i02nDQxK4C^8+Jv920$a%cD_vkS)8gOT|l&C^hA>K&CfJ+ zmO}sjxm2ENJ9exqD=MR~k^b!cwHt^z4=9mg(MH+D%$s^7VWaFl$ULYn1Fd1wf|kn{ znkGHd^sD}d5G+??fP3swE0VNA_NPY|9ZYiaWp%6cv;?gu>_opMry z;utX=N{ngv-&wrqVQ5^xLEh?a9afe=Vu*Rl?qlPSx+SAe0APWc_xXdsp88>LncKl0 z*%W`5U&TyQ+gCfQC`7~nEg=QxskTeUw6v1aJBC&gZ{k~SJW6ABI@?c zE}mO(S+zs8!p>1~2N`1eUZFCNa#ddA#BQIu(1)Su6nV7jZV$Lo;x#7B*;{G)pv4=eAYfTDQ`Ly1_%jA08Mdfxa) zlaaH`awoTMcK#TLx!j4xt@y-Fic(jEJ%G|I?N0~Lh^In^8POKh198dW;8VP z0zsN+IKuo^&Lr)$8-x=dGyoXz!z)zY<^CR7T@v)5kD((iXNw?AR1o8EBh_i+7zGuE5V6l76*95gsVQ-mk)Qxy_vG6 z7?k|UcuQ5b0_+!?tmI<)C|7=zMr52bJ8_G>flFMW4N%|!mQ_>1(y~8Kv9$@ zM=9yDqvNz&2B48=C*N2^%L5YeD+Yk$tQiX%WkL9sVGa!L{L6BE9rF*Ex?fceLHXz;=e46*&N&OO)}` zS8hyAbKuZO$;m(ZD@R`(3ehPe_3`!`L$8Z^J>$vEKjzz4!cPvp1;gT%xN9c#{ z%B2ND6%>eQuHw)dTD2)UwC>7|qN#Tru`5QODh%V7}#DKkep;t4OZ+Des z=Kw#P3a+~aI&Z9JG+E4fA^os8|G7}Xm8yY(86yluWBS|+_uTp2@h@mK43~D5pJ=Kx z6u(qw2&owTeWB=?UieoEW{h&&#jz0GGJ5wpefyZWLwlGE;W$Py4V2Gns1_oKDU=U9 zagSD`jtZMzrHG>zsfwIr4}T8RQ9odaIJ*+@8OhSztz@1xRW1aO-*0zqJjt&LliG+Vf(14+i#u>3-vX(t$`WG%6rk&G^Zmo zhVO+XiwQJxXYXI~+Ieb(^F^vccNRP``9ycfP&cZh+cY2n7`lZEciB3Y5^e~`av9&0 zpakg>T}R34tk_L_z?D%0nLNsu5y6aOBSq&Bju?+_i1B_S$^*0VUy0% zKUuO&DwCKN4}TaMGYW@P!JTHl+Kq^4RyNnT5lk(H`td)$7K2)eF=0Aoq%H;@{Gy~x zp>(cxU9y^}wHVS)0`3w-BSlC5oMHrlAK@vgf~^Powuhr9MnPBMbAF=>d*701XNGVX zr5<;Yt~^AbjYzh$P&V3*xpV4I0H6E#xFS-NFRj7PFDUo%d)h+-x%+G1P0?wDN1)O< zniM|%OworKN<>SRyU}+}W(fk^nW=C^Afs2T(_UCPv0oSX5X>IR0ANqM@UOcRq=H{v zf*-#x7)#`nKSuTswtim#c9xH1bw=zWUfT-H$j5+h?xAL(4i(8R{yJww_5jexES1KM z02pu{r|CDbzyB)R$x+IU97Ug5sIp%DHkRX;O?ZX`b)Y@E&K0HL%EpTbRsPBAb$>}Q z4NwQUg==0Gq$@sZCw#~QL(N@Yw<0qF1sVDVFU)UwzlvsUPMmhM{LD zf0xZJQ|tl&Cs}kvUHxRsx+e%}Bz zu1A*eLVALd2Wg`ILgK&)1!cz3)LV|&IipT5-m3NdIQ5DH3v7lSGT*KO)F06;eX z!NI!_(dtPT2f%DshEmg(xPN6_Pvna9=WfKgBC1|t9cYcN`z8$7tsANeZQ>Sqe`7tO zNtOn3C-CR&4_Ad%Yx`>pN*)%NMIK(?;eD8ZhK+)-+IV5LiM^1v_owOs#9_c$(An*~ zkPVMF-m@_Hhp+Ck!F`GufE)%KbqN$j03%GNj0BU9Ga@llW*pDBB>|vlg6D!#(ppwe z-px`9`q%Zp-e(pd&ztLedL!a7k8T0B1u)=y?O@%E<$UhM(>N-)=i{&3QK8l^v_|*v z)ONK@i8lnybZ2hK68FR>tUOA=o!q;6^cpl$bM^Ok)qag-RtcU&-Ay^i`r8gfPxLy_ z9=*j)@;B)Eg~lJ|-uqiQHonXMLIaMjFD53uOJio_Qkah3xwOzwg=NRK;F@vXgjq+y ztKrpT*|3?Vd$GcXFG*DshOpfOPV#s5HtLtXa~moeM~V_%vgbcI{Q9q1UtVkB66zNDI-CuqF}oZy^SXMP-27E zn>I-Lp{q5C5~mn;m(OL2odZIyp+(?D#4+Eter0E3N40*AXR$yEe-Wb?G+pUXJo<&S zzB@Y&Fdem*eLEDT>6r5-c6j|yi`Tq2+Uk~_xje+ZyCkl8waMrloa@>Z@ASGldx4r# z#lzvIw{j+FXSsfO?SmSC8hY~#yzP<=UE>NC&sTo(dzSfW7^|qg0p`ZmA za2UGxY$2lx3MiTrGn9y73dDqQ&`sc10ARq+uBXrMqJW|WJA#oy#4~yutexyRA~0MoRMhgY<-pisoHI}4uJ-(3GDKv%!7N7C2&pelly0$z0cz9;U%Vgvw~ zhWT>uLPX2$mfZE)GhF25kzQyAXNp?fmDyYW;+iY7L64!UN3I2+kn|&spPuqfSw2Pq zjF^-=&eY8ZhRHP(vjm|POiOjG&iY9e2_%Lob6V~&)3)kZ7MHYo{#n5!YwIBO!cKra zO)0K)9~lp?IMrh)NmFv)n!K8aKjI>01h86PI$&dJ4%0geD9Su5;?*T1p?tBv(N;ID zC`NvSB`H*$=!0sG^fpB!t=9W3v5?%=Ja#U)s%WvU-Ca9%6@yZQ*lSHFT&9{XJwtp= zQ_K&-0`n;=t%J2QJHE`EH0n*RqyLRlDmsT`J;x3o|=1+I|M#>{7mMgPV)f*T_*KG6z zf$n|+!%in!+g_@Loj^tbtnE^<|HLq;Zc_AU5Jf3yw)Au)LSkpZ@9T@k^M&tnnPF}> z*Df5y$mNJBMU|nC;TN%?caZ8-V=kYE02tEgrDu;REmah*iDCUkdtj}iSGv0h?~CY5RQl~ zS&TZ14CF*0Q|&#aD#2Sd7TAOZFU0izL(av^#$vZZSFN-4VU3H=pUe z)0u!m-Get5ZEJd}mr_11rsU2eLvYQR(Ix=g{7X6L`dmqNdvA3dWU!dwD^7JiYmU@9 z3m{385j*KOss~Jq49%8?v0Q{%0GxcTYu9wHtq7!>5j&Ydk<)d`dh^wxtr(L~g3H(( zS=st3oNRtSe52#604yNJW~pk>vCS)(^uV4@;X;{la>}Sw$tc~I_EB+%Dc)4`Hco8? z*!`(AF$9-)m0gS%F#_|4Z`bV=usJ8+Z(yJNCjQ@4=va4{t~k4+IDyYvvr&8j^I;t)Z(8r`WqPm2`7xi#(m#_V7~YM~y8C8SI3 zU_+kgG`M|#oL4SRHxNJ#b)JTpG;}N(M&Z~H{;cN8*lOus zn6z=sX_fs_=U-PJPGhkxoqn$UN@BuYn%jf=+-LyortVrQ$>tA9W&mo4ouu7D;ahgc z4$0ZV&w7rI1b0Wadvz)Iv^E=u%-U}@D4uQ<7SRLC&9~+3Qn{hszpEThBY~2MgKk}V z>W;s*V1>Rr21LhjNK<>moZgAd%g1o&Se8g?DUl(rc^vm7xUpSLKNQFN3m0z23B?+R z$3w*e*<-hIVm*Ce#Wi|FkAv5pbRDsb>6nWDhFq+&5J{PCnk!4G`SuTS^#B4)F`HLn zBh@-3GBZ%)+xECUVa6a}irKsr8%dwr%gn!Q?Qo;C$n-#h z*h!dE_M_tNVt@gs!Ke2WPk9&`)gx{zXK7FjjUDC#>5@D7(WZ4G#o~Yl#h52yewG7( z&*dE~J2hgP@+4r02wYgOfmKmG$2}*i>M*cDd11AO$%e-p?^y2hXM8uN0YVM6Y6st( z>W9fWIe?Awiu1u}|3XS#g#;>l0)qt!<(iwc837gCZytD&E)LgUDah=Gz))UH9i_zN zz@FexK{h+uaLeZ*ELdRvtx8W%(ozgBMT_u*bROSyO=;K-;u#Ml05IUhC;Vu&JV{G3 zJf=~;ECpGnVLsjmBnUWrZa4@l^BCbnHNH=s1^`OIV+HU0?cW`cAz0G{!ho9`0LTVF zCD`={G(55?rUhz9@UzSW0RRlRN&{p@8j`X>@Donn%~Dc*Oe6?R@b|?s06-%}N8hyJ zZR#|D1*SjnU(z`QD=is|b#5>g&1Av7d-rAnQn)WKrUR>^Isr8D0F7NB`9O@|;})01M1GQ;yP< zh%Vq4igLuFE&=J%tmOet{=&FF8rPHAX{6I-w`wk;ZRfgrQ+2P2DyFCXPr2KN5hZy) zq8|{`sN)Mtq-_4?nmVT9SR@WW=7Ga%`+XrwLD~6iB=7GItEyv3*>zmU;H?Krpw-RG z{wV|QJh2?iE3q7&F(L#gWLfbc<@2~7OT)Y@u^f^#=0JieN%k>HvFI*Z?=N3c2wSUi znD)lxYJX2l6ldupEzfU>N{jHLbbgwCO$$`MeDm;wK!t)W(@`(S5PtUHIr1yAG+FVw z6M2rbuTI06DyS2j4&de0)$2FXn?pFi3SPB%SJz@A};`8yP{(4H|j zv;DES9#BXtRSyRuMyH#H?h$I09r>5u>Hwt4%2f|W9(nPT3T+Y)EKr>Fh{WCwKn?YL z{T18kVMGY51EmX zyp^YENCEoDWaJcqO5A#0x`I~hZH4xPC|ovFGIm*+N^sATq%{|QFO~=LdB^S7~d3gGN!hVEsLqT4^{q(i~X)iQlh7kHeVR)!7|m;%_+3ypWnxwNP; z0>D~b(PeWk0$4MK+YwJEMQtfC=cjak9o7R1ONf1rTV(BX(AV)<{WFg zRC{%;ac@R_p2U5ve7fI$CFG6j^RW5|_)H#Fe=DEKyXw2@H+fY59sni{{0IMmBacON zMDtLhUp{Y7;;Tq_DAh0iZlY>C6KStTzE%`IN)i5p|KPv(56IzNT<~wenP`D4XCWPv zz8`3FiRS0m6-xi8itvetlQ69X>#u&yj;aKo$Y6m@&oBR-2@u}HnJL9N=7yRT--?`0 zyQQ|=rEaJu{IPG`-f_`IQeZxZOc(t+`@Y~8J^s!MSXst|(E3CkwfP#}@_mpK4<}t( zrXinxlp?-nM`R~D&Oa1mpRoBH7$xgUog=%KZ>o1#D}}Vy*~~7_8McQi3fYg6e);fk zDWGVw{n5_6DhVnq`i?>A05b=7H~EsQl8Uvmzm}4+mpXKWK7^SmxcfOd-hETIppyo8 z%9I8y$!N+qy>lMzMgS_fB>gn>y>>V|h9zM^+Vao4wV`Oz=99f?xeqLe29Ca&&f8KMKdUTln!Cc74& zqOEQZR!rfcoB6ZrcW3e}uB6cA)*mGu=I9>>NLK$Wb*wn- zM?wXae%yH`!3kHkwZO>dL_+V4v#ymS8AWx&sRU+yohbrAKcnI?WO@Ay0`xWhTs z>&xw>w+<&2)N@6hiU%E8;Y-dN`g2R{@s(bV7geY!hKKVzkTyU6F5X_j0_%2PvQ+hJ zP8!9jwZ7h0z52#P3r~ z^bW<5ej2p=^>?u;;_pAtHUFB8$$+8_!o?I#p`=qj`1|>1`9IIBSPiu+eyKJ2^<@VG zj$Hq7@A=0!HT_oMbECx{|D1w!Y5H6N;fU|2Tep)aExb@eZxuh+oBa6?OGv}cf1H~< zPsO-vmVWwd^w*b>i2LaT4C1q zPrcq|xpjvx>9V=6s&^P_sO$9Q#rN0WY2u%yyj=h9=XxA-^!;qgZBDA<=e}NfDyOTe)F6v z-G2M<*zNuGqT>BGb#wikE|%T9Gy8qj^XH%W0Kn7v$DjG!v6jt$Yrfw;zl^^0sjkWd zJ-b#B`R)9(Xkxs0$1hc%U;h-dz^LZe+d6-KquCp?-)HYZQ_e(d`+xtaPdtbBf7am{l4vcye^y9B3)*olvV!8cvHaxuWmvb9l zJr}NB`pK#R_Rr(qUH6|?XJQ0R<3IC(e|}r8|6XF-Hu*;wNHBdbx#Qq0S^H7K?wI;B z1fm|2e7UtEjIT;kEx_`abyc%A5uGUwI2bqr=}zanS{+NuMeDSt`s5Q`3#|e}8NH>+fQ0_2nc=i+Geo{m)Xn zj_Bz8ynbQqk7Hc(kE@M-Wv2i(%G2laQrD9z`(LROUDWp@0Km3f3H{r@CAr9=KkbIL zU$XX@Z>ky$04b{f?Q^Uc@;zz9jNSh~yKalO*!N5r{5@&JJm-(ITb<8idj}S6q|aej z`raNaoL7dpTCg&wjR$WxAV>{BZB|#1G@*NwidFJ21hR! z9{j0DF@nbXzwg5fPmEhu!;`iL#j^@j!dP+>>Hqh9w0}g#x}08zY(HEIKe9Y(+PYVt zbZOy;(Epze2^@ZD+&E;xfL)i*W$B2$ApXauB&BigxqIM^V;(rJeONuuG`1Skey)a} z?@O1WQ%lO@;IY?XwS4)HoIJWMZ?Z{pbLpX#XY8L3vS{Pqb8HxUUVE0!kSN3RW!Qv~ z|2k5GotmG^7L}8kuZjiYPL;j)vvNBe1{^g0e0v$q!($5SSYfB)VYlq-mz-C0yGPNn z_M*(PE(r?eednM@zvf+fg@?2DE9FvB_QE4)-}}(x=H8{Np+Vqo?K0Fz2}W(#^3J+< z7zNQttJ!h$oD%Xp6ML@*^!%rouv2cPujfUig3iXNEW0}+9(*hgY~2q#>C!@`sOoXt zFC|cf{Yf|}&olEBUjO>%FX5X1PYcXdbFW(hR!Up0V{Ui!$PhJ}x!%t&#Y>Pn z$GT@;+G^aE74`k?X9+H};18$a=&fQ|%ccaxUvOgY{IaiV!&tAbxbJ-KE95S%?+Pn_ zlyo@w4{Ppjoli!T!i}}cfyBHD+X-0_7IopO?=HGlj2*=@F?e?<7--#8H}1{DVb z$E|)ZY2Tjt)2GuluUt0<9M4cq4>)|aD1XU*lAUNdsmbqmj_)T6E8KG7XZ_>X3l4ry zyJYeLeDd?0k(O=m%+!|g#A}hLE4yuv_7ySv;Cjb~dv@Ax%qzXiL}a{uLZfo0d!r?*fF8vS*~oC>PlL+R?f z^L8&twV35jyA4Ej72>0jlCzgyfNpIGS;DN% z!GR)9Zv`I8_>I@oW+{dhQ-W*X9+S1_!!+1`A)&*G2@QY*Q%1Z&?xh$` zLMm%_9P@J~W4NG@W^7#1O$kan(_(!$uA|p;bjy=2%}PDq6)}yP0}Z`Gzxu=y`P;l0 zcgBJ9#lGm&l$4Eb|>XPNm*Zb84c4Cnl>qW-6MRtRB*D;)3> zWePLJ+DdNbr41){9a*P7IrK=-mFumJr6B9tbqxXQZhcX}(08fo%0|ivjT@eIMFomx zSt}mKg)PWb8C#Bg-epN3OPGB!LkD#i2_gfPT?=7V2S%2#?YG&rm*TdJ%BSj1{or7F z8E)p)O;jD)Cp~W!zkHj6$cSE}q6)HR)UAslWdl2b?`rB7ylj(9odP7Qdb8$gHCd~3 z+80BV?NaWYi(hh$w${`(k|CrV*Y_#}k$we9bl2H%D05uBu`xqHR~qsRGYh{cBC zS3wpB6q1I=;dlggz_RPxe3&dPP4Z-&h~V;^S`ADF?cG)HC;7cBO;P(Ix34#>qDhhTP1t-q;&<5-xQ)yqD_Ub@**aHH8vYFEw_CZbgyg z!;p5B_w!O?BwPd>J~VthXU5ViYL!Z{O8|x>k)&K;FJF2X zNQx<82nZLt$CD@Yp_-t1>!BZ4k;5)y)1b;$_CUr1fQALX9DQ+!qOjmq>ud3f@lZy;p6Qzv}xSQMf*(higB`dgR{dKJBG1=2*>{R)Qm$PK1BP{p1E_T2Lfvh znX=}1&NX_5dpo6WKtTLvrV5y(3*csI_SMxdeFFeMls`kk?B2bvLp7;B*qNvgcvba6 zEiDXP!UbzWIQ{g~Z2>wcej0t6<|5DXr0@09P10l~PGav~n|U(l3jIFLUSRkFCR5{ zOfjQPm+;L)$tPDEuDxp_dBPv6hLy^Wx4YfuF3C(m&h9AtOHDQ4j0=rtifWo!7#jay zn!SQlMaIT?`d_Yv*b_wCFRM$H_2i)G2yJ3Pabkv*P;%FSecH2~ zWu>U2jJc5g1fM|6&}Aku#Vx&=)EZrTgQWnH|LJYLoXE65gb%UKv=g16a|rM)oN@6V zo>87oWT#~?O*qMTlv0`n!+bUj*EI_UoUh|y3;_ZFuAyG&?TAR!2o+p*4lK1T!ULDx z63HC^Fvpc~q7tXUG{&11S{xPG2OeDcW8D(WdWO^dXhWWb3VwF>VI+p_)DCq9C6BHc zV*{B6Pbp?3g$FNNr9^fCz>p%?C~<77a1}>ehKp-@Bd}mAT@g;uPY5SndTG1om>;v~ zci*i5a!>Hv&QlZ?ylizXer(*`sMqUvpiS1S@(T20B7WfRT8GMG&_g3vNmUeN9@TWz zy`3RTcwu{Ji;bIU2Bwj!n{OU=8=|Lhvb^E3KZ=M(H?Nk6G<_c<*PW=UxVTosutRQj z)PBxs5n7Q~znH$RQHy(X#MDj353moDv4d|AjLfdoaTv8UbaUOep@>V+B+iD)(nXNU{31IwJam1S1* z%#U^(umEyT@Y~LVm6l7H#Wpo%e=o0~)3pV`MED($5uTxhKUK>7C`NA0b>QxP4oKdTD7@~bGBO&aThQ9ed z^$_B|3m(s5j@ODx*qW7lw0D-~^+dLt3E!#7WvDHw?)l>IbiE5elIHmU`?NH5thl0! zrmvOV3`;4%RG1kD6g;P4rJ?L;n^;3^wZ3}<-PnJUBsqH(qf0aAmCZwF&~PWdsc=03 zyLDSBQ3lugy((QCC@KFq^OKu(ZpHDgz1=>tMuVr+X+<;EN;M3tTXq`RCT6yaw~h*p ze1vYlRZu|Y94DXYI@Mf?It|kd`+X(7R6CzyTAQftVg(&&O)Czrc$-;Y!>~As+!Oq^ z^BE>@JUQz()~w>7a&X@1GyQi0K-Ql9`dtsmk-pg4bC^epev{8_ik$-h6w<4*9_Naf zk@v7vMM35fCS!YlLd$JlXSlaTbsf?*kP%?OwnymmBG?`*nGv_eel2pOFFNmz=0y3P zSJ+~j?7C_+ifpK{47i-Ub}Q5P5-&B|llKpdeXi30z^6ljQt;l**_MfMDZ{z;ZBw7@ z`FW*x48ni#AN-ff;nL3>!KI(ygiAjQ50eJ|ga6<^_z(WWFW^6c|Gx&{y^Mc0014JB zTRkkpDpE)SQr3jRb!>>JI+cCw#BXj(c(VzWvi~AWrnuExnH4anG>w}2zy;xtNbcI1 z2x2|nPcuuzHtHi&Y9Z<(n!A^c?e!mTDS24t5}0!uTE{={oTBsWRw)I~PG@83YL|zfWKG8d2;fJjY4|ou&11Gy{#fP^GwC^HeGzosq;*MO+Ls_5-vD;Rtx|% zQgQYVtCmx$BAh4Zv@Y1JGMD@rx4H#^1?El9i<{@|OQ%^^Gk*Xrirb1qcfi@*^88w| zOezzYMi_b;Z+xk5o?7tp97aR(H#1MJZ$fFt$szSJyJTXykn!$j>xz zty4`YS;CYRp{zA9jVd|SQwV_26#WTJ;2((r=TU2o1GFm%kF=zeHHMb4Z`;fQ)N#rH zqkL&|VC$$X>|vi+z?5c!piB#m^=5|2{WNEJ`<67F1wWRL@VK z0yjATq}T9%lgo`l=ZawzF6%FuR5C9m_)cux31EfkPHx{=FH9X8njwTNSTw6*SWt{{ zNHTN^kSVGic+#a9&B0akpgB1JS$XP56wEh&j;q@cAT&jPf)n`1w|n4mff6Vhm7T+< zqDw~Jnc=SxqOu(WjS6-|k%Ma|myNV$U++8}d z)xf2vuGky9Q6cS&l^|m{G{9J;#9ZgBYYc~u;js9&&L}(;fmmt0FTc5xEKP0e+Q9@C zB%W0=ti+@>D(=(M?tN5>;v}2@=5^ZXbsZCUSuMKh70TcLgqRKjaB=&Xyk0<2hj^b%XVF!Al zDf$zhz(2kW@tyt2rujpX8G^v|c!esJ>!}aI0)S3a26zW%u-q?k#^L~g4a#3-c0srI zsN$Ulkf<$I*qK+UC9?}MqM~&w0v~#vVAE#ii@!D*feca2?YLL2A4`9vX!kxUWhXT9 z-qhP{kv&y)V4*oH^hWF?8{ef)18{du&+j!;r}u0u)|nvetQY{6*)kTZOfY)JGQc}< z3`}c3o%7~eEt_9-^iDm~DW(GoOwpgV3H;*+r;%9(O_*{ZAR7R)flco~!IF$;#7XEh zWq@};fyU_(KLE|V0`g`V&NRZ8r6BW+$R0uKR0KYohZKk6q9)ztD3-?NT?xU!oeg|)* z(R(btiG9LPsA3`Lya~lQiA{WeyOAstSxKDtFdmy(>i7_vqCYJY_{X!%dTF(a?_c#q z_2h9h5(gl00MvT#Sxm-sLO&o|(3GQ$&V1ZwG<`2a$!PBFd)H{P`1pPy8Y#a)=Zg3b zwOFx|u~=h*(Re=pXM7NLmj99*{nPKnbU=QkPA0WiaEktfCh(8=RvQ@1Sunokmeeo$1%K?B=(5!vd-u$P^k#_I%e`l7WwGErPK1;$60cvSx z&)EGVmhnMC3oJL^$~QJvOLM!XHjR{R>ShDUdC_P&e#ZXB164c$W>r*Lp4r=?zH;rQ6UnqU2PMAuUt%Cp>|F007fsQ`Orz zDJ{g!8M)KQJhb3S6c(Mg7b1@TnfcnM3{U`y=9}w>7-waLGK%HpGhOSJeN{;b0HBeE z_whT0Fa=^fbQ@ZxA`nPcw*4%F%2HSi)33R4$NJCopxp~F)jbAp<|n>UeICu-*9yv; z>B*v^yqR8sD$0ZDVVy_%Z>z{7E%4txS1-YowX~BI!%_?*V%WWVtAB{95}+ARpe@3r z89cTvIpk(6us+iHP(caVE{@Z#89?WOYttdeWqrSkY!yrs4lbPV)9fdiR;$eQQDgfJ zacOksjYu!YhnB<3*c?St=3loOgR*|`&aZP%)HNC50u|xgVZ1>#`LQnO_*EQ4) zweMUfm|5WB`_+247TbJz0}i|dokjq|7Q!3wuq}xJTL%RDe_6$XdO+uaYtx=%tAP|{ zXA-5qA+07K|L0LjF-?$5qcd+rp0t=F?y4{!eyVYi*ihoc2xKPU)mofr=y1Pvh~q=b zqbm=c(;l6AB&n<38$(-!cAOgq=6%c*3L8qsq^?9CjtBO}qra|Ul zxX$;B$Z<7RmsSAp(eftdRUika4Il@djl~hS1uky?Y^lG#kRw#XYH04V?P=P`c|@JM zKjl@9>3eC9=3WP5w*nvAZ?rS32)A&I9C@hIWIOiJX4DLk4>!Vcm*pAw3@?)IdaxWq zHK^@vDDu$6AmS2($TsQZ@)wCoK~CuBBs`jMM0#S>Y|Nw)bSsF2A-7?q$Pm4?b9QZo zq{Gy5;<*evxt@_f@G)paxevA^-dn3)!pz1e}>b1^4jZykCF zj-KV?9o+P(YM~nAZ68j)iV7Zf^FFtHOg`?H|8;|J_W!?W;%>Gw5nP^Ase$Q;ojXV7NbyYb z7K!@2e9bWF#>o(ydFBUut1d3)WPzDq;MVIkn%1N;1wEhBTIXbf#U&yVNg~`i_S(7Q z?jDDC;YiV>Zn))1wewYiT>#um0?`nbTYoyoPIzTjWxTAq!EWT`0fU1p_4kbwo{Stx zzGmND_t3r9>rq;R$`pKbIC?qwCCPL_fko|5!?U=bROPdgzOVPi_gZA<05Ldi92hzq zjJQqD@4s2OeUS7b&`8(I_v&0bN-c0I_@lZ1B`})EKf_9}J3DD(xJ9`4mxT4sPgq!P zdDuz5&b!F8LDCcT%ARDl2pZ}8_^aLHi5(h5Tw)N}crQU3WO^7in+a(I+zKZca+^*l z5a~rbh8~(`kJ8&@hOpOqziP=vg+YWM7K9NeTqb5Frq>1%`7X;d*gXP0G+smfP-_$# zrQtfcD9p@cn7CfS;k-}gG~kq!aIAqG%wq=&rg_Gc0JMg(7AEI48i3qHy#q_ zvKKYWuEy+N)$AqjhDKg%_!gnJ;p<+buDCizANc7KO~K{F|ANu-u{ZAC$gqov_8Yk* zm~^WoM$ipJfen_E#vNpxr;&t$LIqAEcZ(9KoFg=DaAz;_$Mn3i`t;9NKUUo7wZqAa z9Y`*w?q#ZtMAZk3dE4n5fsN8}74AmZ9Ll+=&Ixe`GQ?Tweq=+OpXbQ95J^=LhH0!X zp_i z`X1pB4Pj^No6-y!8v}N)vs*fp+NS`Jl!CnM$i6&k0@5W{Wp{Vi#IyqH1mB}Bj(}9D{>tIO1mGivt4FN8U+j58ss z3NRM0XPkHmI){*6N_6B9i1w!IznowF8LwPj2Z*@DAhMCj^e}2R6UvC5mC>yU47m*> z%@SP64xOu_df;U1)dOK-gq0w+nEZ<<3?Y`Onu+PP={XrBX7RH;rjg#9S2o3rz;)VO zIqUwn6@F4o$S_gTwR^rtRyE}Lz$Qt)?166dokKa50RW0N3Kr2Tx3==c7yRaxnZ(C| zX_PPPRu)$lEtcGYlMV@2hN3Y&f2YG*gAHc>*&y5)jUF5EeVqJj zj?lQlg>JL%C79jNU$*BU!+`@{>_C!Ia9`m>vlz4O@eBRx?V4i0Y+ppjqlQ+q;G$GteKp;uSGG&AA@_Ov^{ z?T^J-cKs4>IiEKkYdF%MX_P)+k7R8&PqPy;00NQj9pROKQe2PN#o6J^>8IN0fRVnHXLzV*%)kyFZxaGlj083&_J%`<@pY-eII$hWm5G9W64@t05A5W zv-BglnJ1`BVn8-OTly$0 zToEJG5;BP0#r|Fth7fDvXJUG7dTtLAvv^q^Y?SBa4qx&me`w&s_fBNzfY6g7LWYSO zAXD`2zwzlL10CkZ-W9j9gB8uPzBJG-${@UF*ETnA(QlMD+N=*85!QV!G^6HHaWdx; zy_UK!sY`N$&Gm_$E{Xyhs&IRfJbXPR|G z{~q;Xzic!Mx4qbbq}^S^H^I?34L&(}`8AFh?#4~71Kb>nx~H0xq`C|VybZHHaxB8^ zz&dTlcJ)w^q&W=u`J_f&M2)zHx}nw)ktlBw9=z0y$68U};8nY%sD$#eBgcxE5l{-| zDKyTopG2e|AS6qemmT{4G02_GZ-~HqfjtWh_cFWwngkYH@MkI8+g=mZYNaj##Nf06 zD1xE0!HC<`S>P=*J!!YT_=P|tw+^RDK`(`f%O6BG0c3hFc?h~C`4dF?Sjrwbt_V2U z+IqkPCdCNXI3ggnnDUD#3?Y`Onu+PP{S74YEBNv)!sVec=Yjr7OvESfq<96j0Zd8q zH}}1dNHnGgRPc0^<5muyDIbx*P`+s!);nAo8i`HcP4jm;hyoj*t3jwfGIFe0IQiBbfpLTL1ib@2JxZ)2Qw>kf z=3lrjlIjwIyD`tFL(huJ;Z>@8p+R@v>Lb!>F&5?zA# z2Nj}Uy9jw}_3+Q~+aT#x6qo22D*EOQ(^`}Ynnv!H+m@o2>IZIn*{>CT41SZ6J|=Df<~GoTVKO+4?SKirEWmk6Voes;^ zl$djg-dpE0_|TO9btfrb_jiA69=t)KDa1Y~nzYu6DckhCKak<}6Ysox6T>c|H?Qra z!K7;?vC}~m*mw#@9OkM_!mIL1H86?XeX^EtJmk2+0hk%70(s8`XrxrtOL?-B@M!#l zLp9opLseLs0|+l$V6K+3WeX6B(Uo?js_aBWIKr-!3`O`7Iv>4T(| z>=_RFw{0}3qrw6O|K0k zlCt>^4&If2G*K+@q>$hSSY;@A+NM&7k>Q#yAAV&EW58j5S5+>TNg3X?@0|5y(<`L) zCXNql9^){z45*E5SK>LBC{`HCbylZ0vEN`f5@>E72uGqR#6CF5>%1}|a$@9F`rVuB zJBHQ}=hAo1c(&__oepb_HcsvDs>$W3Euqy6_#*%iPXkkk19_uVAn&<=At0O=Q^ACo z-l-bx#o_mySd+2LwGI2@osi9S}u zL)n*6C$No`xjR`ag|bcIfNmnNV$#5W{zyrxw0*BuTMf(6hll>Qn zPArDoe3&=MPo@|4Lbru7!0-2>2Z(+yTtfa3N83`0hVAWyf*QmiMf3Zyki9;rJ`2<~ zxVu11WBr+f?$6m7aB?~Q@rXs~Ivnh38Be$QLP<~!YQTul`Y8SR`SS;3VT0IFxm*Ih zNywLCq7w?cSZf{NXR`kS(TRmaBr^rm2DpAN06_F}VevK3-@P_xJh-BudND)Xx2~fE z{f-cW6fL}<`z!&mwjscBo$r`AD2b@{G5%lw{gm0x28{@nm~ybNLH3%--6Gl~ z0G3c(zaWnTe#ZU+lvwoa-T;)D&<4!ji(o+Px!fcV!wegT8sj2|MyTLtXD|2P$U%xG zq5CWWv9=+=+7|i8z@m+`gD6R-K`xC@L(JBP0TwotyaLf{CU=WylK@ykDe!4L4)_`S z3s7Rw_GRPa2T*1TrVZdvL3}{$xfpoV>}&PFhb=BY{d7BqwgI%$umCw^!6Y8~EMjd# zfLs@+ZxLXlJZrOal9?d*X@nXgfQ60sOZ1w_-7bhW34kS(fX4wpV}AikEO+q)Z2>fDZVPDu5qmD=>Tw6TnuFkq z4<*a4W?AnJ5Cu17Ns`%H!R7?nXL+nx+xXF)!Z%HyV#*G>T3vPZ3=XTJ<;W~@ieB1;S63KPrq@&sJY`I*8f&Xi zMSnSjJ}1oWN(TS+8Wnzz1xm-1lOOa1oyD0G0oNKwu-YSeX_fJ~NpmuTM24gtb^qtI z@_+pP+j3F19eR}~I%}HaCpHHslAW2oQ9m;4=FX~ka9L0;q^?HnCAN8-TwzF=rx466 zDx|8_Kqaxi(yIUX;m3Yx5q`VV1@$-md6-V1+mSTz+Z49WK1L`SAqnF)4!Jm($pi6I zdBx1xQGSBDr0qZ|JZnhG^%osAU&}?e-<0|0hf)PcZK5gJ%r%lo*%q(K`G=B)M~R_~ zq8B>0itAUQ7Hc`lASSg*`+O$Wz}+O4-X0(nwGfZ8Yi&WlAWiikyIAYa(YV!0M_}R@ zCE*UjCRG!e#@MlnqUD=mTxMs~fA9sp-cfx3uVP_irNRPj`Y@LutCWH}e7J5^NL_Ji zcfiW?Z*OGvV@ZdaU8I+Y?CIFb+Ll9amT|VGMlhJiSoMfULhY1QCiOsRH}*Ht3pF=UNRw*Lce9@5g;u6GLwK>tZzhiE>Uyf7 zGAT{caIeEAyE)Iwe0zc+&~TxosKs_tc8A-}cMVb9jP{vrL)6sTQw`V&iHI_FLRraE znos3rBOikGMJ+Aj*7xWJR4TR=s9K9xxLcepN^+D?WhLA&M@UBwN}-9dc(YFv*EkBe0VRtwm;QB@wIqwdm7#S()E$RxbkEvQGVs_DGu~)N;`=Ts}$BBsD+t{&8eIwnd*sUomnl%RTL_ura zcl(k&5WatIiVE)yuVxDBE zf;&=B4>;iXC~9GdnK5L@*Lh;5{Nj_vRp+uH9WaDAsCLBzld6HoEwN4gH6yO94ANpR z-LLwF=JXCTSj$F@}VMzI-GL~?Z&3$qV^01QC1dlt%r zzU=9v;ZIp(*W_R~Cx(dausH!BH1gO+Q|^r(kAg)SP@7m&^_w3$806ER(2JzG%hMTIg`nK5KBUzZ&@?};uy%4fD=1q2FcPu38>=yQR2)rGmz zf4xs{28S9kPoTwmzi(g4g|wHjow`A+;7a|5@WJ+6U$=L?{QMIHV4QGq%nJyWf%=vz z?@nmGAN6X$^s0JJL%BWaj2NO^V;nb8G$+@dyWnLq$rC=@h*B_Z%mrzbpI&!T&Xa1* z{aGu1Y$-^1Y$7v~{7%@f1KUn~SI?InHTN1r9FHj{Kgb$5kEh26z7f^@%v3e)rhF5< zV9Jebyj7hDGw)`vIzW!yfOHE`XA6L7q4Z|1y7|GKN26U>FQ z|H)x)-iKq4a2|c-h=s$3>I&ZMB%`*w9Mr|Ln9GX(3yCo^>reE;em)y(@~3n&qhOZ` z6Evl#z1J##xPZZ>z@ZUkbShIHNJn+*8*(4aHMCLe}* zzYV&ZVJNh2r0@|}JLQ*I2LL)8mlWWiXoOxj(4UC*9upZVJnUS!QMiG-Ce0UhmubKHx&yvu(R!5Y=>3=EnH3t(f7TeH{Yu2!yId zAw>Af*T}5(s5irQqBfG25njbOg|@w>w9xev28o*@kQE*-u^bz!IEoh zrE{F24DCw6Lnzjpb%_;2Pb)Le?UnAqbXj`Su4)kMe9v~HQ&3fceAdqudkEN^N$Z9j z9KVC7)-snGq@B~n35U5p`(^@apAK7;7Y0_mla3ahVQn(tPz)m{?$^L=-(&XZ=D~_V z&xRC|7*90)Jazp;b5DF&eoI3H)trzv8E{Hn+)MrYSWogQKU8?WbHQBA{Ps>q8S=QNxF+VL+fLzq*!11J`1;CX z9?z3S3O4ix=mimO$F_7c27RlOSmSWE`G?7KOoEVzAam2vPwP0BDz0r>(@%j^va7W~ zkiTT=c||ezr{U?`9kl~;mEQ&##%*mCq+dWH(9!x{*NzO_3vov`-MG9cGm9Z37dTIR z%D;p`qWV44L4(yn3H;D;)X`YnUF~sgiKBgCcYN#6^#=v?yfW!Lkd6Jx7@obYaS&eF z%o-@Tl+s>vt{IL6^p?KPGc{lf0g$+%uck<JHGW zbhCD;G+&c3o-DcG4j-yp5t|{Z(T)#_-{KkCKkQ z3z&HuXWeEaEq5`YxYR>N?)zclQu3k~6p*{QScx>zVU_>%jf-?iCLxlMbwa$9&*}5< z57U{(NcWjVCB|XG94)RV0B_-L+i#^pEKE2i-dt97Eu+*$N-fbT6_LzB!>_^$Q^e1u z zo7WB?J~)I>U&3$eYshl3CB|m;_^O#%44EJ>pO4i0 zSy5Ed(Jf5hl(k*yKzOoZWHmVN`HZBL5>Yn0&s&WS-Ozdj%@*#c+wfMpB+($1H)vVi z8M<$?_R$eiae}O@?Lrs;NpR^=+5Vk~YQJ_lPzcqRK8P1r!Nc62e6l=Fx-auGGxKd! z!lZ%!;J-ix{|Ws6U-0qi|AG(xdtWXU{ML47*@&VW(R5>q?>sUrEa_Ml&?1M|i;}D8 zE~5K?g<-6#vhIKVq}*pf#p)X;K{vDQ@VNO_TKks&G`V)bM_<9U(5fa5;ye$0c1 z0S3KX^U-artpW*s^D|3esjk&kC3&+K$5fbt^%IHn1%a>PsUj$t~|T_zT7>42&N14~wm z?eX9{`up5M!IN@GgdZu_z7Uz~XlRbwd=4ZiAVpPfq0`3abqph|QrBDRg=HB7viZ+V z?D}O-Y84Cr<*v@n_`;TI2`j|ip6iRF(r$gSs@zx_@HY5Q;Qv4H;W<2^k6F%Q2DQ&RGP{3L>#13%GZCM74=q{#~~qG2&OskL6d z;czT!=)LQfk}IV z?T}FoH)CD(0Ru%ii1Yvy%Zj>hJaeTL2+%(Y}m2xgs|Zagd;G28zj0TGoGN&1e&`EA7@YSx8@zP}Xr7 zf<#0pjSiaFvOBUx8&3gK?GOMB5D+s9R=q;n4$&c@I5~6*_JCcg#)ub@7cHYrX7h`^ z#Cxj2sJ9at*@p&#K*-Xb*+inP4IjQLVr--92oP_1Yb}?B^fieU^(JvATn~nlco3~x zQ&IxR5Vb=MNEm^I(E79r^TbBJ@8#1-xu@Fw$ELW-{rajf5bFa`Gm4ht1YJEqNQcqL z;L(<90RPHx0}w*u0kmdqS-EKAsnT+yX;g8KW!JoydDx?)Et@F{o^RYZ>$EgLC5+}r5wMAv0h zMMt>mbJ8w>g<*uN8<(*eQ9fT_}X`jq6G;wlZ!2dSu5;_wF_{3`=ZTm&sj*;n{?dWK}V2>_5)<)Sl6XGx)`O^RPuZJ0Am%`Z}-;Stw+i zOv^Hw!xc1A>Z$T95k3=fXyn;X?p1doY*0RhF8u6r&GU&`+7w|+;^M(DGQPO`#~ysX z3a<9jZ_)KxkdsV*qM?GzJvFpnwCYl;* z_gpur3NWC82S=JF!5lGYW>7R~zAJnzM#G`5;i|M=A?*xSOF=9(wr8QoGfgT$lSYG= zW>uOCa83FS>5GT4aM*ZPJ%Hf5A7i@BwJer&kZcq@hp^u3Dq10vvL-ljRyu3DJiLwf zU+lfpoAKXSEqt_KnfWQa=TGI8h&Ug=_XeMqV=!lSln92&J$I!6ey- ZPfE?oTlHIB9%;Fk{)7MEKltzM4-95iK864Q literal 0 HcmV?d00001 diff --git a/pages/topics-and-events/assets/scaleway-topics-create-topic.webp b/pages/topics-and-events/assets/scaleway-topics-create-topic.webp new file mode 100644 index 0000000000000000000000000000000000000000..7596cd2e1536081066660d43cc2a890f63d9197e GIT binary patch literal 44744 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 literal 0 HcmV?d00001 diff --git a/pages/topics-and-events/concepts.mdx b/pages/topics-and-events/concepts.mdx new file mode 100644 index 0000000000..4cbee27ce6 --- /dev/null +++ b/pages/topics-and-events/concepts.mdx @@ -0,0 +1,183 @@ +--- +meta: + title: NATS, Queues, and Topics and Events - Concepts + description: Understand the core concepts of Scaleway NATS, Queues, and Topics and Events. Explore fundamental principles for efficient message handling and service optimization. +content: + h1: NATS, Queues, and Topics and Events - Concepts + paragraph: Understand the core concepts of Scaleway NATS, Queues, and Topics and Events. Explore fundamental principles for efficient message handling and service optimization. +categories: + - +tags: messaging queuing concepts nats queues topics events +dates: + validation: 2024-10-18 + posted: 2023-01-04 +--- + +## Content-based + +Content-based messaging systems are a subset of the [publish/subscribe](#publishsubscribe) model, and contrast with [topic-based](#topic-based) systems in terms of the way messages are [filtered](#filtering)/routed. In a content-based messaging system, the subscriber specifies the properties of the messages they want to receive, based on the message's attributes or content. Message delivery is therefore selective, and messages are only delivered to a subscriber if the attributes or content match the constraints they set. + +## Content-based deduplication + +Content-based deduplication is a setting available for [FIFO](#fifo) queues. Enable content-based deduplication if the message body is guaranteed to be unique for each message. A unique hash value is generated from the body of each message, which is used as its deduplication ID. This avoids the need to set a deduplication ID when sending messages. Read more in our dedicated documentation on [creating queues](/messaging/how-to/create-manage-queues/). + +## Credentials + +Credentials give services and platforms access to Scaleway NATS, Queues, and Topics and Events, enabling them to connect to the host system. Credentials are product-specific: for **Queues** and **Topics ad Events**, different levels of permissions can be defined to write, read, or manage queues/topics. NATS credentials give full read-write-manage access. Refer to our [additional content](/messaging/reference-content/) for more information. + +## Dead-letter queue + +A **D**ead-**l**etter **q**ueue (DLQ), or **undelivered-message queue**, receives and holds messages that cannot be delivered to their destination queues. A DLQ must be of the same type (FIFO or Standard), in the same Project and in the same region as the queue(s) it serves. Each DLQ also has an associated parameter: [maximum receive count](#maximum-receive-count). A single queue can serve as dead-letter queue to multiple source queues. + +If you designate a queue as a DLQ and its [storage quota](/organizations-and-projects/additional-content/organization-quotas/#queues) is reached, messages won't be redriven to the DLQ until enough free space is available again. If your DLQ is at its full quota, free up space by receiving and deleting messages from any queue in your Project. + +## Fanout + +Fanout is a type of messaging pattern. A fanout exchange broadcasts messages to all queues/consumers it is aware of. This allows the same published message to be consumed by different consumers, who will process it in different ways. Each message is processed in the order in which it arrives. + +## FIFO + +FIFO stands for **F**irst **I**n **F**irst **O**ut, and represents a type of queue or topic where the exact order of messages is preserved, and duplicate messages are not tolerated. As well as these specificities, FIFO queues and topics support all the same features as the [Standard](#standard) type. Consider using FIFO queues and topics for any use cases where the order of messages is critical, such as e-commerce order management systems, systems where one action should not happen until another has been completed, or first-come-first-served ticketing systems. + +## Filtering + +In a [topic-based](#topic-based) system, where topics handle the logic, filtering is similar to routing. Messages are sent to defined topics, which can be thought of as filters in so far as subscribers can subscribe only to the topics they are interested in. In a [content-based](#content-based) system, filtering is carried out more directly by subscribers, who define filters for messages based on the content/attributes they want to receive. + +## Long Polling + +Long polling is a technology where the client requests information from the server without expecting an immediate response. For [Queues](#queues), this enables clients to wait for the system to get messages that are not immediately available. + +## Message broker + +A message broker is a piece of software that allows applications, systems and services to communicate with each other and send/receive data. It facilitates the exchange of information by receiving messages from a producer, and transmitting them to a consumer. All communication with producers and consumers uses a [protocol](#messaging-protocol). There are two basic models of communication for message brokers: [publish/subscribe](#publishsubscribe) and [queuing](#queuing). + +## Maximum receive count + +The maximum receive count is a setting that can be configured for a [dead-letter queue](#dead-letter-queue). It defines how many times a message can be received by consumers from the source queue before being moved to the dead-letter queue. This value must be between 1 and 1,000. + +## Message retention period + +The message retention period is a setting that can be configured for a queue. It represents the length of time (in seconds) that messages are kept in the queue before being deleted. Setting a longer message retention period allows for a longer interval between a message being sent and it being received. Read more in our dedicated documentation on [creating queues](/messaging/how-to/create-manage-queues/). + +## Messaging and Queuing + +Previously, Scaleway Messaging and Queuing was a single product that grouped together three different messaging protocols. It has now been split into three distinct products: [NATS](#nats), [Queues](#queues), and [Topics and Events](#topics-and-events). + +## Messaging protocol + +A messaging protocol defines a structured way for users / platforms / services / applications to exchange data and messages, even if normally they do not "speak the same language". Protocols also describe how messages should be processed, prioritized, managed and routed. Scaleway NATS is based on the [NATS](#nats) protocol, Queues on the [SQS](#sqs) protocol, and Topics and Events on the [SNS](#sns) protocol. + +## NATS + +The **N**eural **A**utonomic **T**ransport **S**ystem, or [NATS](https://nats.io/), is an open-source messaging system written in Go. It is part of the Cloud Native Computing Foundation (CNCF) and has more than 40 client language implementations. The application has been designed with performance, scalability, and ease of use in mind. + +Check our our [NATS quickstart](/messaging/quickstart/#quickstart-for-nats) to get started with Scaleway NATS, or our [tutorial](/tutorials/large-messages/) on creating a serverless architecture to process large messages with NATS, to get an idea of how to go further. + +## NATS account + +A NATS account sets a scope for any NATS credentials, messages, queues and streams held within it. You can create one or multiple NATS accounts with Scaleway NATS. + +## Protocol + +See [messaging protocol](#messaging-protocol). + +## Publish/Subscribe + +Also known as "pub/sub", the publish/subscribe model provides a pattern or framework for the exchange of messages between publishers and subscribers. It contrasts with the [queuing](#queuing) model. The key feature of publish/subscribe is that messages are not sent to defined recipients. Instead, subscribers define the types of message they are interested in, and only receive messages matching their criteria. The publisher sends the message without knowing exactly who will receive it. The process of selecting which messages to receive is called [filtering](#filtering), which can be [topic-based](#topic-based) or [content-based](#content-based). The publish/subscribe model relies on a [message broker](#message-broker) to relay messages between publishers and subscribers. + +## Queue + +Creating a queue with [Scaleway Queues](#queue) facilitates asynchronous communication between different microservices, applications, and platforms. You can create a queue, configure its delivery and message parameters, and then start sending messages to it. Messages are stored in the queue until they are processed and delivered, and deleted once consumed. [Read more about creating and configuring queues](/messaging/how-to/create-manage-queues/), or check our [tutorial on creating a serverless scraping architecture using a queue](/tutorials/create-serverless-scraping/) to get an idea of what you can do with message queues. + +## Queues + +Scaleway Queues is a product for creating managed messaging queues based on the [SQS](#sqs) protocol. Previously, it was part of the Messaging and Queuing product. + +## Queue types + +When creating queues with Scaleway Queues, two queue types are available. [Standard](#standard) queues provide at-least-once delivery, while [FIFO](#fifo) queues offer first-in-first-out delivery, and (unlike Standard queues) guarantee that messages are delivered in order and without duplication. [Content-based deduplication](#content-based-deduplication) is only available for FIFO queue types. Find out more about creating queues with our [dedicated documentation](/messaging/how-to/create-manage-queues/). + +## Queuing + +The message queuing model provides a pattern or framework for sending messages, which contrasts with the [publish/subscribe](#publishsubscribe) model. Queuing is a form of asynchronous service-to-service communication. Whereas with the publish/subscribe model multiple subscribers can receive each message, with the queuing model, messages have just one destination. Messages are stored in the queue until they are processed and delivered, and they are deleted once consumed. This model is used in serverless and microservices architectures. + +## Queue volume + +Queue volume is one of the factors affecting the billing of Scaleway Queues. Queue volume is calculated as the number of messages in a queue, multiplied by the message size. Or, the sum of the size of all messages in a queue. + +## Region + +NATS, Queues, and Topics and Events are available in multiple regions. A region designates the geographical area where the service is hosted. Refer to the [product availability table](/account/reference-content/products-availability/) to check which regions are available for NATS, Queues, and Topics and Events. + +When [creating a NATS account](/messaging/how-to/get-started/#how-to-create-a-nats-account) or creating queues or topics, you need to do this on a region-by-region basis. The region drop-down in the console allows you to switch between available regions. + +## Routing + +In [topic-based](#topic-based) messaging, topics allow messages to be routed to the correct subscribers. Topics act as labels for each message, and the broker routes messages to subscribers who match the topic. + +## SNS + +The Scaleway **Topics and Events** product is based on the SNS protocol. **S**imple **N**otification **S**ervice, or SNS, is a [publish/subscribe](#publishsubscribe) notification service for the mass delivery of messages. SNS acts as a single message bus that can be sent to a variety of devices and platforms through a single code interface. It is also possible to adapt message formats to the particular needs of each platform. + +## SQS + +The Scaleway **Queues** product is based on the SNS protocol. **S**imple **Q**ueue **S**ervice, or SQS, is a distributed message [queuing](#queuing) service that supports programmatic sending of messages via web service applications. + +## Standard + +Standard-type queues and topics represent the default queue/topic type, and offer an at-least-once message delivery system. Unlike [FIFO](#fifo) queues and topics, standard queues provide only best-effort attempts to deliver messages in order. At-least-once delivery means that it is possible under rare circumstances that the same message may be received more than once. + +## Stream + +Distinct from traditional message brokers where messages are deleted once received/consumed, streams retain records of their events. A streaming broker is therefore often likened to a distributed append-only logs file, where every new message is added at the end of the persistent log. Each message can be delivered to one or more consumers. + +## Stream volume + +Stream volume is one of the factors affecting the billing of Scaleway NATS. Stream volume is calculated as the number of messages in a stream, multiplied by the message size. Or, the sum of the size of all messages in a stream. + +## Stream persistence + +Stream persistence is one of the factors affecting the billing of Scaleway NATS. Stream persistence is calculated as the total amount stored in a stream, multiplied by the duration it is stored for. + +## Subscriber + +In [publish/subscribe](#publishsubscribe) systems such as [Topics and Events](#topics-and-events), a subscriber is the entity (e.g. a queue, function, or URL) that messages from topics are pushed to. Subscribers can filter messages based on their topic or content. + +## Subscription + +A subscription is a connection between a client or endpoint, and a topic. By creating a subscription, the subscribed endpoint receives messages and notifications published to the topic. You can [create subscriptions](/messaging/how-to/create-manage-subscriptions/) for HTTP/S endpoints, Scaleway queues, and Scaleway Serverless [Functions](/serverless-functions/quickstart/) and [Containers](/serverless-containers/quickstart/). + +## Subscription protocols and endpoints + +A subscription protocol refers to the communication method used to deliver messages to a subscriber. Different types of subscriber require different protocols. When you create a new subscription to a topic with Scaleway Topics and Events, the following options are available: + +| Protocol | Endpoint / Client | Note | +|-------------------------------------|--------------------------------------------------|-----------------------------------| +| HTTP | The URL of a service or web server that can receive notifications (HTTP POST requests) from Topics and Events, e.g. `http://example.fr` | - For security reasons, we recommend using the HTTPS protocol rather than HTTP.
- HTTP subscriptions must be [confirmed](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription) after creation | +| HTTPS | The URL of a service or web server that can receive notifications (HTTPS POST requests) from Topics and Events, e.g. `https://example.fr` | - HTTPS subscriptions must be [confirmed](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription) after creation | +| Serverless Functions and Containers | A Scaleway Serverless [Function](/serverless-functions/quickstart/) or [Container](/serverless-containers/quickstart/)
| - It must have a [public](/serverless-functions/concepts/#privacy-policy) privacy policy
- It must be in a [namespace](/serverless-functions/concepts/#namespace) from the same [Project](/organizations-and-projects/concepts/#project) and [region](#region) as the topic | +| Queues | A Scaleway [queue](#queue)
| - It must be in the same [Project](/organizations-and-projects/concepts/#project) and [region](#region) as the topic | + +## Topic + +A topic is a communication channel used to send messages and notifications to subscribed endpoints or clients. Publishers send messages to topics, and those messages are received by subscribers. Subscribers can include Serverless Functions, Scaleway queues and HTTP/HTTPS endpoints. As such, topics decouple the publishing and the receiving of messages, allowing for flexibility and scalabilty in building loosely-coupled systems. + +## Topic types + +When creating topics with Scaleway Topics and Events, two topic types are available. [Standard](#standard) topics provide at-least-once delivery, while [FIFO](#fifo) topics offer first-in-first-out delivery, and (unlike Standard topics) guarantee that messages are delivered in order and without duplication. [Content-based deduplication](#content-based-deduplication) is only available for FIFO topic types. Find out more about creating topics with our [dedicated documentation](/messaging/how-to/create-manage-topics/). + +## Topic-based + +Topic-based messaging systems are a subset of the [publish/subscribe](#publishsubscribe) model, and contrast with [content-based](#content-based) systems. In a topic-based system, messages are published to "topics" or named logical channels. See [topic](#topic) for more information. + +## Topic volume + +Topic volume is one of the factors affecting the billing of Scaleway Topics and Events. Topic volume is calculated as the total sum of the sizes of all messages sent from a topic to its subscriptions. + +## Topics and Events + +Scaleway Topics and Events is a product for creating managed messaging topics based on the [SNS](#sns) protocol. Previously, it was part of the Messaging and Queuing product. + +## Visibility timeout + +Visibility timeout is a setting that can be configured for a Scaleway queue. It represents the length of time (in seconds) during which, after a message is received, the queue hides it, so it cannot be received again by the same or other consumers. This is useful as the queue itself does not automatically delete messages once they are received, and so prevents consumers from receiving the same message many times before they have finished processing it. Read more in our dedicated documentation on [creating queues](/messaging/how-to/create-manage-queues/). diff --git a/pages/topics-and-events/faq.mdx b/pages/topics-and-events/faq.mdx new file mode 100644 index 0000000000..29fdf41f40 --- /dev/null +++ b/pages/topics-and-events/faq.mdx @@ -0,0 +1,46 @@ +--- +meta: + title: NATS, Queues, and Topics and Events FAQ + description: Discover Scaleway NATS, Queues, and Topics and Events, and get answers to common questions about the different protocols available, compatibility with various services, and billing. +content: + h1: Messaging and Queuing FAQ +dates: + validation: 2024-12-04 +category: serverless +productIcon: NatsProductIcon +--- + +## What is NATS, Queues, and Topics and Events? + +These are three distinct managed message broker tools offered by Scaleway, based on the NATS, SQS and SNS protocols respectively. Previously, these products were grouped together as 'Messaging and Queuing', but have now become three separate products in their own right. + +## What are NATS, SNS and SQS? + +NATS, SNS and SQS are all messaging protocols used by the Scaleway NATS, Queues, and Topics and Events products. You can find out more about these protocols, and other essential concepts, on our dedicated [concepts page](/messaging/concepts/). + +## Is the Scaleway Queues gateway compatible with my application, framework or tool? + +We currently implement the API endpoints listed [here](/messaging/reference-content/sqs-support/), which makes Scaleway Queues compatible with the AWS SDK as well as many other tools and frameworks including KEDA and Symfony. Note that you need to specify both Regions and URL to ensure compatibility. + +## Does Scaleway Topics and Events support all SNS features? + +The following subscriber types are supported: +- HTTP/S clients +- Serverless Functions and Containers +- Scaleway Queues queues + +For more details on supported and unsupported Topics and Events features, see our [dedicated page](/messaging/reference-content/sns-support/). + +## Can I configure Scaleway NATS via Terraform/OpenTofu? + +Yes, check out our [tutorial](https://registry.terraform.io/providers/scaleway/scaleway/latest/docs/guides/mnq_with_nats_terraform_provider) on how to configure Scaleway NATS with the Terraform/OpenTofu [NATS Jetstream provider](https://registry.terraform.io/providers/nats-io/jetstream/latest/docs). + +## How are NATS, Queues, and Topics and Events billed? + +Billing is based on: + +- For NATS: [Stream volume](/messaging/concepts/#stream-volume) (the total sum of each message's size going through the stream) and [stream persistence](/messaging/concepts/#stream-persistence) (the total amount of data stored * duration) +- For Queues: [Queue volume](/messaging/concepts/#queue-volume) (the total sum of each message's size going through the queue) +- For Topics and Events : [Topic Volume](/messaging/concepts/#queue-volume)(the total sum of each message's size going out from the topic to the subscriptions) + +For full pricing details, see our [dedicated pricing page](https://www.scaleway.com/en/pricing/). \ No newline at end of file diff --git a/pages/topics-and-events/how-to/assets/scaleway-topics-create-subs.webp b/pages/topics-and-events/how-to/assets/scaleway-topics-create-subs.webp new file mode 100644 index 0000000000000000000000000000000000000000..f9aec9f4b7d090f7f17a9f5d99957656471ff9fe GIT binary patch literal 24710 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 z zo7WB?J~)I>U&3$eYshl3CB|m;_^O#%44EJ>pO4i0 zSy5Ed(Jf5hl(k*yKzOoZWHmVN`HZBL5>Yn0&s&WS-Ozdj%@*#c+wfMpB+($1H)vVi z8M<$?_R$eiae}O@?Lrs;NpR^=+5Vk~YQJ_lPzcqRK8P1r!Nc62e6l=Fx-auGGxKd! z!lZ%!;J-ix{|Ws6U-0qi|AG(xdtWXU{ML47*@&VW(R5>q?>sUrEa_Ml&?1M|i;}D8 zE~5K?g<-6#vhIKVq}*pf#p)X;K{vDQ@VNO_TKks&G`V)bM_<9U(5fa5;ye$0c1 z0S3KX^U-artpW*s^D|3esjk&kC3&+K$5fbt^%IHn1%a>PsUj$t~|T_zT7>42&N14~wm z?eX9{`up5M!IN@GgdZu_z7Uz~XlRbwd=4ZiAVpPfq0`3abqph|QrBDRg=HB7viZ+V z?D}O-Y84Cr<*v@n_`;TI2`j|ip6iRF(r$gSs@zx_@HY5Q;Qv4H;W<2^k6F%Q2DQ&RGP{3L>#13%GZCM74=q{#~~qG2&OskL6d z;czT!=)LQfk}IV z?T}FoH)CD(0Ru%ii1Yvy%Zj>hJaeTL2+%(Y}m2xgs|Zagd;G28zj0TGoGN&1e&`EA7@YSx8@zP}Xr7 zf<#0pjSiaFvOBUx8&3gK?GOMB5D+s9R=q;n4$&c@I5~6*_JCcg#)ub@7cHYrX7h`^ z#Cxj2sJ9at*@p&#K*-Xb*+inP4IjQLVr--92oP_1Yb}?B^fieU^(JvATn~nlco3~x zQ&IxR5Vb=MNEm^I(E79r^TbBJ@8#1-xu@Fw$ELW-{rajf5bFa`Gm4ht1YJEqNQcqL z;L(<90RPHx0}w*u0kmdqS-EKAsnT+yX;g8KW!JoydDx?)Et@F{o^RYZ>$EgLC5+}r5wMAv0h zMMt>mbJ8w>g<*uN8<(*eQ9fT_}X`jq6G;wlZ!2dSu5;_wF_{3`=ZTm&sj*;n{?dWK}V2>_5)<)Sl6XGx)`O^RPuZJ0Am%`Z}-;Stw+i zOv^Hw!xc1A>Z$T95k3=fXyn;X?p1doY*0RhF8u6r&GU&`+7w|+;^M(DGQPO`#~ysX z3a<9jZ_)KxkdsV*qM?GzJvFpnwCYl;* z_gpur3NWC82S=JF!5lGYW>7R~zAJnzM#G`5;i|M=A?*xSOF=9(wr8QoGfgT$lSYG= zW>uOCa83FS>5GT4aM*ZPJ%Hf5A7i@BwJer&kZcq@hp^u3Dq10vvL-ljRyu3DJiLwf zU+lfpoAKXSEqt_KnfWQa=TGI8h&Ug=_XeMqV=!lSln92&J$I!6ey- ZPfE?oTlHIB9%;Fk{)7MEKltzM4-95iK864Q literal 0 HcmV?d00001 diff --git a/pages/topics-and-events/how-to/assets/scaleway-topics-create-topic.webp b/pages/topics-and-events/how-to/assets/scaleway-topics-create-topic.webp new file mode 100644 index 0000000000000000000000000000000000000000..7596cd2e1536081066660d43cc2a890f63d9197e GIT binary patch literal 44744 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 literal 0 HcmV?d00001 diff --git a/pages/topics-and-events/how-to/create-credentials.mdx b/pages/topics-and-events/how-to/create-credentials.mdx new file mode 100644 index 0000000000..16ee57b0c8 --- /dev/null +++ b/pages/topics-and-events/how-to/create-credentials.mdx @@ -0,0 +1,116 @@ +--- +meta: + title: How to create credentials for NATS, Queues, or Topics and Events + description: Learn how to create credentials for Scaleway NATS, Queues, or Topics and Events (Messaging and Queuing). Securely manage access and ensure seamless integration with this step-by-step guide. +content: + h1: How to create credentials for NATS, Queues, or Topics and Events + paragraph: Learn how to create credentials for Scaleway NATS, Queues, or Topics and Events (Messaging and Queuing). Securely manage access and ensure seamless integration with this step-by-step guide. +tags: credentials messaging queuing key token +categories: + - serverless +dates: + validation: 2024-10-18 + posted: 2022-08-11 +--- + +This page shows how to create [credentials](/messaging/concepts/#credentials) for Scaleway **NATS**, **Queues** and **Topics and Events** (previously grouped together as the **Messaging and Queuing** product). Credentials give their bearer (e.g. services and platforms) access to your service. + +You can create multiple sets of credentials for each of your NATS accounts, and for your Queues and Topics and Events services. + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization + +## How to create credentials for a NATS account + +Credentials for NATS accounts are not granular: they necessarily give full read and write access. The bearer of these credentials can publish and receive messages, as well as manage topics and streams, for this account. + +1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. + +2. Use the drop-down menu to select the [region](/messaging/concepts/#region) of the NATS account for which you want to create credentials. The list of your NATS accounts in the pre-selected region displays. + +3. Click the NATS account you want to generate credentials for. The account's **Overview** page displays. + + + +4. In the **Credentials** panel, click **Generate credentials**. A pop-up displays. + +5. Enter a name for these credentials, and click **Generate credentials**. + + The credentials are created and a button displays prompting you to download them in a `.creds` file. + + + + + The generated credentials are displayed only once. Make sure to download and safely store them before closing the window. + + +7. Click **Download** and save the file, before closing the window. + + You are returned to your NATs account's overview page. The name of your newly-generated credentials and their access level is displayed in the **Credentials** panel. + +## How to create credentials for Queues + +Credentials for Queues are granular: you can define the level of access that they should give. Credentials give the specified level of access to all queues that you create in the region they are scoped to. + +1. Click **Queues** in the **Serverless** section of the Scaleway console side menu. A list of your queues displays. + +2. Click the **Credentials** tab. + +3. Click **Generate credentials**. A pop-up displays: + + + +4. Choose a region that these credentials should be scoped to. + +5. Enter a name for these credentials. + +6. Select the required permissions for the credentials. You must choose at least one of **Write**, **Read** and **Manage**. You are free to select any combination of these permissions. + +7. Click **Generate credentials**. + + The credentials are created. The access key and secret key are displayed, and you are invited to copy them. + + + This is your only chance to view and save the secret key. Make sure that you copy it and save it somewhere securely. + + +8. Copy and save the credentials, before closing the window. + + You are returned to the **Credentials** tab. The name of your newly-generated credentials, along with the access key and access level are displayed. + +## How to create credentials for Topics and Events + +Credentials for Topics and Events are granular: you can define the level of access that they should give. Credentials give the specified level of access to all topics that you create in the region they are scoped to. + +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. The **Topics and Events** dashboard displays. + +2. Click the **Credentials** tab. + +3. Click **Generate credentials**. A pop-up displays: + + + +4. Choose a region that these credentials should be scoped to. + +5. Enter a name for these credentials. + +6. Select the required permissions for the credentials. You must choose at least one of **Write**, **Read** and **Manage**. You are free to select any combination of these permissions. + +7. Click **Generate credentials**. + + The credentials are created. The access key and secret key are displayed, and you are invited to copy them. + + + This is your only chance to view and save the secret key. Make sure that you copy it and save it somewhere securely. + + +8. Copy and save the credentials, before closing the window. + + You are returned to the **Credentials** tab. The name of your newly-generated credentials, along with the access key and access level are displayed. + + + + + diff --git a/pages/topics-and-events/how-to/create-manage-subscriptions.mdx b/pages/topics-and-events/how-to/create-manage-subscriptions.mdx new file mode 100644 index 0000000000..b8e05a5e43 --- /dev/null +++ b/pages/topics-and-events/how-to/create-manage-subscriptions.mdx @@ -0,0 +1,117 @@ +--- +meta: + title: How to create and manage Topics and Events subscriptions + description: Learn to create and manage Scaleway Topics and Events subscriptions. This guide ensures effective message delivery and streamlined communication. +content: + h1: How to create and manage Topics and Events subscriptions + paragraph: Learn to create and manage Scaleway Topics and Events subscriptions. This guide ensures effective message delivery and streamlined communication. +tags: messaging queuing subscriptions sns topics +categories: + - serverless +dates: + validation: 2024-10-17 + posted: 2024-02-06 +--- + +This page shows how to create and manage [subscriptions](/messaging/concepts/#subscription) with Scaleway Topics and Events (formerly part of the Messaging and Queuing product). When you create a subscription to a [topic](/messaging/concepts/#topic), you are effectively signing up an endpoint to receive all messages published to that topic. + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization +- An existing [topic](/messaging/how-to/create-manage-topics/) + +## How to create a subscription + +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. + +2. Use the dropdown menu to select the [region](/messaging/concepts/#region) of the topic you want to create a subscription for. + +3. Click the name of the topic you want to create a subscription for. + +4. Click **Create Subscription**. The subscription creation wizard displays. + + +5. Verify the parameters of the topic that you are creating a subscription for (name, and type). + +6. Choose a protocol, based on the type of endpoint or client you want to subscribe. Click the tab below for further details and full instructions on each protocol: + + + +
+ Select **HTTP** to create a subscription for a service or web server that can receive `HTTP POST` requests from Topics and Events, via standard HTTP protocol. + + Note that for security reasons, we recommend using the HTTPS protocol, rather than HTTP. + + You are prompted to enter the URL of the HTTP endpoint to subscribe, e.g. `example.com`. Note that the scheme (`http://`) is not required. + + After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). + +
+ +
+ Select **HTTPS** to create a subscription for a service or web server that can receive `HTTP POST` requests from Topics and Events, via secure HTTP protocol. + + You are prompted to enter the URL of the HTTP endpoint to subscribe, e.g. `example.com`. Note that the scheme (`https://`) is not required. + + After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). +
+ +
+ Choose **Serverless Functions and Containers** to create a subscription for a Scaleway Serverless Function or Container that you have created. + + You are prompted to select the **namespace** containing the Function or Container that you want to subscribe. Only namespaces in the same [Project](/organizations-and-projects/concepts/#project) and [region](/messaging/concepts/#region) as the topic can be selected. + + You are prompted to select the Serverless Function or Container to subscribe. Only Functions and Containers with a public [privacy policy](/serverless-functions/concepts/#privacy-policy) can subscribe to an topic. +
+ +
+ Choose **Queues** to create a subscription for a Scaleway queue that you have created. + + You are prompted to select the **queue** to subscribe. Only queues in the same [Project](/organizations-and-projects/concepts/#project) and [region](/messaging/concepts/#region) as the topic can be selected. +
+
+ +7. Click **Create subscription** to finish. + + The subscription is created. If you created an HTTP or HTTPS subscription, you will now need to **confirm** it, as described below. This step is not required for Serverless Functions / Containers or Queues subscriptions. + +## How to confirm an HTTP or HTTPS subscription + +An HTTP or HTTPS subscription will have a `Pending` status until you **confirm** it. This is essential for it to be able to start receiving messages. Follow the steps below to confirm the subscription: + +1. Access the subscriptions listing page (from the console side menu, **Serverless** > **Topics and Events** > **Topics**, click the topic containing the subscription). + +2. Click the icon next to the subscription you wish to confirm, then select **Confirm subscription** from the menu. A pop-up displays: + + + +3. Retrieve the confirmation message that Scaleway Topics and Events sent to your endpoint (delivered as an `HTTP POST` request), and extract the `SubscribeURL` from the message payload. + +4. Enter the `SubscribeURL` value (e.g. `https://sns.mnq.{region}.scaleway.com/?Action=ConfirmSubscription&TopicArn={your-topic-arn}&Token={your-subscription-token}`) in the box. The correct values for region, topic ARN and subscription token should be pre-filled for you in the URL. + +5. Click **Confirm subscription**. + + The subscription's status is now shown as **Confirmed**. The subscription will now receive messages published to the topic. + +## How to delete a subscription + +When you no longer want a subscribed endpoint or service to receive messages from the topic, you can delete the subscription. + +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. + +2. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the subscription you want to delete. + +3. Click the topic containing the subscription you want to delete. + +4. Click the **Subscriptions** tab. The list of subscriptions to this topic displays. + +5. Either: + - Click the subscription you wish to delete. The subscription's **Settings** page displays. Click the **Delete subscription** button in the bottom right corner. + - Click the icon next to the subscription you wish to delete, then select **Delete** from the menu that displays. + + A pop-up asks you to confirm that you understand this action will delete the subscription. + +6. Type **DELETE** and click **Delete subscription**. + + diff --git a/pages/topics-and-events/how-to/create-manage-topics.mdx b/pages/topics-and-events/how-to/create-manage-topics.mdx new file mode 100644 index 0000000000..be9d69feda --- /dev/null +++ b/pages/topics-and-events/how-to/create-manage-topics.mdx @@ -0,0 +1,61 @@ +--- +meta: + title: How to create and manage Topics and Events topics + description: Discover how to create and manage topics with Scaleway Topics and Events. Enhance your messaging setup with this comprehensive, easy-to-follow guide. +content: + h1: How to create and manage Topics and Events topics + paragraph: Discover how to create and manage topics with Scaleway Topics and Events. Enhance your messaging setup with this comprehensive, easy-to-follow guide. +tags: messaging queuing topics sns +categories: + - serverless +dates: + validation: 2024-10-17 + posted: 2023-12-27 +--- + +This page shows how to create and manage [topics](/messaging/concepts/#topic) with Scaleway Topics and Events (formerly part of the Messaging and Queuing product). + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization + +## How to create a topic + +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. + +2. Click **Create topic**. The topic creation wizard displays. + + + +3. Choose a region in which to create your topic. + +4. Enter a **name** for your topic. The name must contain no more than 80 characters, and consist only of alphanumeric characters, hyphens, and underscores. Alternatively, you can go with the auto-generated name suggested for you. + +5. Choose a **topic type**. The following topic types are available: + - **Standard**: Ensures at-least-once message delivery, where the order of messages is not preserved. Supports Serverless Functions, Serverless Containers and HTTP/S subscriptions. + - **FIFO**: Provides first-in-first-out delivery, where the order of messages is preserved without duplication. Supports Scaleway Queues subscriptions. [Content-based deduplication](/messaging/concepts/#content-based-deduplication) is only available for FIFO topics. + +6. Click **Create topic** to finish. + +You are returned to the **Topics** tab, where your newly-created topic now displays. The topic's URL is also displayed here, for use in your API/CLI operations. + + +Remember that you need to [create credentials](/messaging/how-to/create-credentials/) in order to access your Topics and Events service and its topics from an API or CLI. Sending messages to topics requires that credentials have the `can_publish` permission, while receiving messages from topics requires the `can_receive` permission. You can create separate credentials if you need to isolate these two roles in your application. + + +## How to delete a topic + +When you no longer want a topic, you can delete it. This action is irreversible and deletes the topic along with all its associated subscriptions. + +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. + +2. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the topic you want to delete. + +3. Either: + - Click the topic you wish to delete, and navigate to its **Settings** page. Click the **Delete topic** button in the bottom right corner, or + - Click the icon next to the topic you wish to delete, then select **Delete** from the menu that displays. + + A pop-up asks you to confirm that you understand this action will delete the topic and all of its associated subscriptions. + +4. Type **DELETE** and click **Delete topic**. \ No newline at end of file diff --git a/pages/topics-and-events/how-to/deactivate-delete-messaging.mdx b/pages/topics-and-events/how-to/deactivate-delete-messaging.mdx new file mode 100644 index 0000000000..f8ef3f4fbe --- /dev/null +++ b/pages/topics-and-events/how-to/deactivate-delete-messaging.mdx @@ -0,0 +1,45 @@ +--- +meta: + title: How to delete a NATS, Queues, or Topics and Events service + description: Delete Scaleway NATS, Queues, or Topics and Events effectively. Safely remove resources with this straightforward guide. +content: + h1: How to delete a NATS, Queues, or Topics and Events service + paragraph: Delete Scaleway NATS, Queues, or Topics and Events services effectively. Safely remove resources with this straightforward guide. +dates: + validation: 2024-10-17 + posted: 2023-10-03 +tags: delete messaging queuing queueing messaging-and-queuing service disable deactivate nats-account stop +categories: + - serverless +--- + +This page shows how to delete a Scaleway **NATS**, account. + +Note that it is no longer necessary to deactivate services for **Queues** or **Topics and Events**: simply delete the queues, topics, subscriptions or other associated resources for the product directly. + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization +- At least one [NATS account](/messaging/how-to/get-started/), [queue](/messaging/how-to/create-manage-queues/), or [topic](/messaging/how-to/create-manage-topics/) + +## How to delete a NATS account + +1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. + +2. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the NATS account you want to delete. + +3. Click the NATS account you want to delete. + +4. In the bottom panel, click the **Delete NATS account** button. + + A pop-up displays, reminding you that the action is irreversible, and any associated queued messages and credentials will be deleted. + +5. Type `DELETE` and click **Delete NATS account** to confirm. + + +Repeat the process above for each NATS account you want to delete. Remember to use the region drop-down as appropriate to access the different NATS accounts you hold in different regions. + + + + diff --git a/pages/topics-and-events/how-to/get-started.mdx b/pages/topics-and-events/how-to/get-started.mdx new file mode 100644 index 0000000000..639996edfa --- /dev/null +++ b/pages/topics-and-events/how-to/get-started.mdx @@ -0,0 +1,54 @@ +--- +meta: + title: How to get started with NATS, Queues, or Topics and Events + description: Kickstart your journey with Scaleway NATS, Queues, or Topics and Events. Learn how to set up, manage, and optimize your NATS, Queues, and Topics and Events services effortlessly. +content: + h1: How to get started with NATS, Queues, or Topics and Events + paragraph: Kickstart your journey with Scaleway NATS, Queues, or Topics and Events. Learn how to set up, manage, and optimize your NATS, Queues, and Topics and Events effortlessly. +tags: messaging queuing enable disable nats sqs sns nats-account account create +categories: + - serverless +dates: + validation: 2024-10-17 + posted: 2023-10-03 +--- + +This page shows how to get started with Scaleway **NATS**, **Queues** or **Topics and Events** (previously grouped together as the **Messaging and Queuing** product). + +The process differs depending on the [messaging protocol](/messaging/concepts/#messaging-protocol) you want to use: + +- For NATS, you need to **create a NATS account**. +- For **Queues** and **Topics and Events**, you no longer need to activate the protocol, but can proceed directly to [creating queues](/messaging/how-to/create-manage-queues) and/or [topics](/messaging/how-to/create-manage-topics). + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization + +## How to create a NATS account + +To start using a NATS message broker, you must first create a NATS account. This sets a scope for your NATS credentials, messages, queues and stream. + +1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. + +2. Click **Create a NATS account**. The creation wizard displays. + + + +3. Complete the following steps in the wizard: + + - Choose a **region**, which is the geographical location in which your NATS account will be created. + - Enter a **name** for your NATS account, or use the auto-generated name suggested for you. + - Optional: Use the *Estimated cost** calculator to simulate how messages sent and stored with NATS streams will be billed. Note that simply creating a NATS account does not in itself incur any billing. For more information about NATS billing, see the [FAQ](/messaging/faq/#how-are-nats-queues-and-topics-and-events-billed). + - Click **Create NATS account** to finish. + + You are directed to the listing of your NATS accounts, where your newly-created NATS account now appears. + + + You can create more NATS accounts in your pre-selected region if you wish, by clicking on the `+ Create NATS account` button. To create NATS accounts in other regions, repeat the steps above starting from step 2 and selecting the required region. + + + +## How to activate Queues or Topics and Events + +For **Queues** and **Topics and Events**, you no longer need to activate the individual protocols. Proceed directly to [creating queues](/messaging/how-to/create-manage-queues) or [topics](/messaging/how-to/create-manage-topics) directly. \ No newline at end of file diff --git a/pages/topics-and-events/how-to/index.mdx b/pages/topics-and-events/how-to/index.mdx new file mode 100644 index 0000000000..e54fd91319 --- /dev/null +++ b/pages/topics-and-events/how-to/index.mdx @@ -0,0 +1,8 @@ +--- +meta: + title: NATS, Queues, and Topics and Events - How Tos + description: NATS, Queues, and Topics and Events How Tos +content: + h1: NATS, Queues, and Topics and Events - How Tos + paragraph: NATS, Queues, and Topics and Events How Tos +--- diff --git a/pages/topics-and-events/how-to/manage-credentials.mdx b/pages/topics-and-events/how-to/manage-credentials.mdx new file mode 100644 index 0000000000..4ea9a79652 --- /dev/null +++ b/pages/topics-and-events/how-to/manage-credentials.mdx @@ -0,0 +1,76 @@ +--- +meta: + title: How to manage credentials for NATS, Queues, or Topics and Events + description: Master managing credentials for Scaleway NATS, Queues, or Topics and Events (Messaging and Queuing)! Follow this guide to securely update, rotate, and control access to your messaging services. +content: + h1: How to manage credentials for NATS, Queues, or Topics and Events + paragraph: Master managing credentials for Scaleway NATS, Queues, or Topics and Events (Messaging and Queuing)! Follow this guide to securely update, rotate, and control access to your messaging services. +dates: + validation: 2024-10-17 + posted: 2022-08-11 +tags: manage credentials messaging queuing permissions update revoke +categories: + - serverless +--- + +Credentials give their bearer (e.g. services and platforms) access to your service. + +This page shows how to manage [credentials](/messaging/concepts/#credentials) for Scaleway **NATS**, **Queues** and **Topics and Events** (previously grouped together as the **Messaging and Queuing** product). + +Credentials for **Queues** and **Topics and Events** can be updated to change their permissions, or revoked. **NATS** credentials can only be revoked, not updated. Once credentials are revoked, any user trying to use the credentials to connect to the service will be denied. + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization +- Valid [credentials](/messaging/how-to/create-credentials/) + +## How to update Queues or Topics and Events credentials + +1. Click **Queues** or **Topics and Events** in the **Serverless** section of the Scaleway console side menu, depending on which type of credentials you want to update. + +2. Click the **Credentials** tab. + +3. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the credentials you want to update. + +4. Click the button next to the credentials you want to update, and select **Update credentials**. A pop-up displays, such as the one below for Queues: + + + +5. Make the required updates to your credentials. You can modify the name, and the permissions. + +6. Click **Update credentials**. + + The credentials are updated and you are returned to the product's **Credentials** listing. + +## How to revoke Queues or Topics and Events credentials + +1. Click **Queues** or **Topics and Events** in the **Serverless** section of the Scaleway console side menu, depending on which type of credentials you want to revoke. + +2. Click the **Credentials** tab. + +3. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the credentials you want to revoke. + +4. Click the button next to the credentials you want to revoke and select **Revoke**. + + A pop-up displays, warning you that this action is irreversible and the key will no longer be able to access your service. + +5. Click **Revoke credentials**. + + The credentials are revoked and you are returned to the product's **Credentials** listing. + +## How to revoke NATS credentials + +1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. + +2. Select the NATS account you want to revoke credentials for. + +3. In the **Credentials** panel, click the button next to the credentials you want to revoke. + + A pop-up displays, warning you that this action is irreversible and the key will no longer be able to access your service. + +5. Click **Revoke credentials**. + + The credentials are revoked and you are returned to the NATS account's **Overview** page. + + diff --git a/pages/topics-and-events/how-to/monitor-mnq-cockpit.mdx b/pages/topics-and-events/how-to/monitor-mnq-cockpit.mdx new file mode 100644 index 0000000000..c957711a74 --- /dev/null +++ b/pages/topics-and-events/how-to/monitor-mnq-cockpit.mdx @@ -0,0 +1,49 @@ +--- +meta: + title: How to monitor NATS, Queues, and Topics and Events with Scaleway Cockpit + description: Monitor your NATS, Queues, and Topics and Events services with Scaleway Cockpit. This guide helps you track performance to manage your messaging services efficiently. +content: + h1: How to monitor NATS, Queues, and Topics and Events with Scaleway Cockpit + paragraph: Monitor your NATS, Queues, and Topics and Events services with Scaleway Cockpit. This guide helps you track performance to manage your messaging services efficiently. +tags: messaging queuing queueing cockpit metrics observability +categories: + - serverless +dates: + validation: 2024-10-17 + posted: 2023-09-07 +--- + +You can view metrics for your NATS, Queues, and Topics and Events services via [Scaleway Cockpit](/cockpit/quickstart/). This allows you to monitor your queues/streams and messages at a glance. There are two steps to complete to view your metrics for the first time with Cockpit: + +1. Generate your Grafana credentials +2. Access the product's metrics dashboard + +These steps are described below. + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization +- At least one [NATS account](/messaging/how-to/get-started/), [queue](/messaging/how-to/create-manage-queues/), or [topic](/messaging/how-to/create-manage-topics/) + +## How to activate your Cockpit + +Scaleway Cockpit is activated by default if you have created [Scaleway resources integrated with Cockpit](/cockpit/reference-content/cockpit-limitations/#product-integration-into-cockpit). + +## How to generate Grafana credentials + +To view your metrics with Cockpit, you will use a Grafana dashboard which is accessible from the Scaleway console. First, you must create a user and their associated credentials (a username and password) for Grafana. This can be done directly from the Scaleway console, [by following this procedure](/cockpit/how-to/retrieve-grafana-credentials/). + +## How to access your NATS, Queues, or Topics and Events dashboard and view your metrics + +1. Click **NATS**, **Queues** or **Topics and Events** in the **Serverless** section of the Scaleway console side menu. + +2. Click the **protocol** you want to view metrics for, and navigate to the **Metrics** tab. + +3. Click **Open Grafana metrics dashboard**. + +4. Enter your Grafana username and password to log in. + + You are directed to the dashboard for the product in question, where you can view all your metrics. + + diff --git a/pages/topics-and-events/index.mdx b/pages/topics-and-events/index.mdx new file mode 100644 index 0000000000..89f6a6c8a3 --- /dev/null +++ b/pages/topics-and-events/index.mdx @@ -0,0 +1,83 @@ +--- +meta: + title: NATS, Queues, and Topics and Events Documentation + description: Explore Scaleway NATS, Queues, and Topics and Events. Simplify your microservice workflows with scalable, reliable, and cost-effective message handling solutions. +--- + + + +## Getting Started + + + + + + + + + +## Tutorials + + + + + + + + + + +## Changelog + + \ No newline at end of file diff --git a/pages/topics-and-events/quickstart.mdx b/pages/topics-and-events/quickstart.mdx new file mode 100644 index 0000000000..441abf33e0 --- /dev/null +++ b/pages/topics-and-events/quickstart.mdx @@ -0,0 +1,298 @@ +--- +meta: + title: NATS, Queues, and Topics and Events - Quickstart + description: Get started with Scaleway's serverless NATS, Queues, and Topics and Events services. This quickstart guide helps you easily set up and manage scalable messaging solutions in minutes. +content: + h1: NATS, Queues, and Topics and Events - Quickstart + paragraph: Get started with Scaleway's serverless NATS, Queues, and Topics and Events services. This quickstart guide helps you easily set up and manage scalable messaging solutions in minutes. +dates: + validation: 2024-10-18 + posted: 2022-08-29 +tags: messaging queuing queueing quickstart messaging-and-queuing nats sqs sls message-broker queues topics messages streams +categories: + - serverless +--- + +Scaleway NATS, Queues, and Topics and Events are [message broker](/messaging/concepts/#messaging-and-queuing) tools that allows you to transfer messages between different microservices and platforms. This enables them to "talk" to each other effectively even if they are not otherwise compatible. These brokers enable and simplify microservices application development and allows you to build highly scalable, reliable, distributed applications. + +NATS, Queues, and Topics and Events were previously grouped together as the Messaging and Queuing product, and have now become three separate products in their own right. Read on to learn how to get started with your product of choice + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization + +## Quickstart for NATS + +### How to create a NATS account + +To start using a NATS message broker, you must first create a NATS account. This sets a scope for your NATS credentials, messages, queues and stream. + +1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. + +2. Click **Create a NATS account**. The creation wizard displays. + + + +3. Complete the following steps in the wizard: + + - Choose a **region**, which is the geographical location in which your NATS account will be created. + - Enter a **name** for your NATS account, or use the auto-generated name suggested for you. + - Optional: Use the *Estimated cost** calculator to simulate how messages sent and stored with NATS streams will be billed. Note that simply creating a NATS account does not in itself incur any billing. For more information about NATS billing, see the [FAQ](/messaging/faq/#how-are-nats-queues-and-topics-and-events-billed). + - Click **Create NATS account** to finish. + + You are directed to the listing of your NATS accounts, where your newly-created NATS account now appears. + +### How to create NATS credentials + +Credentials for NATS accounts are not granular: they necessarily give full read and write access. The bearer of these credentials can publish and receive messages, as well as manage topics and streams, for this account. + +1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. + +2. Use the drop-down menu to select the [region](/messaging/concepts/#region) of the NATS account for which you want to create credentials. The list of your NATS accounts in the pre-selected region displays. + +3. Click the NATS account you want to generate credentials for. The account's **Overview** page displays. + + + +4. In the **Credentials** panel, click **Generate credentials**. A pop-up displays. + +6. Enter a name for these credentials, and click **Generate credentials**. + + The credentials are created and a button displays prompting you to download them in a `.creds` file. + + + + + The generated credentials are displayed only once. Make sure to download and safely store them before closing the window. + + +7. Click **Download** and save the file, before closing the window. + + You are returned to your NATs account's overview page. The name of your newly-generated credentials and their access level is displayed in the **Credentials** panel. + +### How to create and manage queues, messages and streams + +All further actions related to publishing, processing and managing messages, subjects, queues and streams can be done via a supported CLI or SDK. See our documentation on [NATS CLI and SDKs](/messaging/reference-content/nats-overview/#further-actions-nats-cli-and-nats-sdk) for more information. You can also check out our tutorial on [creating a serverless architecture for handling large messages](/tutorials/large-messages/) with Scaleway Messaging and Queuing NATS. + +### How to delete a NATS account + +1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. + +2. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the NATS account you want to delete. + +3. Click the NATS account you want to delete. + +4. In the bottom panel, click the **Delete NATS account** button. + + A pop-up displays, reminding you that the action is irreversible, and any associated queued messages and credentials will be deleted. + +5. Type `DELETE` and click **Delete NATS account** to confirm. + + +## Quickstart for Queues + +### How to create credentials for Queues + +Credentials for Queues are granular: you can define the level of access that they should give. Credentials give the specified level of access to all queues that you create in the region they are scoped to. + +1. Click **Queues** in the **Serverless** section of the Scaleway console side menu. A list of your queues displays. + +2. Click the **Credentials** tab. + +3. Click **Generate credentials**. A pop-up displays: + + + +4. Choose a region that these credentials should be scoped to. + +5. Enter a name for these credentials. + +6. Select the required permissions for the credentials. You must choose at least one of **Write**, **Read** and **Manage**. You are free to select any combination of these permissions. + +7. Click **Generate credentials**. + + The credentials are created. The access key and secret key are displayed, and you are invited to copy them. + + + This is your only chance to view and save the secret key. Make sure that you copy it and save it somewhere securely. + + +8. Copy and save the credentials, before closing the window. + + You are returned to the **Credentials** tab. The name of your newly-generated credentials, along with the access key and access level are displayed. + +### How to create queues + +1. Click **Queues** in the **Serverless** section of the Scaleway console side menu. + +2. Click **Create queue**. The queue creation wizard displays. + + + +3. Select the [region](/messaging/concepts/#region) in which you want to create the queue. + +4. Enter a **name** for your queue. The name must be no more than 80 characters, and consist only of alphanumeric characters, hyphens, and underscores. Alternatively, you can go with the auto-generated name suggested for you. + +5. Choose your **Queue type**, from one of the following: + - **Standard**: Standard Queues ensure at-least-once delivery. The exact order of messages in the queue is not preserved. + - **FIFO**: FIFO Queues (**F**irst **In** **F**irst **O**ut) preserves the exact ordering of messages. + +6. Configure your queue's **parameters**. The following parameters can be defined: + - **Visibility timeout**: The length of time (in seconds) during which, after a message is received, it is hidden and cannot be received again by the same or other consumers. This is useful as the queue itself does not automatically delete messages once they are received, and so prevents consumers from receiving the same message many times before they have finished processing it. Therefore, the value set here should be informed by the expected length of time it will take consumers to process messages. The default value is 30 seconds. The value must be between 1 second and 43 200 seconds (12 hours). + - **Message retention period**: The length of time (in seconds) that messages are kept in the queue before being deleted. Setting a longer message retention period allows for a longer interval between a message being sent and it being received. The default value is 60 seconds. The value must be between 60 seconds and 1 209 600 seconds (14 days). + - **Maximum message size**: The maximum size (in kilobytes) of a message that can be sent to the queue. Messages greater than the defined size will be rejected. The default value is 256 KB. The value must be between 1 KB and 256 KB. + - **Content Based Deduplication**: This setting is only available for FIFO queues. Enable content-based deduplication if the message body is guaranteed to be unique for each message. A unique hash value is generated from the body of each message, which is used as its deduplication ID. This avoids the need to set a deduplication ID when sending messages. + - **Dead-letter queue**: Designate another queue to receive undelivered messages from this queue. If you select this option, you are prompted to select an existing queue as dead-letter queue. This queue must be of the same type, in the same Project and in the same region as the queue you are creating. You must also enter a value for the **maximum receive count** (how many times a message can be received from the source queue before being moved to the dead-letter queue). + +7. Click **Create queue** to finish. + +You are returned to the **Queues** tab, where your newly-created queue now displays. The queue's URL is also displayed here, for use in your API/CLI operations. + +### How to send and receive messages + +All further actions related to sending messages to queues can be done via a supported CLI or SDK. See our documentation on the [SQS CLI and SDKs](/messaging/reference-content/sqs-overview#further-actions) for more information. You can also check out [our tutorial](/tutorials/create-serverless-scraping/) on creating a serverless scraping architecture with Scaleway Queues. + +### How to delete a queue + +When you no longer want a queue, you can delete it. This action is irreversible and deletes the queue along with any queued messages. + +1. Click **Queues** in the **Serverless** section of the Scaleway console side menu. + +2. Use the drop-down menu to select the [region](/messaging/concepts/#region) of the queue you want to configure. + +3. Either: + - Click the queue you wish to delete. The queue's **Settings** page displays. Click the **Delete queue** button in the bottom right corner. + - Click the icon next to the queue you wish to delete, then select **Delete** from the menu that displays. + + A pop-up asks you to confirm that you understand this action will delete the queue and all your queued messages. + +4. Type **DELETE** and click **Delete queue**. + +## Quickstart for Topics and Events + +### How to create Topics and Events credentials + +Credentials for Topics and Events are granular: you can define the level of access that they should give. Credentials give the specified level of access to all topics that you create in the region they are scoped to. + +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. The **Topics and Events** dashboard displays. + +2. Click the **Credentials** tab. + +3. Click **Generate credentials**. A pop-up displays: + + + +4. Choose a region that these credentials should be scoped to. + +5. Enter a name for these credentials. + +6. Select the required permissions for the credentials. You must choose at least one of **Write**, **Read** and **Manage**. You are free to select any combination of these permissions. + +7. Click **Generate credentials**. + + The credentials are created. The access key and secret key are displayed, and you are invited to copy them. + + + This is your only chance to view and save the secret key. Make sure that you copy it and save it somewhere securely. + + +8. Copy and save the credentials, before closing the window. + + You are returned to the **Credentials** tab. The name of your newly-generated credentials, along with the access key and access level are displayed. + +### How to create topics + +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. + +2. Click **Create topic**. The topic creation wizard displays. + + + +3. Choose a region in which to create your topic. + +4. Enter a **name** for your topic. The name must contain no more than 80 characters, and consist only of alphanumeric characters, hyphens, and underscores. Alternatively, you can go with the auto-generated name suggested for you. + +5. Choose a **topic type**. The following topic types are available: + - **Standard**: Ensures at-least-once message delivery, where the order of messages is not preserved. Supports Serverless Functions, Serverless Containers and HTTP/S subscriptions. + - **FIFO**: Provides first-in-first-out delivery, where the order of messages is preserved without duplication. Supports Scaleway Queues subscriptions. [Content-based deduplication](/messaging/concepts/#content-based-deduplication) is only available for FIFO topics. + +6. Click **Create topic** to finish. + +You are returned to the **Topics** tab, where your newly-created topic now displays. The topic's URL is also displayed here, for use in your API/CLI operations. + +### How to create a subscription + +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. + +2. Use the dropdown menu to select the [region](/messaging/concepts/#region) of the topic you want to create a subscription for. + +3. Click the name of the topic you want to create a subscription for. + +4. Click **Create Subscription**. The subscription creation wizard displays. + + +5. Verify the parameters of the topic that you are creating a subscription for (name and type). + +6. Choose a protocol, based on the type of endpoint or client you want to subscribe. Click the tab below for further details and full instructions on each protocol: + + + +
+ Select **HTTP** to create a subscription for a service or web server that can receive `HTTP POST` requests from Topics and Events, via standard HTTP protocol. + + Note that for security reasons, we recommend using the HTTPS protocol, rather than HTTP. + + You are prompted to enter the URL of the HTTP endpoint to subscribe, e.g. `example.com`. Note that the scheme (`http://`) is not required. + + After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). + +
+ +
+ Select **HTTPS** to create a subscription for a service or web server that can receive `HTTP POST` requests from Topics and Events, via secure HTTP protocol. + + You are prompted to enter the URL of the HTTP endpoint to subscribe, e.g. `example.com`. Note that the scheme (`https://`) is not required. + + After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). +
+ +
+ Choose **Serverless Functions and Containers** to create a subscription for a Scaleway Serverless Function or Container that you have created. + + You are prompted to select the **namespace** containing the Function or Container that you want to subscribe. Only namespaces in the same [Project](/organizations-and-projects/concepts/#project) and [region](/messaging/concepts/#region) as the topic can be selected. + + You are prompted to select the Serverless Function or Container to subscribe. Only Functions and Containers with a public [privacy policy](/serverless-functions/concepts/#privacy-policy) can subscribe to a topic. +
+ +
+ + Choose **Queues** to create a subscription for a Scaleway queue that you have created. + + You are prompted to select the **queue** to subscribe. Only queues in the same [Project](/organizations-and-projects/concepts/#project) and [region](/messaging/concepts/#region) as the topic can be selected. +
+
+ +7. Click **Create subscription** to finish. + + The subscription is created. If you created an HTTP or HTTPS subscription, you will now need to [confirm it](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). + +### How to publish messages + +All further actions related to publishing messages to topics can be done via a supported CLI or SDK. See our documentation on the [SNS CLI and SDKs](/messaging/reference-content/sns-overview#further-actions)for more information. + +### How to delete a topic + +When you no longer want a topic, you can delete it. This action is irreversible and deletes the topic along with all its associated subscriptions. + +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. + +2. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the topic you want to delete. + +3. Either: + - Click the topic you wish to delete, and navigate to its **Settings** page. Click the **Delete topic** button in the bottom right corner, or + - Click the icon next to the topic you wish to delete, then select **Delete** from the menu that displays. + + A pop-up asks you to confirm that you understand this action will delete the topic and all of its associated subscriptions. + +4. Type **DELETE** and click **Delete topic**. diff --git a/pages/topics-and-events/reference-content/index.mdx b/pages/topics-and-events/reference-content/index.mdx new file mode 100644 index 0000000000..b74fe93663 --- /dev/null +++ b/pages/topics-and-events/reference-content/index.mdx @@ -0,0 +1,8 @@ +--- +meta: + title: NATS, Queues, and Topics and Events - Additional content + description: NATS, Queues, and Topics and Events additional content +content: + h1: NATS, Queues, and Topics and Events - Additional content + paragraph: NATS, Queues, and Topics and Events additional content +--- diff --git a/pages/topics-and-events/reference-content/limitations.mdx b/pages/topics-and-events/reference-content/limitations.mdx new file mode 100644 index 0000000000..ed7ab269ea --- /dev/null +++ b/pages/topics-and-events/reference-content/limitations.mdx @@ -0,0 +1,23 @@ +--- +meta: + title: NATS, Queues, and Topics and Events Limitations + description: Learn about the current limitations of Scaleway NATS, Queues, and Topics and Events +content: + h1: Limitations + paragraph: Learn about the current limitations of Scaleway NATS, Queues, and Topics and Events +tags: messaging limitations space size storage payload max-streams max-consumers max-subscribers max-topics max-queues visibility-timeout +dates: + validation: 2024-10-18 + posted: 2023-01-04 +validation_frequency: 8 +categories: + - serverless +--- + +## Usage limits + +For the usage limits that apply when using Scaleway NATS, Queues, and Topics and Events, see the dedicated sections on our [Organization quotas](/organizations-and-projects/additional-content/organization-quotas/) page. Limits (quotas) apply to, for example, the maximum number of queues, streams, topics and consumers/subscribers, as well as to message retention duration and storage. + +## VPC + +NATS, Queues, and Topics and Events are not currently compatible with [Scaleway VPC](/vpc/quickstart/). diff --git a/pages/topics-and-events/reference-content/sns-overview.mdx b/pages/topics-and-events/reference-content/sns-overview.mdx new file mode 100644 index 0000000000..d862ff1182 --- /dev/null +++ b/pages/topics-and-events/reference-content/sns-overview.mdx @@ -0,0 +1,62 @@ +--- +meta: + title: Topics and Events Overview + description: Learn about the Scaleway Topics and Events messaging system +content: + h1: Topics and Events Overview + paragraph: Learn about the Scaleway Topics and Events messaging system +tags: messaging sns aws queuing publish-subscribe message-queue topic notification simple notification service +categories: + - serverless +dates: + validation: 2024-10-18 + posted: 2023-01-04 +--- + +## What is Scaleway Topics and Events? + +Scaleway Topics and Events is a managed messaging service that facilitates the sending of notificatons or messages to a large number of subscribers, including email addresses, webhooks, and more. Topics and Events leverages the SNS protocol. + +## What is SNS? + +SNS is a managed messaging service developed by AWS and leveraged by Scaleway Topics and Events. + +SNS (Simple Notification Service) was released in 2010. It enables users to interconnect their applications and systems using a [publish/subscribe](/messaging/concepts#publishsubscribe) pattern. Many publishers can send messages to [topics](/messaging/concepts#topic), while consumers, e.g. applications, can subscribe to topics to receive all (or a subset) of messages sent to this topic. Scaleway Topics and Events makes it easy to migrate your SNS-connected applications by providing a dedicated protocol gateway. + + + Some SNS features are not yet available with Scaleway Topics and Events. Supported subscribers are currently limited to: + - HTTP/S clients + - [Serverless Functions](https://www.scaleway.com/en/serverless-functions/) + - Scaleway queues in the same [Project](/organizations-and-projects/concepts/#project) + + Refer to the [developers documentation](https://www.scaleway.com/en/developers/api/messaging-and-queuing/sns-api/) for more information. + + +## Topics and Events credentials + +You must [create credentials](/messaging/how-to/create-credentials/) that give your applications permission to connect to the Scaleway Topics and Events service. + +Credentials are scoped to your Topics and Events service at [Project](/organizations-and-projects/concepts/#project)-level. You can choose to give each set of credentials the required level of permissions: + + - **Read**: receive messages from queues and topics. + - **Write**: send messages to queues and publish in topics. + - **Manage**: create or edit resources (such as queues and topics). + +## Topics and subscriptions + +You can [create topics](/messaging/how-to/create-manage-topics/) and [subscriptions](/messaging/how-to/create-manage-subscriptions/) via the Scaleway console. + +## Further actions + +All further actions such as sending messages etc. can be done using the AWS CLI or AWS SDKs. Check out our documentation to help you get started with the [AWS CLI](/messaging/api-cli/connect-aws-cli/) or [AWS SDKs](/messaging/api-cli/python-node-sqs/). + +## Topics and Events Resources + +The following resources may be helpful: + + - [Official SNS Documentation](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) + - Further information on supported API features: + - [SNS](/messaging/reference-content/sns-support/) + - [Creating a simulated CPU monitor notification system with Scaleway Topics and Events](/tutorials/sns-instances-notification-system/) + - [Official AWS CLI Documentation](https://aws.amazon.com/cli/) + - [Official AWS SDK Documentation](https://aws.amazon.com/developer/tools/) \ No newline at end of file diff --git a/pages/topics-and-events/reference-content/sns-support.mdx b/pages/topics-and-events/reference-content/sns-support.mdx new file mode 100644 index 0000000000..d1983c5c91 --- /dev/null +++ b/pages/topics-and-events/reference-content/sns-support.mdx @@ -0,0 +1,279 @@ +--- +meta: + title: Topics and Events - Supported Actions + description: Discover which SNS AWS API actions are supported by Scaleway Topics and Events +content: + h1: Topics and Events - Supported Actions + paragraph: Discover which SNS AWS API actions are supported by Scaleway Topics and Events +tags: messaging queuing supported supports sns aws api actions +categories: + - serverless +dates: + validation: 2024-10-18 + posted: 2023-01-04 +--- + +This page lists all actions described in the AWS SNS documentation, and states whether they are supported by Scaleway Topics and Events. + +- **Y** means the parameter is fully supported +- **N** means the parameter is not supported +- **P** means the parameter is partially supported (see associated comments for more details) + +## CreateTopic + +CreateTopic requires the `CanManage` permission. + +### CreateTopic Request + +| Parameters | Support | Comments | +|:----------------------|:---------:|:--------------------------------------------------------------------------------------------------| +| Attributes (map) | **P** | See supported attributes in the [SNS Topic Attributes](#sns-api-support-topic-attributes) section | +| Name | **Y** | | +| Tags.member.N (array) | **N** | | + +### CreateTopic Response + +| Elements | Support | Comments | +|:-----------|:---------:|:-----------| +| TopicArn | **Y** | | + +## DeleteTopic + +DeleteTopic requires the `CanManage` permission. + +### DeleteTopic Request + +| Parameters | Support | Comments | +|:-------------|:---------:|:-----------| +| TopicArn | **Y** | | + +## ListTopics + +ListTopics requires the `CanPublish`, `CanReceive` or `CanManage` permission. + +### ListTopics Request + +| Parameters | Support | Comments | +|:-------------|:---------:|:-----------| +| NextToken | **N** | | + +### ListTopics Response + +| Elements | Support | Comments | +|:------------------------|:---------:|:-----------| +| NextToken | **N** | | +| Topics.member.N (array) | **Y** | | + +## ListSubscriptions + +ListSubscriptions requires the `CanReceive` or `CanManage` permission. + +### ListSubscriptions Request + +| Parameters | Support | Comments | +|:-------------|:---------:|:-----------| +| NextToken | **N** | | + +### ListSubscriptions Response + +| Elements | Support | Comments | +|:-------------------------------|:---------:|:-----------| +| NextToken | **N** | | +| Subscriptions.member.N (array) | **Y** | | + +## ListSubscriptionsByTopic + +ListSubscriptionsByTopic requires the `CanReceive` or `CanManage` permission. + +### ListSubscriptionsByTopic Request + +| Parameters | Support | Comments | +|:-------------|:---------:|:-----------| +| NextToken | **N** | | +| TopicArn | **Y** | | + +### ListSubscriptionsByTopic Response + +| Elements | Support | Comments | +|:-------------------------------|:---------:|:-----------| +| NextToken | **N** | | +| Subscriptions.member.N (array) | **Y** | | + +## Publish + +Publish requires the `CanPublish` permission. + +### Publish Request + +| Parameters | Support | Comments | +|:-----------------------|:---------:|:-----------| +| Message | **Y** | | +| MessageAttributes | **Y** | | +| MessageDeduplicationId | **Y** | | +| MessageGroupId | **N** | | +| MessageStructure | **N** | | +| PhoneNumber | **N** | | +| Subject | **Y** | | +| TargetArn | **N** | | +| TopicArn | **Y** | | + +### Publish Response + +| Elements | Support | Comments | +|:---------------|:---------:|:-----------| +| MessageId | **Y** | | +| SequenceNumber | **N** | | + +## PublishBatch + +PublishBatch requires the `CanPublish` permission. + +### PublishBatch Request + +| Parameters | Support | Comments | +|:--------------------------------------------|:---------:|:-------------------------------------------------------------------------------------------------| +| PublishBatchRequestEntries.member.N (array) | **P** | As with the Publish action, the MessageGroupId and MessageStructure parameters are not supported | +| TopicArn | **Y** | | + +### PublishBatch Response + +| Elements | Support | Comments | +|:----------------------------|:---------:|:-----------| +| Failed.member.N (array) | **Y** | | +| Successful.member.N (array) | **Y** | | + +## Subscribe + +Subscribe requires the `CanReceive` permission. + +### Subscribe Request + +| Parameters | Support | Comments | +|:----------------------|:---------:|:----------------------------------------------------------------------------------------------------------------| +| Attributes (map) | **P** | See supported attributes in the [SNS Subscription Attributes](#sns-api-support-subscription-attributes) section | +| Endpoint | **Y** | Note that for lambda, the endpoint must be the Scaleway Serverless Function public URL | +| Protocol | **P** | Only http, sqs and lambda protocols are supported | +| ReturnSubscriptionArn | **Y** | | +| TopicArn | **Y** | | + +### Subscribe Response + +| Elements | Support | Comments | +|:----------------|:---------:|:-----------| +| SubscriptionArn | **Y** | | + +## Unsubscribe + +Unsubscribe requires the `CanReceive` or `CanManage` permission. + +### Unsubscribe Request + +| Parameters | Support | Comments | +|:----------------|:---------:|:-----------| +| SubscriptionArn | **Y** | | + +## GetTopicAttributes + +GetTopicAttributes requires the `CanReceive` or `CanManage` permission. + +### GetTopicAttributes Request + +| Parameters | Support | Comments | +|:-------------|:---------:|:-----------| +| TopicArn | **Y** | | + +### GetTopicAttributes Response + +| Elements | Support | Comments | +|:-----------------|:---------:|:--------------------------------------------------------------------------------------------------| +| Attributes (map) | **P** | See supported attributes in the [SNS Topic Attributes](#sns-api-support-topic-attributes) section | + +## SetTopicAttributes + +SetTopicAttributes requires the `CanManage` permission. + +### SetTopicAttributes Request + +| Parameters | Support | Comments | +|:---------------|:---------:|:--------------------------------------------------------------------------------------------------| +| AttributeName | **P** | See supported attributes in the [SNS Topic Attributes](#sns-api-support-topic-attributes) section | +| AttributeValue | **Y** | | +| TopicArn | **Y** | | + +## ConfirmSubscription + +ConfirmSubscription requires the `None` permission. + +### ConfirmSubscription Request + +| Parameters | Support | Comments | +|:--------------------------|:---------:|:-----------| +| AuthenticateOnUnsubscribe | **N** | | +| Token | **Y** | | +| TopicArn | **Y** | | + +### ConfirmSubscription Response + +| Elements | Support | Comments | +|:----------------|:---------:|:-----------| +| SubscriptionArn | **Y** | | + +## GetSubscriptionAttributes + +GetSubscriptionAttributes requires the `CanReceive` or `CanManage` permission. + +### GetSubscriptionAttributes Request + +| Parameters | Support | Comments | +|:----------------|:---------:|:-----------| +| SubscriptionArn | **Y** | | + +### GetSubscriptionAttributes Response + +| Elements | Support | Comments | +|:-----------------|:---------:|:----------------------------------------------------------------------------------------------------------------| +| Attributes (map) | **P** | See supported attributes in the [SNS Subscription Attributes](#sns-api-support-subscription-attributes) section | + +## SetSubscriptionAttributes + +SetSubscriptionAttributes requires the `CanReceive` or `CanManage` permission. + +### SetSubscriptionAttributes Request + +| Parameters | Support | Comments | +|:----------------|:---------:|:----------------------------------------------------------------------------------------------------------------| +| AttributeName | **P** | See supported attributes in the [SNS Subscription Attributes](#sns-api-support-subscription-attributes) section | +| AttributeValue | **Y** | | +| SubscriptionArn | **Y** | | + +### SNS API support - Topic attributes + +The Scaleway Topics and Events API (currently named the SNS API) supports the following topic attributes: + +| Attribute Name | Support | Comments | +|:--------------------------|:---------:|:------------------------------------------------------| +| ContentBasedDeduplication | **Y** | | +| DeliveryPolicy | **N** | | +| DisplayName | **N** | | +| EffectiveDeliveryPolicy | **N** | | +| FifoTopic | **Y** | | +| KmsMasterKeyId | **N** | | +| Owner | **Y** | | +| Policy | **N** | | +| SignatureVersion | **N** | Version 1 is always used, version 2 is not supported. | +| SubscriptionsConfirmed | **Y** | | +| SubscriptionsDeleted | **Y** | | +| SubscriptionsPending | **Y** | | +| TopicArn | **Y** | | + +### SNS API support - Subscription attributes + +The Scaleway Topics and Events API (currently named the SNS API) supports the following subscription attributes: + +| Attribute Name | Support | Comments | +|:--------------------|:---------:|:-----------| +| DeliveryPolicy | **N** | | +| FilterPolicy | **N** | | +| RawMessageDelivery | **N** | | +| RedrivePolicy | **N** | | +| SubscriptionRoleArn | **N** | | \ No newline at end of file From fa8f7bd7f4d40afbf20c148a6ea2cc97be1d6777 Mon Sep 17 00:00:00 2001 From: Rowena Date: Thu, 10 Apr 2025 15:21:12 +0200 Subject: [PATCH 2/7] fix(topics): started concepts --- pages/topics-and-events/concepts.mdx | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/pages/topics-and-events/concepts.mdx b/pages/topics-and-events/concepts.mdx index 4cbee27ce6..fc9c67449c 100644 --- a/pages/topics-and-events/concepts.mdx +++ b/pages/topics-and-events/concepts.mdx @@ -1,22 +1,18 @@ --- meta: - title: NATS, Queues, and Topics and Events - Concepts - description: Understand the core concepts of Scaleway NATS, Queues, and Topics and Events. Explore fundamental principles for efficient message handling and service optimization. + title: Topics and Events - Concepts + description: Understand the core concepts of Scaleway Topics and Events. Explore fundamental principles for efficient message handling and service optimization. content: - h1: NATS, Queues, and Topics and Events - Concepts - paragraph: Understand the core concepts of Scaleway NATS, Queues, and Topics and Events. Explore fundamental principles for efficient message handling and service optimization. + h1: Topics and Events - Concepts + paragraph: Understand the core concepts of Scaleway Topics and Events. Explore fundamental principles for efficient message handling and service optimization. categories: - -tags: messaging queuing concepts nats queues topics events +tags: messaging topics subscriptions events dates: - validation: 2024-10-18 - posted: 2023-01-04 + validation: 2025-04-10 + posted: 2025-04-10 --- -## Content-based - -Content-based messaging systems are a subset of the [publish/subscribe](#publishsubscribe) model, and contrast with [topic-based](#topic-based) systems in terms of the way messages are [filtered](#filtering)/routed. In a content-based messaging system, the subscriber specifies the properties of the messages they want to receive, based on the message's attributes or content. Message delivery is therefore selective, and messages are only delivered to a subscriber if the attributes or content match the constraints they set. - ## Content-based deduplication Content-based deduplication is a setting available for [FIFO](#fifo) queues. Enable content-based deduplication if the message body is guaranteed to be unique for each message. A unique hash value is generated from the body of each message, which is used as its deduplication ID. This avoids the need to set a deduplication ID when sending messages. Read more in our dedicated documentation on [creating queues](/messaging/how-to/create-manage-queues/). From 8b09cf163a8d636b0daaa6a6e3ef2914d97a126f Mon Sep 17 00:00:00 2001 From: Rowena Date: Fri, 11 Apr 2025 11:14:04 +0200 Subject: [PATCH 3/7] feat(topics): continue to add content --- .../api-cli/connect-aws-cli.mdx | 47 ++--- pages/topics-and-events/api-cli/index.mdx | 8 +- ...-sns.mdx => python-node-topics-events.mdx} | 16 +- ...-aws-cli.mdx => topics-events-aws-cli.mdx} | 66 +----- pages/topics-and-events/concepts.mdx | 122 ++--------- pages/topics-and-events/faq.mdx | 38 ++-- .../how-to/create-credentials.mdx | 78 +------ .../how-to/create-manage-subscriptions.mdx | 18 +- .../how-to/create-manage-topics.mdx | 10 +- .../how-to/deactivate-delete-messaging.mdx | 45 ---- .../topics-and-events/how-to/get-started.mdx | 54 ----- .../how-to/manage-credentials.mdx | 46 ++--- .../how-to/monitor-mnq-cockpit.mdx | 49 ----- .../how-to/monitor-topics-cockpit.mdx | 41 ++++ pages/topics-and-events/index.mdx | 46 ++--- pages/topics-and-events/quickstart.mdx | 195 ++---------------- .../reference-content/index.mdx | 8 +- .../reference-content/limitations.mdx | 15 +- ...iew.mdx => topics-and-events-overview.mdx} | 14 +- ...port.mdx => topics-and-events-support.mdx} | 2 +- 20 files changed, 208 insertions(+), 710 deletions(-) rename pages/topics-and-events/api-cli/{python-node-sns.mdx => python-node-topics-events.mdx} (90%) rename pages/topics-and-events/api-cli/{sqs-sns-aws-cli.mdx => topics-events-aws-cli.mdx} (64%) delete mode 100644 pages/topics-and-events/how-to/deactivate-delete-messaging.mdx delete mode 100644 pages/topics-and-events/how-to/get-started.mdx delete mode 100644 pages/topics-and-events/how-to/monitor-mnq-cockpit.mdx create mode 100644 pages/topics-and-events/how-to/monitor-topics-cockpit.mdx rename pages/topics-and-events/reference-content/{sns-overview.mdx => topics-and-events-overview.mdx} (68%) rename pages/topics-and-events/reference-content/{sns-support.mdx => topics-and-events-support.mdx} (99%) diff --git a/pages/topics-and-events/api-cli/connect-aws-cli.mdx b/pages/topics-and-events/api-cli/connect-aws-cli.mdx index 34f61a55d2..057d23abba 100644 --- a/pages/topics-and-events/api-cli/connect-aws-cli.mdx +++ b/pages/topics-and-events/api-cli/connect-aws-cli.mdx @@ -1,27 +1,27 @@ --- meta: - title: Connecting Queues or Topics and Events to the AWS-CLI - description: This page explains how to connect Scaleway Queues and/or Topics and Events to the AWS-CLI + title: Connecting Topics and Events to the AWS-CLI + description: This page explains how to connect Scaleway Topics and Events to the AWS-CLI content: - h1: Connecting Queues or Topics and Events to the AWS-CLI - paragraph: This page explains how to connect Scaleway Queues and/or Topics and Events to the AWS-CLI -tags: messaging sns sqs aws-cli cli aws sdk python boto + h1: Connecting Topics and Events to the AWS-CLI + paragraph: This page explains how to connect Scaleway Topics and Events to the AWS-CLI +tags: messaging sns aws-cli cli aws sdk python boto categories: - messaging dates: - validation: 2024-10-18 + validation: 2025-04-10 posted: 2023-01-04 --- -The AWS-CLI is an open-source tool built on top of the AWS SDK for Python (Boto) that provides commands for interacting with AWS services. With minimal configuration, you can start using the AWS-CLI with Scaleway Queues or Scaleway Topics and Events. This allows you to create, list and manage your queues and topics, send messages and much more, all from your command line. +The AWS-CLI is an open-source tool built on top of the AWS SDK for Python (Boto) that provides commands for interacting with AWS services. With minimal configuration, you can start using the AWS-CLI with Scaleway Topics and Events. This allows you to create, list and manage your topics, send messages and much more, all from your command line. -This guide shows you how to install the AWS-CLI and configure it to connect to Scaleway Queues or Scaleway Topics and Events. +This guide shows you how to install the AWS-CLI and configure it to connect to Scaleway Topics and Events. - A Scaleway account logged into the [console](https://console.scaleway.com) - [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization -- Valid [credentials](/messaging/how-to/create-credentials/) for Queues and/or Topics and Events +- Valid [credentials](/topics-and-events/how-to/create-credentials/) for Topics and Events This page assumes you will use the AWS-CLI v1. @@ -29,7 +29,7 @@ This guide shows you how to install the AWS-CLI and configure it to connect to S ## How to install the AWS-CLI -To interact with Scaleway Queues and Scaleway Topics and Events, both `aws-cli` and `awscli-plugin-endpoint` need to be installed. The `awscli-plugin-endpoint` is a useful plugin to help people more easily access third-party providers such as Scaleway. +To interact with Scaleway Topics and Events, both `aws-cli` and `awscli-plugin-endpoint` need to be installed. The `awscli-plugin-endpoint` is a useful plugin to help people more easily access third-party providers such as Scaleway. Install both `aws-cli` and `awscli-plugin` using `pip`. @@ -40,7 +40,7 @@ pip3 install awscli-plugin-endpoint ## How to configure the AWS-CLI -Now you have installed the AWS-CLI, you need to configure it for use with Scaleway Queues / Topics and Events. +Now you have installed the AWS-CLI, you need to configure it for use with Scaleway Topics and Events. 1. Create a file named `~/.aws/config` by running the following command: ``` @@ -51,7 +51,7 @@ Now you have installed the AWS-CLI, you need to configure it for use with Scalew With the most recent versions of awscli (1.29.0 or 2.13.0), the use of a plugin is not necessary. If you are using one of those versions and wish to skip this step, you can do so. Note that this will also affect your configuration file in the next step. -2. Open the `~/.aws/config` file you just created in a text editor and edit it as follows (the Queues (SQS) or Topics and Events (SNS) endpoint URLs can be found in the console on the **Settings** page for the relevant product) +2. Open the `~/.aws/config` file you just created in a text editor and edit it as follows (the Topics and Events (SNS) endpoint URLs can be found in the console on the **Settings** page for your Topics and Events service). ``` [plugins] endpoint = awscli_plugin_endpoint @@ -59,13 +59,9 @@ Now you have installed the AWS-CLI, you need to configure it for use with Scalew region = fr-par sns = endpoint_url = https://sns.mnq.fr-par.scaleway.com - [profile sqs] - region = fr-par - sqs = - endpoint_url = https://sqs.mnq.fr-par.scaleway.com ``` - Optionally, you can also configure additional profiles by adding new blocks under `[sqs]` and `[sns]`. For example, you can add a third profile, `[profile aws]`, to connect to the AWS SQS/SNS service if you want: + Optionally, you can also configure additional profiles by adding new blocks under `[sns]`. For example, you can add a profile for `[sqs]` if you are also using Scaleway Queues, or another profile, `[profile aws]`, to connect to the AWS SQS/SNS service if you want: ``` [plugins] @@ -93,9 +89,6 @@ Now you have installed the AWS-CLI, you need to configure it for use with Scalew [profile sns] region = fr-par endpoint_url = https://sns.mnq.fr-par.scaleway.com - [profile sqs] - region = fr-par - endpoint_url = https://sqs.mnq.fr-par.scaleway.com ``` @@ -105,19 +98,19 @@ Now you have installed the AWS-CLI, you need to configure it for use with Scalew aws configure ``` ** -4. Open the `~/.aws/credentials` file you just created, and for each product (out of **Queues** and **Topics and Events**) you want to use, add the access key and secret key you saved when you generated your [credentials](/messaging/how-to/create-credentials/): +4. Open the `~/.aws/credentials` file you just created, and add the access key and secret key you saved when you generated your [credentials](/topics-and-events/how-to/create-credentials/): ``` [topics_events] aws_access_key_id= aws_secret_access_key= + ``` + If you have other profiles, you can add a block to indicate their credentials too: + ``` [queues] aws_access_key_id= aws_secret_access_key= - ``` - If you have other profiles, you can add a block to indicate their credentials too: - ``` [aws] aws_access_key_id= aws_secret_access_key= @@ -125,13 +118,11 @@ Now you have installed the AWS-CLI, you need to configure it for use with Scalew 6. Test that everything is set up correctly with the following command: ``` - aws queues list-queues + aws topics_events list-topics ``` Use the `--profile` option if you want to test it using a different profile. - Check out our dedicated documentation to find more common commands for getting started with the AWS CLI: - - The [Queues guide](/messaging/api-cli/sqs-sns-aws-cli/#getting-started-with-scaleway-queues) walks you through creating and listing queues, sending messages to queues, and more. - - The [Topics and Events guide](/messaging/api-cli/sqs-sns-aws-cli/#getting-started-with-topics-and-events) shows you how to create and list topics and subscriptions, send messages to topics, and more. + Check out our dedicated documentation to find more common commands for getting started with the AWS CLI. The [Topics and EVents guide](/queues/api-cli/topics-events-aws-cli/) walks you through creating and listing topics, sending messages. diff --git a/pages/topics-and-events/api-cli/index.mdx b/pages/topics-and-events/api-cli/index.mdx index aef6e7ef1f..072212e100 100644 --- a/pages/topics-and-events/api-cli/index.mdx +++ b/pages/topics-and-events/api-cli/index.mdx @@ -1,8 +1,8 @@ --- meta: - title: NATS, Queues, and Topics and Events - API/CLI Documentation - description: NATS, Queues, and Topics and Events API/CLI Documentation + title: Topics and Events - API/CLI Documentation + description: Topics and Events API/CLI Documentation content: - h1: NATS, Queues, and Topics and Events - API/CLI Documentation - paragraph: NATS, Queues, and Topics and Events API/CLI Documentation + h1: Topics and Events - API/CLI Documentation + paragraph: Topics and Events API/CLI Documentation --- diff --git a/pages/topics-and-events/api-cli/python-node-sns.mdx b/pages/topics-and-events/api-cli/python-node-topics-events.mdx similarity index 90% rename from pages/topics-and-events/api-cli/python-node-sns.mdx rename to pages/topics-and-events/api-cli/python-node-topics-events.mdx index acd87ce96e..d716612229 100644 --- a/pages/topics-and-events/api-cli/python-node-sns.mdx +++ b/pages/topics-and-events/api-cli/python-node-topics-events.mdx @@ -13,7 +13,7 @@ dates: posted: 2023-01-04 --- -AWS provides a number of **S**oftware **D**evelopment **K**its (SDKs) which provide language-specific APIs for AWS services, including [SNS](/messaging/concepts/#sns), which is the protocol that Scaleway Topics and Events is based on. +AWS provides a number of **S**oftware **D**evelopment **K**its (SDKs) which provide language-specific APIs for AWS services, including [SNS](/topics-and-events/concepts/#sns), which is the protocol that Scaleway Topics and Events is based on. - AWS provides a dedicated [SDK for Go](https://aws.amazon.com/sdk-for-go/). - The [AWS SDK for Python](https://aws.amazon.com/sdk-for-python/) is Boto3. @@ -25,7 +25,7 @@ This page provides code samples to show you how to get started using these SDKs - A Scaleway account logged into the [console](https://console.scaleway.com) - [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization -- Valid [credentials](/messaging/how-to/create-credentials/) for Topics and Events +- Valid [credentials](/topics-and-events/how-to/create-credentials/) for Topics and Events - Installed the relevant AWS SDK [for Go](https://aws.amazon.com/sdk-for-go/), [Python](https://aws.amazon.com/sdk-for-python/) and/or [JavaScript](https://aws.amazon.com/sdk-for-javascript/) ## Go @@ -57,11 +57,11 @@ func main() { - The `Endpoint` for Scaleway Topics and Events is `https://sns.mnq.fr-par.scaleway.com`. The values for the access and secret keys should be the credentials you [generated](/messaging/how-to/create-credentials/) for Topics and Events. + The `Endpoint` for Scaleway Topics and Events is `https://sns.mnq.fr-par.scaleway.com`. The values for the access and secret keys should be the credentials you [generated](/topics-and-events/how-to/create-credentials/) for Topics and Events. -Once connected, you can use any of the SDK's available functions. Be aware though that some functions are not [supported by Scaleway Topics and Events](/messaging/reference-content/sns-support/), so make sure to check the link for more details on these. See the [official SDK documentation](https://pkg.go.dev/github.com/aws/aws-sdk-go/service/sns) for more information on getting started with the SDK, or keep reading for some code examples. +Once connected, you can use any of the SDK's available functions. Be aware though that some functions are not [supported by Scaleway Topics and Events](/topics-and-events/reference-content/sns-support/), so make sure to check the link for more details on these. See the [official SDK documentation](https://pkg.go.dev/github.com/aws/aws-sdk-go/service/sns) for more information on getting started with the SDK, or keep reading for some code examples. ### Create topic (Go) @@ -159,10 +159,10 @@ sns = boto3.resource('sns', ``` - The `endpoint_url` for Scaleway Topics and Events (based on SNS) is `https://sns.mnq.fr-par.scaleway.com`. The values for the access and secret keys should be the credentials you [generated](/messaging/how-to/create-credentials/) for Topics and Events. + The `endpoint_url` for Scaleway Topics and Events (based on SNS) is `https://sns.mnq.fr-par.scaleway.com`. The values for the access and secret keys should be the credentials you [generated](/topics-and-events/how-to/create-credentials/) for Topics and Events. -Once connected to, you can use any of the SDK's available functions. However, some functions are not [supported by Scaleway Topics and Events](/messaging/reference-content/sns-support/), so do check the link to make sure. See the [official SDK documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) for more information, or keep reading for some code examples. +Once connected to, you can use any of the SDK's available functions. However, some functions are not [supported by Scaleway Topics and Events](/topics-and-events/reference-content/sns-support/), so do check the link to make sure. See the [official SDK documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) for more information, or keep reading for some code examples. ### Create topic (Python) @@ -276,10 +276,10 @@ var snsClient = new SNSClient({ ``` - The `endpoint_url` for Scaleway Topics and Events is `https://sns.mnq.fr-par.scaleway.com`. For the access and secret key values, use the credentials you [generated](/messaging/how-to/create-credentials/) for Topics and Events. + The `endpoint_url` for Scaleway Topics and Events is `https://sns.mnq.fr-par.scaleway.com`. For the access and secret key values, use the credentials you [generated](/topics-and-events/how-to/create-credentials/) for Topics and Events. -Once connected, you can use any of the SDK's available functions. However, some functions are not [supported by Scaleway Topics and Events](/messaging/reference-content/sns-support), so do check the link to make sure. See the [official SDK documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-sns/) for more information, or keep reading for some code examples. +Once connected, you can use any of the SDK's available functions. However, some functions are not [supported by Scaleway Topics and Events](/topics-and-events/reference-content/sns-support), so do check the link to make sure. See the [official SDK documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-sns/) for more information, or keep reading for some code examples. ### Create topic (NodeJS) diff --git a/pages/topics-and-events/api-cli/sqs-sns-aws-cli.mdx b/pages/topics-and-events/api-cli/topics-events-aws-cli.mdx similarity index 64% rename from pages/topics-and-events/api-cli/sqs-sns-aws-cli.mdx rename to pages/topics-and-events/api-cli/topics-events-aws-cli.mdx index ac152c9f78..061a8b4004 100644 --- a/pages/topics-and-events/api-cli/sqs-sns-aws-cli.mdx +++ b/pages/topics-and-events/api-cli/topics-events-aws-cli.mdx @@ -1,72 +1,28 @@ --- meta: - title: Using Scaleway Queues and Scaleway Topics and Events with the AWS-CLI - description: This page explains how to use Scaleway Queues and Scaleway Topics and Events for creating queues and sending and receiving messages with the AWS CLI + title: Using Scaleway Topics and Events with the AWS-CLI + description: This page explains how to use Scaleway Topics and Events for creating topics and sending and receiving messages with the AWS CLI content: - h1: Using Scaleway Queues and Scaleway Topics and Events with the AWS-CLI - paragraph: This page explains how to use Scaleway Queues and Scaleway Topics and Events for creating queues and sending and receiving messages with the AWS CLI -tags: messaging sns sqs aws-cli cli aws queues messages subscribe publish + h1: Using Scaleway Topics and Events with the AWS-CLI + paragraph: This page explains how to use Scaleway Topics and Events for creating topics and sending and receiving messages with the AWS CLI +tags: messaging sns aws-cli cli aws messages subscribe publish topics categories: - messaging dates: - validation: 2024-10-18 + validation: 2025-04-10 posted: 2023-04-04 -validation_frequency: 8 --- -The AWS-CLI is an open-source tool built on top of the AWS SDK for Python (Boto) that provides commands for interacting with AWS services. Once you have [connected Scaleway Queues and/or Topics and Events to the AWS-CLI](/messaging/api-cli/connect-aws-cli/), you can start creating, listing and managing your queues and topics, sending messages and much more, all from your command line. +The AWS-CLI is an open-source tool built on top of the AWS SDK for Python (Boto) that provides commands for interacting with AWS services. Once you have [connected Scaleway Topics and Events to the AWS-CLI](/topics-and-events/api-cli/connect-aws-cli/), you can start creating, listing and managing your topics, sending messages and much more, all from your command line. - A Scaleway account logged into the [console](https://console.scaleway.com) - [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization -- Valid [credentials](/messaging/how-to/create-credentials/) for Queues and/or Topics and Events -- [Connected Queues and/or Topics and Events to the AWS-CLI](/messaging/api-cli/connect-aws-cli/) +- Valid [credentials](/topics-and-events/how-to/create-credentials/) for Topics and Events +- [Connected Topics and Events to the AWS-CLI](/topics-and-events/api-cli/connect-aws-cli/) - [jq](https://stedolan.github.io/jq/download/) installed on your machine -## Getting started with Scaleway Queues - -1. Use the following command to create a queue: - - ```sh - aws sqs create-queue --queue-name MyQueue | tee my-queue.json - ``` - -2. Use the following command to list existing queues: - - ```sh - aws sqs list-queues - ``` - -3. Use the following command to send messages to a queue: - - ```sh - aws sqs send-message --queue-url $(jq -r .QueueUrl my-queue.json) --message-body "Hello world!" - - aws sqs send-message --queue-url $(jq -r .QueueUrl my-queue.json) --message-body "Second Message." - ``` - -4. Use the following command to receive messages: - - ```sh - aws sqs receive-message --queue-url $(jq -r .QueueUrl my-queue.json) | tee message1.json - - aws sqs receive-message --queue-url $(jq -r .QueueUrl my-queue.json) | tee message2.json - ``` - -5. Use the following command to delete messages. This is necessary as once a message has been processed on your consumer side (typically by a worker), it will be re-queued unless it is explicitly deleted. - - ```sh - aws sqs delete-message --queue-url $(jq -r .QueueUrl my-queue.json) --receipt-handle $(jq -r .Messages[0].ReceiptHandle message1.json) - - aws sqs delete-message --queue-url $(jq -r .QueueUrl my-queue.json) --receipt-handle $(jq -r .Messages[0].ReceiptHandle message2.json) - ``` - -6. Use the following command to delete the queue itself: - - ```sh - aws sqs delete-queue --queue-url $(jq -r .QueueUrl my-queue.json) - ``` ## Getting started with Topics and Events @@ -82,7 +38,7 @@ The AWS-CLI is an open-source tool built on top of the AWS SDK for Python (Boto) aws sns list-topics ``` -### Preparing and subscribing to an HTTP/HTTPS target for Topics and Events messages +## Preparing and subscribing to an HTTP/HTTPS target for Topics and Events messages 1. Get the public endpoint of the HTTP server you want to forward your messages to. @@ -115,7 +71,7 @@ The AWS-CLI is an open-source tool built on top of the AWS SDK for Python (Boto) curl "" ``` -### Preparing and subscribing to a lambda (Scaleway Serverless Functions) target for Topics and Events messages +## Preparing and subscribing to a lambda (Scaleway Serverless Functions) target for Topics and Events messages 1. Create the function following the steps detailed in the [Scaleway Functions Quickstart](/serverless-functions/quickstart/). diff --git a/pages/topics-and-events/concepts.mdx b/pages/topics-and-events/concepts.mdx index fc9c67449c..7c5089ce11 100644 --- a/pages/topics-and-events/concepts.mdx +++ b/pages/topics-and-events/concepts.mdx @@ -15,133 +15,53 @@ dates: ## Content-based deduplication -Content-based deduplication is a setting available for [FIFO](#fifo) queues. Enable content-based deduplication if the message body is guaranteed to be unique for each message. A unique hash value is generated from the body of each message, which is used as its deduplication ID. This avoids the need to set a deduplication ID when sending messages. Read more in our dedicated documentation on [creating queues](/messaging/how-to/create-manage-queues/). +Content-based deduplication is a setting available for [FIFO](#fifo) topics. Enable content-based deduplication if the message body is guaranteed to be unique for each message. A unique hash value is generated from the body of each message, which is used as its deduplication ID. This avoids the need to set a deduplication ID when sending messages. Read more in our dedicated documentation on [creating topics](/topics-and-events/how-to/create-manage-topics/). ## Credentials -Credentials give services and platforms access to Scaleway NATS, Queues, and Topics and Events, enabling them to connect to the host system. Credentials are product-specific: for **Queues** and **Topics ad Events**, different levels of permissions can be defined to write, read, or manage queues/topics. NATS credentials give full read-write-manage access. Refer to our [additional content](/messaging/reference-content/) for more information. - -## Dead-letter queue - -A **D**ead-**l**etter **q**ueue (DLQ), or **undelivered-message queue**, receives and holds messages that cannot be delivered to their destination queues. A DLQ must be of the same type (FIFO or Standard), in the same Project and in the same region as the queue(s) it serves. Each DLQ also has an associated parameter: [maximum receive count](#maximum-receive-count). A single queue can serve as dead-letter queue to multiple source queues. - -If you designate a queue as a DLQ and its [storage quota](/organizations-and-projects/additional-content/organization-quotas/#queues) is reached, messages won't be redriven to the DLQ until enough free space is available again. If your DLQ is at its full quota, free up space by receiving and deleting messages from any queue in your Project. - -## Fanout - -Fanout is a type of messaging pattern. A fanout exchange broadcasts messages to all queues/consumers it is aware of. This allows the same published message to be consumed by different consumers, who will process it in different ways. Each message is processed in the order in which it arrives. +Credentials give services and platforms access to Topics and Events, enabling them to connect to the host system. Credentials for Scaleway Topics and Events define whether the bearer is allowed to write, and/or read, and/or manage topics and subscriptions. Refer to our [credentials documentation](/topics/how-to/create-credentials/) for more information. ## FIFO -FIFO stands for **F**irst **I**n **F**irst **O**ut, and represents a type of queue or topic where the exact order of messages is preserved, and duplicate messages are not tolerated. As well as these specificities, FIFO queues and topics support all the same features as the [Standard](#standard) type. Consider using FIFO queues and topics for any use cases where the order of messages is critical, such as e-commerce order management systems, systems where one action should not happen until another has been completed, or first-come-first-served ticketing systems. +FIFO stands for **F**irst **I**n **F**irst **O**ut, and represents a type of topic where the exact order of messages is preserved, and duplicate messages are not tolerated. As well as these specificities, FIFO topics support all the same features as the [Standard](#standard) type. Consider using FIFO topics for any use cases where the order of messages is critical, such as e-commerce order management systems, systems where one action should not happen until another has been completed, or first-come-first-served ticketing systems. ## Filtering In a [topic-based](#topic-based) system, where topics handle the logic, filtering is similar to routing. Messages are sent to defined topics, which can be thought of as filters in so far as subscribers can subscribe only to the topics they are interested in. In a [content-based](#content-based) system, filtering is carried out more directly by subscribers, who define filters for messages based on the content/attributes they want to receive. -## Long Polling - -Long polling is a technology where the client requests information from the server without expecting an immediate response. For [Queues](#queues), this enables clients to wait for the system to get messages that are not immediately available. - ## Message broker -A message broker is a piece of software that allows applications, systems and services to communicate with each other and send/receive data. It facilitates the exchange of information by receiving messages from a producer, and transmitting them to a consumer. All communication with producers and consumers uses a [protocol](#messaging-protocol). There are two basic models of communication for message brokers: [publish/subscribe](#publishsubscribe) and [queuing](#queuing). - -## Maximum receive count - -The maximum receive count is a setting that can be configured for a [dead-letter queue](#dead-letter-queue). It defines how many times a message can be received by consumers from the source queue before being moved to the dead-letter queue. This value must be between 1 and 1,000. - -## Message retention period - -The message retention period is a setting that can be configured for a queue. It represents the length of time (in seconds) that messages are kept in the queue before being deleted. Setting a longer message retention period allows for a longer interval between a message being sent and it being received. Read more in our dedicated documentation on [creating queues](/messaging/how-to/create-manage-queues/). +A message broker is a piece of software that allows applications, systems and services to communicate with each other and send/receive data. It facilitates the exchange of information by receiving messages from a producer, and transmitting them to a consumer. Scaleway Topics and Events is a message broker tool based on the AWS SNS messaging system. ## Messaging and Queuing -Previously, Scaleway Messaging and Queuing was a single product that grouped together three different messaging protocols. It has now been split into three distinct products: [NATS](#nats), [Queues](#queues), and [Topics and Events](#topics-and-events). - -## Messaging protocol - -A messaging protocol defines a structured way for users / platforms / services / applications to exchange data and messages, even if normally they do not "speak the same language". Protocols also describe how messages should be processed, prioritized, managed and routed. Scaleway NATS is based on the [NATS](#nats) protocol, Queues on the [SQS](#sqs) protocol, and Topics and Events on the [SNS](#sns) protocol. - -## NATS - -The **N**eural **A**utonomic **T**ransport **S**ystem, or [NATS](https://nats.io/), is an open-source messaging system written in Go. It is part of the Cloud Native Computing Foundation (CNCF) and has more than 40 client language implementations. The application has been designed with performance, scalability, and ease of use in mind. - -Check our our [NATS quickstart](/messaging/quickstart/#quickstart-for-nats) to get started with Scaleway NATS, or our [tutorial](/tutorials/large-messages/) on creating a serverless architecture to process large messages with NATS, to get an idea of how to go further. - -## NATS account - -A NATS account sets a scope for any NATS credentials, messages, queues and streams held within it. You can create one or multiple NATS accounts with Scaleway NATS. - -## Protocol - -See [messaging protocol](#messaging-protocol). +Previously, Scaleway Messaging and Queuing was a single product that grouped together three different messaging protocols. It has now been split into three distinct products: [NATS](/nats/), [Queues](/queues), and [Topics and Events](/topics-and-events/). ## Publish/Subscribe -Also known as "pub/sub", the publish/subscribe model provides a pattern or framework for the exchange of messages between publishers and subscribers. It contrasts with the [queuing](#queuing) model. The key feature of publish/subscribe is that messages are not sent to defined recipients. Instead, subscribers define the types of message they are interested in, and only receive messages matching their criteria. The publisher sends the message without knowing exactly who will receive it. The process of selecting which messages to receive is called [filtering](#filtering), which can be [topic-based](#topic-based) or [content-based](#content-based). The publish/subscribe model relies on a [message broker](#message-broker) to relay messages between publishers and subscribers. - -## Queue - -Creating a queue with [Scaleway Queues](#queue) facilitates asynchronous communication between different microservices, applications, and platforms. You can create a queue, configure its delivery and message parameters, and then start sending messages to it. Messages are stored in the queue until they are processed and delivered, and deleted once consumed. [Read more about creating and configuring queues](/messaging/how-to/create-manage-queues/), or check our [tutorial on creating a serverless scraping architecture using a queue](/tutorials/create-serverless-scraping/) to get an idea of what you can do with message queues. - -## Queues - -Scaleway Queues is a product for creating managed messaging queues based on the [SQS](#sqs) protocol. Previously, it was part of the Messaging and Queuing product. - -## Queue types - -When creating queues with Scaleway Queues, two queue types are available. [Standard](#standard) queues provide at-least-once delivery, while [FIFO](#fifo) queues offer first-in-first-out delivery, and (unlike Standard queues) guarantee that messages are delivered in order and without duplication. [Content-based deduplication](#content-based-deduplication) is only available for FIFO queue types. Find out more about creating queues with our [dedicated documentation](/messaging/how-to/create-manage-queues/). - -## Queuing - -The message queuing model provides a pattern or framework for sending messages, which contrasts with the [publish/subscribe](#publishsubscribe) model. Queuing is a form of asynchronous service-to-service communication. Whereas with the publish/subscribe model multiple subscribers can receive each message, with the queuing model, messages have just one destination. Messages are stored in the queue until they are processed and delivered, and they are deleted once consumed. This model is used in serverless and microservices architectures. - -## Queue volume - -Queue volume is one of the factors affecting the billing of Scaleway Queues. Queue volume is calculated as the number of messages in a queue, multiplied by the message size. Or, the sum of the size of all messages in a queue. +Also known as "pub/sub", the publish/subscribe model provides a pattern or framework for the exchange of messages between publishers and subscribers. It contrasts with the [queuing](/queues/concepts/#queuing) model. The key feature of publish/subscribe is that messages are not sent to defined recipients. Instead, subscribers define the types of message they are interested in, and only receive messages matching their criteria. The publisher sends the message without knowing exactly who will receive it. ## Region -NATS, Queues, and Topics and Events are available in multiple regions. A region designates the geographical area where the service is hosted. Refer to the [product availability table](/account/reference-content/products-availability/) to check which regions are available for NATS, Queues, and Topics and Events. - -When [creating a NATS account](/messaging/how-to/get-started/#how-to-create-a-nats-account) or creating queues or topics, you need to do this on a region-by-region basis. The region drop-down in the console allows you to switch between available regions. +Topics and Events is available in multiple regions. A region designates the geographical area where the service is hosted. Refer to the [product availability table](/account/reference-content/products-availability/) to check which regions are available for Topics and Events. -## Routing - -In [topic-based](#topic-based) messaging, topics allow messages to be routed to the correct subscribers. Topics act as labels for each message, and the broker routes messages to subscribers who match the topic. +When creating topics, you need to do this on a region-by-region basis. The region drop-down in the console allows you to switch between available regions. ## SNS -The Scaleway **Topics and Events** product is based on the SNS protocol. **S**imple **N**otification **S**ervice, or SNS, is a [publish/subscribe](#publishsubscribe) notification service for the mass delivery of messages. SNS acts as a single message bus that can be sent to a variety of devices and platforms through a single code interface. It is also possible to adapt message formats to the particular needs of each platform. - -## SQS - -The Scaleway **Queues** product is based on the SNS protocol. **S**imple **Q**ueue **S**ervice, or SQS, is a distributed message [queuing](#queuing) service that supports programmatic sending of messages via web service applications. +Scaleway Topics and Events is based on the AWS SNS protocol. **S**imple **N**otification **S**ervice, or SNS, is a [publish/subscribe](#publishsubscribe) notification service for the mass delivery of messages. SNS acts as a single message bus that can be sent to a variety of devices and platforms through a single code interface. It is also possible to adapt message formats to the particular needs of each platform. ## Standard -Standard-type queues and topics represent the default queue/topic type, and offer an at-least-once message delivery system. Unlike [FIFO](#fifo) queues and topics, standard queues provide only best-effort attempts to deliver messages in order. At-least-once delivery means that it is possible under rare circumstances that the same message may be received more than once. - -## Stream - -Distinct from traditional message brokers where messages are deleted once received/consumed, streams retain records of their events. A streaming broker is therefore often likened to a distributed append-only logs file, where every new message is added at the end of the persistent log. Each message can be delivered to one or more consumers. - -## Stream volume - -Stream volume is one of the factors affecting the billing of Scaleway NATS. Stream volume is calculated as the number of messages in a stream, multiplied by the message size. Or, the sum of the size of all messages in a stream. - -## Stream persistence - -Stream persistence is one of the factors affecting the billing of Scaleway NATS. Stream persistence is calculated as the total amount stored in a stream, multiplied by the duration it is stored for. +Standard-type topics represent the default topic type, and offer an at-least-once message delivery system. Unlike [FIFO](#fifo) topics, standard topics provide only best-effort attempts to deliver messages in order. At-least-once delivery means that it is possible under rare circumstances that the same message may be received more than once. ## Subscriber -In [publish/subscribe](#publishsubscribe) systems such as [Topics and Events](#topics-and-events), a subscriber is the entity (e.g. a queue, function, or URL) that messages from topics are pushed to. Subscribers can filter messages based on their topic or content. +In [Topics and Events](#topics-and-events), a subscriber is the entity (e.g. a queue, function, or URL) that messages from topics are pushed to. Subscribers can filter messages based on their topic or content. ## Subscription -A subscription is a connection between a client or endpoint, and a topic. By creating a subscription, the subscribed endpoint receives messages and notifications published to the topic. You can [create subscriptions](/messaging/how-to/create-manage-subscriptions/) for HTTP/S endpoints, Scaleway queues, and Scaleway Serverless [Functions](/serverless-functions/quickstart/) and [Containers](/serverless-containers/quickstart/). +A subscription is a connection between a client or endpoint, and a topic. By creating a subscription, the subscribed endpoint receives messages and notifications published to the topic. You can [create subscriptions](/topics-and-events/how-to/create-manage-subscriptions/) for HTTP/S endpoints, Scaleway queues, and Scaleway Serverless [Functions](/serverless-functions/quickstart/) and [Containers](/serverless-containers/quickstart/). ## Subscription protocols and endpoints @@ -149,22 +69,18 @@ A subscription protocol refers to the communication method used to deliver messa | Protocol | Endpoint / Client | Note | |-------------------------------------|--------------------------------------------------|-----------------------------------| -| HTTP | The URL of a service or web server that can receive notifications (HTTP POST requests) from Topics and Events, e.g. `http://example.fr` | - For security reasons, we recommend using the HTTPS protocol rather than HTTP.
- HTTP subscriptions must be [confirmed](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription) after creation | -| HTTPS | The URL of a service or web server that can receive notifications (HTTPS POST requests) from Topics and Events, e.g. `https://example.fr` | - HTTPS subscriptions must be [confirmed](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription) after creation | +| HTTP | The URL of a service or web server that can receive notifications (HTTP POST requests) from Topics and Events, e.g. `http://example.fr` | - For security reasons, we recommend using the HTTPS protocol rather than HTTP.
- HTTP subscriptions must be [confirmed](/topics-and-events/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription) after creation | +| HTTPS | The URL of a service or web server that can receive notifications (HTTPS POST requests) from Topics and Events, e.g. `https://example.fr` | - HTTPS subscriptions must be [confirmed](/topics-and-events/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription) after creation | | Serverless Functions and Containers | A Scaleway Serverless [Function](/serverless-functions/quickstart/) or [Container](/serverless-containers/quickstart/)
| - It must have a [public](/serverless-functions/concepts/#privacy-policy) privacy policy
- It must be in a [namespace](/serverless-functions/concepts/#namespace) from the same [Project](/organizations-and-projects/concepts/#project) and [region](#region) as the topic | -| Queues | A Scaleway [queue](#queue)
| - It must be in the same [Project](/organizations-and-projects/concepts/#project) and [region](#region) as the topic | +| Queues | A Scaleway [queue](/queues/)
| - It must be in the same [Project](/organizations-and-projects/concepts/#project) and [region](#region) as the topic | ## Topic -A topic is a communication channel used to send messages and notifications to subscribed endpoints or clients. Publishers send messages to topics, and those messages are received by subscribers. Subscribers can include Serverless Functions, Scaleway queues and HTTP/HTTPS endpoints. As such, topics decouple the publishing and the receiving of messages, allowing for flexibility and scalabilty in building loosely-coupled systems. +A topic is a communication channel used to send messages and notifications to subscribed endpoints or clients. Publishers send messages to topics, and those messages are received by subscribers. Subscribers can include Serverless Functions, Scaleway Queues and HTTP/HTTPS endpoints. As such, topics decouple the publishing and the receiving of messages, allowing for flexibility and scalabilty in building loosely-coupled systems. ## Topic types -When creating topics with Scaleway Topics and Events, two topic types are available. [Standard](#standard) topics provide at-least-once delivery, while [FIFO](#fifo) topics offer first-in-first-out delivery, and (unlike Standard topics) guarantee that messages are delivered in order and without duplication. [Content-based deduplication](#content-based-deduplication) is only available for FIFO topic types. Find out more about creating topics with our [dedicated documentation](/messaging/how-to/create-manage-topics/). - -## Topic-based - -Topic-based messaging systems are a subset of the [publish/subscribe](#publishsubscribe) model, and contrast with [content-based](#content-based) systems. In a topic-based system, messages are published to "topics" or named logical channels. See [topic](#topic) for more information. +When creating topics with Scaleway Topics and Events, two topic types are available. [Standard](#standard) topics provide at-least-once delivery, while [FIFO](#fifo) topics offer first-in-first-out delivery, and (unlike Standard topics) guarantee that messages are delivered in order and without duplication. [Content-based deduplication](#content-based-deduplication) is only available for FIFO topic types. Find out more about creating topics with our [dedicated documentation](/topics-and-events/how-to/create-manage-topics/). ## Topic volume @@ -173,7 +89,3 @@ Topic volume is one of the factors affecting the billing of Scaleway Topics and ## Topics and Events Scaleway Topics and Events is a product for creating managed messaging topics based on the [SNS](#sns) protocol. Previously, it was part of the Messaging and Queuing product. - -## Visibility timeout - -Visibility timeout is a setting that can be configured for a Scaleway queue. It represents the length of time (in seconds) during which, after a message is received, the queue hides it, so it cannot be received again by the same or other consumers. This is useful as the queue itself does not automatically delete messages once they are received, and so prevents consumers from receiving the same message many times before they have finished processing it. Read more in our dedicated documentation on [creating queues](/messaging/how-to/create-manage-queues/). diff --git a/pages/topics-and-events/faq.mdx b/pages/topics-and-events/faq.mdx index 29fdf41f40..0063005a6c 100644 --- a/pages/topics-and-events/faq.mdx +++ b/pages/topics-and-events/faq.mdx @@ -1,46 +1,34 @@ --- meta: - title: NATS, Queues, and Topics and Events FAQ - description: Discover Scaleway NATS, Queues, and Topics and Events, and get answers to common questions about the different protocols available, compatibility with various services, and billing. + title: Topics and Events FAQ + description: Discover Scaleway Topics and Events, and get answers to common questions about the different protocols available, compatibility with various services, and billing. content: - h1: Messaging and Queuing FAQ + h1: Topics and Events FAQ dates: - validation: 2024-12-04 + validation: 2025-04-10 category: serverless -productIcon: NatsProductIcon +productIcon: SnsProductIcon --- -## What is NATS, Queues, and Topics and Events? +## What is Topics and Events? -These are three distinct managed message broker tools offered by Scaleway, based on the NATS, SQS and SNS protocols respectively. Previously, these products were grouped together as 'Messaging and Queuing', but have now become three separate products in their own right. +Scaleway Topics and Events is a product for creating managed messaging topics based on the AWS SNS protocol. Previously, it was part of the Messaging and Queuing product. -## What are NATS, SNS and SQS? +## What is SNS? -NATS, SNS and SQS are all messaging protocols used by the Scaleway NATS, Queues, and Topics and Events products. You can find out more about these protocols, and other essential concepts, on our dedicated [concepts page](/messaging/concepts/). - -## Is the Scaleway Queues gateway compatible with my application, framework or tool? - -We currently implement the API endpoints listed [here](/messaging/reference-content/sqs-support/), which makes Scaleway Queues compatible with the AWS SDK as well as many other tools and frameworks including KEDA and Symfony. Note that you need to specify both Regions and URL to ensure compatibility. +**S**imple **N**otification **S**ervice, or SNS, is a [publish/subscribe](/topics-and-events/concepts/#publishsubscribe) notification service for the mass delivery of messages. SNS acts as a single message bus that can be sent to a variety of devices and platforms through a single code interface. It is also possible to adapt message formats to the particular needs of each platform. ## Does Scaleway Topics and Events support all SNS features? The following subscriber types are supported: - HTTP/S clients - Serverless Functions and Containers -- Scaleway Queues queues - -For more details on supported and unsupported Topics and Events features, see our [dedicated page](/messaging/reference-content/sns-support/). - -## Can I configure Scaleway NATS via Terraform/OpenTofu? - -Yes, check out our [tutorial](https://registry.terraform.io/providers/scaleway/scaleway/latest/docs/guides/mnq_with_nats_terraform_provider) on how to configure Scaleway NATS with the Terraform/OpenTofu [NATS Jetstream provider](https://registry.terraform.io/providers/nats-io/jetstream/latest/docs). +- Scaleway Queues -## How are NATS, Queues, and Topics and Events billed? +For more details on supported and unsupported Topics and Events features, see our [dedicated page](/tpoics-and-events/reference-content/sns-support/). -Billing is based on: +## How is Topics and Events billed? -- For NATS: [Stream volume](/messaging/concepts/#stream-volume) (the total sum of each message's size going through the stream) and [stream persistence](/messaging/concepts/#stream-persistence) (the total amount of data stored * duration) -- For Queues: [Queue volume](/messaging/concepts/#queue-volume) (the total sum of each message's size going through the queue) -- For Topics and Events : [Topic Volume](/messaging/concepts/#queue-volume)(the total sum of each message's size going out from the topic to the subscriptions) +Billing is based on [topic Volume](/messaging/concepts/#queue-volume) (the total sum of each message's size going out from the topic to the subscriptions). For full pricing details, see our [dedicated pricing page](https://www.scaleway.com/en/pricing/). \ No newline at end of file diff --git a/pages/topics-and-events/how-to/create-credentials.mdx b/pages/topics-and-events/how-to/create-credentials.mdx index 16ee57b0c8..cf70a6eb8e 100644 --- a/pages/topics-and-events/how-to/create-credentials.mdx +++ b/pages/topics-and-events/how-to/create-credentials.mdx @@ -1,89 +1,27 @@ --- meta: - title: How to create credentials for NATS, Queues, or Topics and Events - description: Learn how to create credentials for Scaleway NATS, Queues, or Topics and Events (Messaging and Queuing). Securely manage access and ensure seamless integration with this step-by-step guide. + title: How to create Topics and Events + description: Learn how to create credentials for Scaleway Topics and Events. Securely manage access and ensure seamless integration with this step-by-step guide. content: - h1: How to create credentials for NATS, Queues, or Topics and Events - paragraph: Learn how to create credentials for Scaleway NATS, Queues, or Topics and Events (Messaging and Queuing). Securely manage access and ensure seamless integration with this step-by-step guide. + h1: How to create credentials for Scaleway Topics and Events + paragraph: Learn how to create credentials for Scaleway Topics and Events. Securely manage access and ensure seamless integration with this step-by-step guide. tags: credentials messaging queuing key token categories: - serverless dates: - validation: 2024-10-18 - posted: 2022-08-11 + validation: 2025-04-10 + posted: 2025-04-10 --- -This page shows how to create [credentials](/messaging/concepts/#credentials) for Scaleway **NATS**, **Queues** and **Topics and Events** (previously grouped together as the **Messaging and Queuing** product). Credentials give their bearer (e.g. services and platforms) access to your service. +This page shows how to create [credentials](/topics-and-events/concepts/#credentials) for Scaleway Topics and Events. Credentials give their bearer (e.g. services and platforms) access to your service. -You can create multiple sets of credentials for each of your NATS accounts, and for your Queues and Topics and Events services. +Credentials for Topics and Events are granular: you can define the level of access that they should give. Credentials give the specified level of access to all topics that you create in the region they are scoped to. You can create multiple sets of credentials for each of your Topics and Events services. - A Scaleway account logged into the [console](https://console.scaleway.com) - [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization -## How to create credentials for a NATS account - -Credentials for NATS accounts are not granular: they necessarily give full read and write access. The bearer of these credentials can publish and receive messages, as well as manage topics and streams, for this account. - -1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. - -2. Use the drop-down menu to select the [region](/messaging/concepts/#region) of the NATS account for which you want to create credentials. The list of your NATS accounts in the pre-selected region displays. - -3. Click the NATS account you want to generate credentials for. The account's **Overview** page displays. - - - -4. In the **Credentials** panel, click **Generate credentials**. A pop-up displays. - -5. Enter a name for these credentials, and click **Generate credentials**. - - The credentials are created and a button displays prompting you to download them in a `.creds` file. - - - - - The generated credentials are displayed only once. Make sure to download and safely store them before closing the window. - - -7. Click **Download** and save the file, before closing the window. - - You are returned to your NATs account's overview page. The name of your newly-generated credentials and their access level is displayed in the **Credentials** panel. - -## How to create credentials for Queues - -Credentials for Queues are granular: you can define the level of access that they should give. Credentials give the specified level of access to all queues that you create in the region they are scoped to. - -1. Click **Queues** in the **Serverless** section of the Scaleway console side menu. A list of your queues displays. - -2. Click the **Credentials** tab. - -3. Click **Generate credentials**. A pop-up displays: - - - -4. Choose a region that these credentials should be scoped to. - -5. Enter a name for these credentials. - -6. Select the required permissions for the credentials. You must choose at least one of **Write**, **Read** and **Manage**. You are free to select any combination of these permissions. - -7. Click **Generate credentials**. - - The credentials are created. The access key and secret key are displayed, and you are invited to copy them. - - - This is your only chance to view and save the secret key. Make sure that you copy it and save it somewhere securely. - - -8. Copy and save the credentials, before closing the window. - - You are returned to the **Credentials** tab. The name of your newly-generated credentials, along with the access key and access level are displayed. - -## How to create credentials for Topics and Events - -Credentials for Topics and Events are granular: you can define the level of access that they should give. Credentials give the specified level of access to all topics that you create in the region they are scoped to. - 1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. The **Topics and Events** dashboard displays. 2. Click the **Credentials** tab. diff --git a/pages/topics-and-events/how-to/create-manage-subscriptions.mdx b/pages/topics-and-events/how-to/create-manage-subscriptions.mdx index b8e05a5e43..fb5f914d3b 100644 --- a/pages/topics-and-events/how-to/create-manage-subscriptions.mdx +++ b/pages/topics-and-events/how-to/create-manage-subscriptions.mdx @@ -9,23 +9,23 @@ tags: messaging queuing subscriptions sns topics categories: - serverless dates: - validation: 2024-10-17 + validation: 2024-04-10 posted: 2024-02-06 --- -This page shows how to create and manage [subscriptions](/messaging/concepts/#subscription) with Scaleway Topics and Events (formerly part of the Messaging and Queuing product). When you create a subscription to a [topic](/messaging/concepts/#topic), you are effectively signing up an endpoint to receive all messages published to that topic. +This page shows how to create and manage [subscriptions](/topics-and-events/concepts/#subscription) with Scaleway Topics and Events (formerly part of the Messaging and Queuing product). When you create a subscription to a [topic](/topics-and-events/concepts/#topic), you are effectively signing up an endpoint to receive all messages published to that topic. - A Scaleway account logged into the [console](https://console.scaleway.com) - [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization -- An existing [topic](/messaging/how-to/create-manage-topics/) +- An existing [topic](/topics-and-events/how-to/create-manage-topics/) ## How to create a subscription 1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. -2. Use the dropdown menu to select the [region](/messaging/concepts/#region) of the topic you want to create a subscription for. +2. Use the dropdown menu to select the [region](/topics-and-events/concepts/#region) of the topic you want to create a subscription for. 3. Click the name of the topic you want to create a subscription for. @@ -45,7 +45,7 @@ This page shows how to create and manage [subscriptions](/messaging/concepts/#su You are prompted to enter the URL of the HTTP endpoint to subscribe, e.g. `example.com`. Note that the scheme (`http://`) is not required. - After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). + After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/topics-and-events/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). @@ -54,13 +54,13 @@ This page shows how to create and manage [subscriptions](/messaging/concepts/#su You are prompted to enter the URL of the HTTP endpoint to subscribe, e.g. `example.com`. Note that the scheme (`https://`) is not required. - After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). + After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/topics-and-events/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription).
Choose **Serverless Functions and Containers** to create a subscription for a Scaleway Serverless Function or Container that you have created. - You are prompted to select the **namespace** containing the Function or Container that you want to subscribe. Only namespaces in the same [Project](/organizations-and-projects/concepts/#project) and [region](/messaging/concepts/#region) as the topic can be selected. + You are prompted to select the **namespace** containing the Function or Container that you want to subscribe. Only namespaces in the same [Project](/organizations-and-projects/concepts/#project) and [region](/topics-and-events/concepts/#region) as the topic can be selected. You are prompted to select the Serverless Function or Container to subscribe. Only Functions and Containers with a public [privacy policy](/serverless-functions/concepts/#privacy-policy) can subscribe to an topic.
@@ -68,7 +68,7 @@ This page shows how to create and manage [subscriptions](/messaging/concepts/#su
Choose **Queues** to create a subscription for a Scaleway queue that you have created. - You are prompted to select the **queue** to subscribe. Only queues in the same [Project](/organizations-and-projects/concepts/#project) and [region](/messaging/concepts/#region) as the topic can be selected. + You are prompted to select the **queue** to subscribe. Only queues in the same [Project](/organizations-and-projects/concepts/#project) and [region](/topics-and-events/concepts/#region) as the topic can be selected. @@ -100,7 +100,7 @@ When you no longer want a subscribed endpoint or service to receive messages fro 1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. -2. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the subscription you want to delete. +2. Use the drop-down menu to select the [region](/topics-and-events/concepts/#region) containing the subscription you want to delete. 3. Click the topic containing the subscription you want to delete. diff --git a/pages/topics-and-events/how-to/create-manage-topics.mdx b/pages/topics-and-events/how-to/create-manage-topics.mdx index be9d69feda..30cca7bab6 100644 --- a/pages/topics-and-events/how-to/create-manage-topics.mdx +++ b/pages/topics-and-events/how-to/create-manage-topics.mdx @@ -9,11 +9,11 @@ tags: messaging queuing topics sns categories: - serverless dates: - validation: 2024-10-17 + validation: 2025-04-10 posted: 2023-12-27 --- -This page shows how to create and manage [topics](/messaging/concepts/#topic) with Scaleway Topics and Events (formerly part of the Messaging and Queuing product). +This page shows how to create and manage [topics](/topics-and-events/concepts/#topic) with Scaleway Topics and Events. @@ -34,14 +34,14 @@ This page shows how to create and manage [topics](/messaging/concepts/#topic) wi 5. Choose a **topic type**. The following topic types are available: - **Standard**: Ensures at-least-once message delivery, where the order of messages is not preserved. Supports Serverless Functions, Serverless Containers and HTTP/S subscriptions. - - **FIFO**: Provides first-in-first-out delivery, where the order of messages is preserved without duplication. Supports Scaleway Queues subscriptions. [Content-based deduplication](/messaging/concepts/#content-based-deduplication) is only available for FIFO topics. + - **FIFO**: Provides first-in-first-out delivery, where the order of messages is preserved without duplication. Supports Scaleway Queues subscriptions. [Content-based deduplication](/topics-and-events/concepts/#content-based-deduplication) is only available for FIFO topics. 6. Click **Create topic** to finish. You are returned to the **Topics** tab, where your newly-created topic now displays. The topic's URL is also displayed here, for use in your API/CLI operations. -Remember that you need to [create credentials](/messaging/how-to/create-credentials/) in order to access your Topics and Events service and its topics from an API or CLI. Sending messages to topics requires that credentials have the `can_publish` permission, while receiving messages from topics requires the `can_receive` permission. You can create separate credentials if you need to isolate these two roles in your application. +Remember that you need to [create credentials](/topics-and-events/how-to/create-credentials/) in order to access your Topics and Events service and its topics from an API or CLI. Sending messages to topics requires that credentials have the `can_publish` permission, while receiving messages from topics requires the `can_receive` permission. You can create separate credentials if you need to isolate these two roles in your application. ## How to delete a topic @@ -50,7 +50,7 @@ When you no longer want a topic, you can delete it. This action is irreversible 1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. -2. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the topic you want to delete. +2. Use the drop-down menu to select the [region](/topics-and-events/concepts/#region) containing the topic you want to delete. 3. Either: - Click the topic you wish to delete, and navigate to its **Settings** page. Click the **Delete topic** button in the bottom right corner, or diff --git a/pages/topics-and-events/how-to/deactivate-delete-messaging.mdx b/pages/topics-and-events/how-to/deactivate-delete-messaging.mdx deleted file mode 100644 index f8ef3f4fbe..0000000000 --- a/pages/topics-and-events/how-to/deactivate-delete-messaging.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -meta: - title: How to delete a NATS, Queues, or Topics and Events service - description: Delete Scaleway NATS, Queues, or Topics and Events effectively. Safely remove resources with this straightforward guide. -content: - h1: How to delete a NATS, Queues, or Topics and Events service - paragraph: Delete Scaleway NATS, Queues, or Topics and Events services effectively. Safely remove resources with this straightforward guide. -dates: - validation: 2024-10-17 - posted: 2023-10-03 -tags: delete messaging queuing queueing messaging-and-queuing service disable deactivate nats-account stop -categories: - - serverless ---- - -This page shows how to delete a Scaleway **NATS**, account. - -Note that it is no longer necessary to deactivate services for **Queues** or **Topics and Events**: simply delete the queues, topics, subscriptions or other associated resources for the product directly. - - - -- A Scaleway account logged into the [console](https://console.scaleway.com) -- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization -- At least one [NATS account](/messaging/how-to/get-started/), [queue](/messaging/how-to/create-manage-queues/), or [topic](/messaging/how-to/create-manage-topics/) - -## How to delete a NATS account - -1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. - -2. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the NATS account you want to delete. - -3. Click the NATS account you want to delete. - -4. In the bottom panel, click the **Delete NATS account** button. - - A pop-up displays, reminding you that the action is irreversible, and any associated queued messages and credentials will be deleted. - -5. Type `DELETE` and click **Delete NATS account** to confirm. - - -Repeat the process above for each NATS account you want to delete. Remember to use the region drop-down as appropriate to access the different NATS accounts you hold in different regions. - - - - diff --git a/pages/topics-and-events/how-to/get-started.mdx b/pages/topics-and-events/how-to/get-started.mdx deleted file mode 100644 index 639996edfa..0000000000 --- a/pages/topics-and-events/how-to/get-started.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -meta: - title: How to get started with NATS, Queues, or Topics and Events - description: Kickstart your journey with Scaleway NATS, Queues, or Topics and Events. Learn how to set up, manage, and optimize your NATS, Queues, and Topics and Events services effortlessly. -content: - h1: How to get started with NATS, Queues, or Topics and Events - paragraph: Kickstart your journey with Scaleway NATS, Queues, or Topics and Events. Learn how to set up, manage, and optimize your NATS, Queues, and Topics and Events effortlessly. -tags: messaging queuing enable disable nats sqs sns nats-account account create -categories: - - serverless -dates: - validation: 2024-10-17 - posted: 2023-10-03 ---- - -This page shows how to get started with Scaleway **NATS**, **Queues** or **Topics and Events** (previously grouped together as the **Messaging and Queuing** product). - -The process differs depending on the [messaging protocol](/messaging/concepts/#messaging-protocol) you want to use: - -- For NATS, you need to **create a NATS account**. -- For **Queues** and **Topics and Events**, you no longer need to activate the protocol, but can proceed directly to [creating queues](/messaging/how-to/create-manage-queues) and/or [topics](/messaging/how-to/create-manage-topics). - - - -- A Scaleway account logged into the [console](https://console.scaleway.com) -- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization - -## How to create a NATS account - -To start using a NATS message broker, you must first create a NATS account. This sets a scope for your NATS credentials, messages, queues and stream. - -1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. - -2. Click **Create a NATS account**. The creation wizard displays. - - - -3. Complete the following steps in the wizard: - - - Choose a **region**, which is the geographical location in which your NATS account will be created. - - Enter a **name** for your NATS account, or use the auto-generated name suggested for you. - - Optional: Use the *Estimated cost** calculator to simulate how messages sent and stored with NATS streams will be billed. Note that simply creating a NATS account does not in itself incur any billing. For more information about NATS billing, see the [FAQ](/messaging/faq/#how-are-nats-queues-and-topics-and-events-billed). - - Click **Create NATS account** to finish. - - You are directed to the listing of your NATS accounts, where your newly-created NATS account now appears. - - - You can create more NATS accounts in your pre-selected region if you wish, by clicking on the `+ Create NATS account` button. To create NATS accounts in other regions, repeat the steps above starting from step 2 and selecting the required region. - - - -## How to activate Queues or Topics and Events - -For **Queues** and **Topics and Events**, you no longer need to activate the individual protocols. Proceed directly to [creating queues](/messaging/how-to/create-manage-queues) or [topics](/messaging/how-to/create-manage-topics) directly. \ No newline at end of file diff --git a/pages/topics-and-events/how-to/manage-credentials.mdx b/pages/topics-and-events/how-to/manage-credentials.mdx index 4ea9a79652..fe2c64412e 100644 --- a/pages/topics-and-events/how-to/manage-credentials.mdx +++ b/pages/topics-and-events/how-to/manage-credentials.mdx @@ -1,12 +1,12 @@ --- meta: - title: How to manage credentials for NATS, Queues, or Topics and Events - description: Master managing credentials for Scaleway NATS, Queues, or Topics and Events (Messaging and Queuing)! Follow this guide to securely update, rotate, and control access to your messaging services. + title: How to manage credentials for Topics and Events + description: Master managing credentials for Scaleway Topics and Events. Follow this guide to securely update, rotate, and control access to your messaging services. content: - h1: How to manage credentials for NATS, Queues, or Topics and Events - paragraph: Master managing credentials for Scaleway NATS, Queues, or Topics and Events (Messaging and Queuing)! Follow this guide to securely update, rotate, and control access to your messaging services. + h1: How to manage credentials for Topics and Events + paragraph: Master managing credentials for Scaleway Topics and Events. Follow this guide to securely update, rotate, and control access to your messaging services. dates: - validation: 2024-10-17 + validation: 2025-04-10 posted: 2022-08-11 tags: manage credentials messaging queuing permissions update revoke categories: @@ -15,27 +15,23 @@ categories: Credentials give their bearer (e.g. services and platforms) access to your service. -This page shows how to manage [credentials](/messaging/concepts/#credentials) for Scaleway **NATS**, **Queues** and **Topics and Events** (previously grouped together as the **Messaging and Queuing** product). - -Credentials for **Queues** and **Topics and Events** can be updated to change their permissions, or revoked. **NATS** credentials can only be revoked, not updated. Once credentials are revoked, any user trying to use the credentials to connect to the service will be denied. +This page shows how to manage [credentials](/topics-and-events/concepts/#credentials) for Scaleway Topics and Events. Credentials can be updated to change their permissions, or revoked. Once credentials are revoked, any user trying to use the credentials to connect to the service will be denied. - A Scaleway account logged into the [console](https://console.scaleway.com) - [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization -- Valid [credentials](/messaging/how-to/create-credentials/) +- Valid [credentials](/topics-and-events/how-to/create-credentials/) -## How to update Queues or Topics and Events credentials +## How to update credentials -1. Click **Queues** or **Topics and Events** in the **Serverless** section of the Scaleway console side menu, depending on which type of credentials you want to update. +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. 2. Click the **Credentials** tab. -3. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the credentials you want to update. - -4. Click the button next to the credentials you want to update, and select **Update credentials**. A pop-up displays, such as the one below for Queues: +3. Use the drop-down menu to select the [region](/topics-and-events/concepts/#region) containing the credentials you want to update. - +4. Click the button next to the credentials you want to update, and select **Update credentials**. 5. Make the required updates to your credentials. You can modify the name, and the permissions. @@ -43,13 +39,13 @@ Credentials for **Queues** and **Topics and Events** can be updated to change th The credentials are updated and you are returned to the product's **Credentials** listing. -## How to revoke Queues or Topics and Events credentials +## How to revoke credentials -1. Click **Queues** or **Topics and Events** in the **Serverless** section of the Scaleway console side menu, depending on which type of credentials you want to revoke. +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu/ 2. Click the **Credentials** tab. -3. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the credentials you want to revoke. +3. Use the drop-down menu to select the [region](/topics-and-events/concepts/#region) containing the credentials you want to revoke. 4. Click the button next to the credentials you want to revoke and select **Revoke**. @@ -59,18 +55,4 @@ Credentials for **Queues** and **Topics and Events** can be updated to change th The credentials are revoked and you are returned to the product's **Credentials** listing. -## How to revoke NATS credentials - -1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. - -2. Select the NATS account you want to revoke credentials for. - -3. In the **Credentials** panel, click the button next to the credentials you want to revoke. - - A pop-up displays, warning you that this action is irreversible and the key will no longer be able to access your service. - -5. Click **Revoke credentials**. - - The credentials are revoked and you are returned to the NATS account's **Overview** page. - diff --git a/pages/topics-and-events/how-to/monitor-mnq-cockpit.mdx b/pages/topics-and-events/how-to/monitor-mnq-cockpit.mdx deleted file mode 100644 index c957711a74..0000000000 --- a/pages/topics-and-events/how-to/monitor-mnq-cockpit.mdx +++ /dev/null @@ -1,49 +0,0 @@ ---- -meta: - title: How to monitor NATS, Queues, and Topics and Events with Scaleway Cockpit - description: Monitor your NATS, Queues, and Topics and Events services with Scaleway Cockpit. This guide helps you track performance to manage your messaging services efficiently. -content: - h1: How to monitor NATS, Queues, and Topics and Events with Scaleway Cockpit - paragraph: Monitor your NATS, Queues, and Topics and Events services with Scaleway Cockpit. This guide helps you track performance to manage your messaging services efficiently. -tags: messaging queuing queueing cockpit metrics observability -categories: - - serverless -dates: - validation: 2024-10-17 - posted: 2023-09-07 ---- - -You can view metrics for your NATS, Queues, and Topics and Events services via [Scaleway Cockpit](/cockpit/quickstart/). This allows you to monitor your queues/streams and messages at a glance. There are two steps to complete to view your metrics for the first time with Cockpit: - -1. Generate your Grafana credentials -2. Access the product's metrics dashboard - -These steps are described below. - - - -- A Scaleway account logged into the [console](https://console.scaleway.com) -- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization -- At least one [NATS account](/messaging/how-to/get-started/), [queue](/messaging/how-to/create-manage-queues/), or [topic](/messaging/how-to/create-manage-topics/) - -## How to activate your Cockpit - -Scaleway Cockpit is activated by default if you have created [Scaleway resources integrated with Cockpit](/cockpit/reference-content/cockpit-limitations/#product-integration-into-cockpit). - -## How to generate Grafana credentials - -To view your metrics with Cockpit, you will use a Grafana dashboard which is accessible from the Scaleway console. First, you must create a user and their associated credentials (a username and password) for Grafana. This can be done directly from the Scaleway console, [by following this procedure](/cockpit/how-to/retrieve-grafana-credentials/). - -## How to access your NATS, Queues, or Topics and Events dashboard and view your metrics - -1. Click **NATS**, **Queues** or **Topics and Events** in the **Serverless** section of the Scaleway console side menu. - -2. Click the **protocol** you want to view metrics for, and navigate to the **Metrics** tab. - -3. Click **Open Grafana metrics dashboard**. - -4. Enter your Grafana username and password to log in. - - You are directed to the dashboard for the product in question, where you can view all your metrics. - - diff --git a/pages/topics-and-events/how-to/monitor-topics-cockpit.mdx b/pages/topics-and-events/how-to/monitor-topics-cockpit.mdx new file mode 100644 index 0000000000..fa585c3d2b --- /dev/null +++ b/pages/topics-and-events/how-to/monitor-topics-cockpit.mdx @@ -0,0 +1,41 @@ +--- +meta: + title: How to monitor Topics and Events with Scaleway Cockpit + description: Monitor Topics and Events services with Scaleway Cockpit. This guide helps you track performance to manage your messaging services efficiently. +content: + h1: How to monitor Topics and Events with Scaleway Cockpit + paragraph: Monitor Topics and Events services with Scaleway Cockpit. This guide helps you track performance to manage your messaging services efficiently. +categories: + - serverless +dates: + validation: 2025-04-10 + posted: 2023-09-07 +--- + +You can view metrics for Topics and Events via [Scaleway Cockpit](/cockpit/quickstart/). This allows you to monitor your topics and messages at a glance. There are two steps to complete to view your metrics for the first time with Cockpit: + +1. Generate your Grafana credentials +2. Access the product's metrics dashboard + +These steps are described below. + + + +- A Scaleway account logged into the [console](https://console.scaleway.com) +- [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization + +## How to generate Grafana credentials + +To view your metrics with Cockpit, you will use a Grafana dashboard which is accessible from the Scaleway console. First, you must create a user and their associated credentials (a username and password) for Grafana. This can be done directly from the Scaleway console, [by following this procedure](/cockpit/how-to/retrieve-grafana-credentials/). + +## How to access your Topics and Events dashboard and view your metrics + +1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. + +2. Click the **Metrics** tab. + +3. Click **Open Grafana metrics dashboard**. + +4. Enter your Grafana username and password to log in. + + You are directed to the Topics and Events dashboard, where you can view all your metrics. \ No newline at end of file diff --git a/pages/topics-and-events/index.mdx b/pages/topics-and-events/index.mdx index 89f6a6c8a3..1b7abebfd6 100644 --- a/pages/topics-and-events/index.mdx +++ b/pages/topics-and-events/index.mdx @@ -1,15 +1,15 @@ --- meta: - title: NATS, Queues, and Topics and Events Documentation - description: Explore Scaleway NATS, Queues, and Topics and Events. Simplify your microservice workflows with scalable, reliable, and cost-effective message handling solutions. + title: Topics and Events Documentation + description: Explore Scaleway Topics and Events. Simplify your microservice workflows with scalable, reliable, and cost-effective message handling solutions. --- ## Getting Started @@ -18,30 +18,30 @@ meta: @@ -49,16 +49,6 @@ meta: ## Tutorials - - ## Changelog diff --git a/pages/topics-and-events/quickstart.mdx b/pages/topics-and-events/quickstart.mdx index 441abf33e0..f728b64530 100644 --- a/pages/topics-and-events/quickstart.mdx +++ b/pages/topics-and-events/quickstart.mdx @@ -1,177 +1,26 @@ --- meta: - title: NATS, Queues, and Topics and Events - Quickstart - description: Get started with Scaleway's serverless NATS, Queues, and Topics and Events services. This quickstart guide helps you easily set up and manage scalable messaging solutions in minutes. + title: Topics and Events - Quickstart + description: Get started with Scaleway Topics and Events. This quickstart guide helps you easily set up and manage scalable messaging solutions in minutes. content: - h1: NATS, Queues, and Topics and Events - Quickstart - paragraph: Get started with Scaleway's serverless NATS, Queues, and Topics and Events services. This quickstart guide helps you easily set up and manage scalable messaging solutions in minutes. + h1: Topics and Events - Quickstart + paragraph: Get started with Scaleway Topics and Events. This quickstart guide helps you easily set up and manage scalable messaging solutions in minutes. dates: - validation: 2024-10-18 - posted: 2022-08-29 -tags: messaging queuing queueing quickstart messaging-and-queuing nats sqs sls message-broker queues topics messages streams + validation: 2025-04-10 + posted: 2025-04-10 +tags: messaging queuing message-broker topics messages subscriptions events categories: - serverless --- -Scaleway NATS, Queues, and Topics and Events are [message broker](/messaging/concepts/#messaging-and-queuing) tools that allows you to transfer messages between different microservices and platforms. This enables them to "talk" to each other effectively even if they are not otherwise compatible. These brokers enable and simplify microservices application development and allows you to build highly scalable, reliable, distributed applications. - -NATS, Queues, and Topics and Events were previously grouped together as the Messaging and Queuing product, and have now become three separate products in their own right. Read on to learn how to get started with your product of choice +Scaleway Topics and Events is a message broker tool that allows you to transfer messages between different microservices and platforms. This enables them to "talk" to each other effectively even if they are not otherwise compatible. Topics and Events enable and simplify microservices application development and allows you to build highly scalable, reliable, distributed applications. - A Scaleway account logged into the [console](https://console.scaleway.com) - [Owner](/iam/concepts/#owner) status or [IAM permissions](/iam/concepts/#permission) allowing you to perform actions in the intended Organization -## Quickstart for NATS - -### How to create a NATS account - -To start using a NATS message broker, you must first create a NATS account. This sets a scope for your NATS credentials, messages, queues and stream. - -1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. - -2. Click **Create a NATS account**. The creation wizard displays. - - - -3. Complete the following steps in the wizard: - - - Choose a **region**, which is the geographical location in which your NATS account will be created. - - Enter a **name** for your NATS account, or use the auto-generated name suggested for you. - - Optional: Use the *Estimated cost** calculator to simulate how messages sent and stored with NATS streams will be billed. Note that simply creating a NATS account does not in itself incur any billing. For more information about NATS billing, see the [FAQ](/messaging/faq/#how-are-nats-queues-and-topics-and-events-billed). - - Click **Create NATS account** to finish. - - You are directed to the listing of your NATS accounts, where your newly-created NATS account now appears. - -### How to create NATS credentials - -Credentials for NATS accounts are not granular: they necessarily give full read and write access. The bearer of these credentials can publish and receive messages, as well as manage topics and streams, for this account. - -1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. - -2. Use the drop-down menu to select the [region](/messaging/concepts/#region) of the NATS account for which you want to create credentials. The list of your NATS accounts in the pre-selected region displays. - -3. Click the NATS account you want to generate credentials for. The account's **Overview** page displays. - - - -4. In the **Credentials** panel, click **Generate credentials**. A pop-up displays. - -6. Enter a name for these credentials, and click **Generate credentials**. - - The credentials are created and a button displays prompting you to download them in a `.creds` file. - - - - - The generated credentials are displayed only once. Make sure to download and safely store them before closing the window. - - -7. Click **Download** and save the file, before closing the window. - - You are returned to your NATs account's overview page. The name of your newly-generated credentials and their access level is displayed in the **Credentials** panel. - -### How to create and manage queues, messages and streams - -All further actions related to publishing, processing and managing messages, subjects, queues and streams can be done via a supported CLI or SDK. See our documentation on [NATS CLI and SDKs](/messaging/reference-content/nats-overview/#further-actions-nats-cli-and-nats-sdk) for more information. You can also check out our tutorial on [creating a serverless architecture for handling large messages](/tutorials/large-messages/) with Scaleway Messaging and Queuing NATS. - -### How to delete a NATS account - -1. Click **NATS** in the **Serverless** section of the Scaleway console side menu. - -2. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the NATS account you want to delete. - -3. Click the NATS account you want to delete. - -4. In the bottom panel, click the **Delete NATS account** button. - - A pop-up displays, reminding you that the action is irreversible, and any associated queued messages and credentials will be deleted. - -5. Type `DELETE` and click **Delete NATS account** to confirm. - - -## Quickstart for Queues - -### How to create credentials for Queues - -Credentials for Queues are granular: you can define the level of access that they should give. Credentials give the specified level of access to all queues that you create in the region they are scoped to. - -1. Click **Queues** in the **Serverless** section of the Scaleway console side menu. A list of your queues displays. - -2. Click the **Credentials** tab. - -3. Click **Generate credentials**. A pop-up displays: - - - -4. Choose a region that these credentials should be scoped to. - -5. Enter a name for these credentials. - -6. Select the required permissions for the credentials. You must choose at least one of **Write**, **Read** and **Manage**. You are free to select any combination of these permissions. - -7. Click **Generate credentials**. - - The credentials are created. The access key and secret key are displayed, and you are invited to copy them. - - - This is your only chance to view and save the secret key. Make sure that you copy it and save it somewhere securely. - - -8. Copy and save the credentials, before closing the window. - - You are returned to the **Credentials** tab. The name of your newly-generated credentials, along with the access key and access level are displayed. - -### How to create queues - -1. Click **Queues** in the **Serverless** section of the Scaleway console side menu. - -2. Click **Create queue**. The queue creation wizard displays. - - - -3. Select the [region](/messaging/concepts/#region) in which you want to create the queue. - -4. Enter a **name** for your queue. The name must be no more than 80 characters, and consist only of alphanumeric characters, hyphens, and underscores. Alternatively, you can go with the auto-generated name suggested for you. - -5. Choose your **Queue type**, from one of the following: - - **Standard**: Standard Queues ensure at-least-once delivery. The exact order of messages in the queue is not preserved. - - **FIFO**: FIFO Queues (**F**irst **In** **F**irst **O**ut) preserves the exact ordering of messages. - -6. Configure your queue's **parameters**. The following parameters can be defined: - - **Visibility timeout**: The length of time (in seconds) during which, after a message is received, it is hidden and cannot be received again by the same or other consumers. This is useful as the queue itself does not automatically delete messages once they are received, and so prevents consumers from receiving the same message many times before they have finished processing it. Therefore, the value set here should be informed by the expected length of time it will take consumers to process messages. The default value is 30 seconds. The value must be between 1 second and 43 200 seconds (12 hours). - - **Message retention period**: The length of time (in seconds) that messages are kept in the queue before being deleted. Setting a longer message retention period allows for a longer interval between a message being sent and it being received. The default value is 60 seconds. The value must be between 60 seconds and 1 209 600 seconds (14 days). - - **Maximum message size**: The maximum size (in kilobytes) of a message that can be sent to the queue. Messages greater than the defined size will be rejected. The default value is 256 KB. The value must be between 1 KB and 256 KB. - - **Content Based Deduplication**: This setting is only available for FIFO queues. Enable content-based deduplication if the message body is guaranteed to be unique for each message. A unique hash value is generated from the body of each message, which is used as its deduplication ID. This avoids the need to set a deduplication ID when sending messages. - - **Dead-letter queue**: Designate another queue to receive undelivered messages from this queue. If you select this option, you are prompted to select an existing queue as dead-letter queue. This queue must be of the same type, in the same Project and in the same region as the queue you are creating. You must also enter a value for the **maximum receive count** (how many times a message can be received from the source queue before being moved to the dead-letter queue). - -7. Click **Create queue** to finish. - -You are returned to the **Queues** tab, where your newly-created queue now displays. The queue's URL is also displayed here, for use in your API/CLI operations. - -### How to send and receive messages - -All further actions related to sending messages to queues can be done via a supported CLI or SDK. See our documentation on the [SQS CLI and SDKs](/messaging/reference-content/sqs-overview#further-actions) for more information. You can also check out [our tutorial](/tutorials/create-serverless-scraping/) on creating a serverless scraping architecture with Scaleway Queues. - -### How to delete a queue - -When you no longer want a queue, you can delete it. This action is irreversible and deletes the queue along with any queued messages. - -1. Click **Queues** in the **Serverless** section of the Scaleway console side menu. - -2. Use the drop-down menu to select the [region](/messaging/concepts/#region) of the queue you want to configure. - -3. Either: - - Click the queue you wish to delete. The queue's **Settings** page displays. Click the **Delete queue** button in the bottom right corner. - - Click the icon next to the queue you wish to delete, then select **Delete** from the menu that displays. - - A pop-up asks you to confirm that you understand this action will delete the queue and all your queued messages. - -4. Type **DELETE** and click **Delete queue**. - -## Quickstart for Topics and Events - -### How to create Topics and Events credentials +## How to create Topics and Events credentials Credentials for Topics and Events are granular: you can define the level of access that they should give. Credentials give the specified level of access to all topics that you create in the region they are scoped to. @@ -201,7 +50,7 @@ Credentials for Topics and Events are granular: you can define the level of acce You are returned to the **Credentials** tab. The name of your newly-generated credentials, along with the access key and access level are displayed. -### How to create topics +## How to create topics 1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. @@ -215,17 +64,17 @@ Credentials for Topics and Events are granular: you can define the level of acce 5. Choose a **topic type**. The following topic types are available: - **Standard**: Ensures at-least-once message delivery, where the order of messages is not preserved. Supports Serverless Functions, Serverless Containers and HTTP/S subscriptions. - - **FIFO**: Provides first-in-first-out delivery, where the order of messages is preserved without duplication. Supports Scaleway Queues subscriptions. [Content-based deduplication](/messaging/concepts/#content-based-deduplication) is only available for FIFO topics. + - **FIFO**: Provides first-in-first-out delivery, where the order of messages is preserved without duplication. Supports Scaleway Queues subscriptions. [Content-based deduplication](/topics-and-events/concepts/#content-based-deduplication) is only available for FIFO topics. 6. Click **Create topic** to finish. You are returned to the **Topics** tab, where your newly-created topic now displays. The topic's URL is also displayed here, for use in your API/CLI operations. -### How to create a subscription +## How to create a subscription 1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. -2. Use the dropdown menu to select the [region](/messaging/concepts/#region) of the topic you want to create a subscription for. +2. Use the dropdown menu to select the [region](/topics-and-events/concepts/#region) of the topic you want to create a subscription for. 3. Click the name of the topic you want to create a subscription for. @@ -245,7 +94,7 @@ You are returned to the **Topics** tab, where your newly-created topic now displ You are prompted to enter the URL of the HTTP endpoint to subscribe, e.g. `example.com`. Note that the scheme (`http://`) is not required. - After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). + After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/topics-and-events/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). @@ -254,13 +103,13 @@ You are returned to the **Topics** tab, where your newly-created topic now displ You are prompted to enter the URL of the HTTP endpoint to subscribe, e.g. `example.com`. Note that the scheme (`https://`) is not required. - After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). + After your HTTP subscription is created, you must confirm it. Find out how in our [dedicated documentation](/topics-and-events/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription).
Choose **Serverless Functions and Containers** to create a subscription for a Scaleway Serverless Function or Container that you have created. - You are prompted to select the **namespace** containing the Function or Container that you want to subscribe. Only namespaces in the same [Project](/organizations-and-projects/concepts/#project) and [region](/messaging/concepts/#region) as the topic can be selected. + You are prompted to select the **namespace** containing the Function or Container that you want to subscribe. Only namespaces in the same [Project](/organizations-and-projects/concepts/#project) and [region](/topics-and-events/concepts/#region) as the topic can be selected. You are prompted to select the Serverless Function or Container to subscribe. Only Functions and Containers with a public [privacy policy](/serverless-functions/concepts/#privacy-policy) can subscribe to a topic.
@@ -269,25 +118,25 @@ You are returned to the **Topics** tab, where your newly-created topic now displ Choose **Queues** to create a subscription for a Scaleway queue that you have created. - You are prompted to select the **queue** to subscribe. Only queues in the same [Project](/organizations-and-projects/concepts/#project) and [region](/messaging/concepts/#region) as the topic can be selected. + You are prompted to select the **queue** to subscribe. Only queues in the same [Project](/organizations-and-projects/concepts/#project) and [region](/topics-and-events/concepts/#region) as the topic can be selected. 7. Click **Create subscription** to finish. - The subscription is created. If you created an HTTP or HTTPS subscription, you will now need to [confirm it](/messaging/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). + The subscription is created. If you created an HTTP or HTTPS subscription, you will now need to [confirm it](/topics-and-events/how-to/create-manage-subscriptions/#how-to-confirm-an-http-or-https-subscription). -### How to publish messages +## How to publish messages -All further actions related to publishing messages to topics can be done via a supported CLI or SDK. See our documentation on the [SNS CLI and SDKs](/messaging/reference-content/sns-overview#further-actions)for more information. +All further actions related to publishing messages to topics can be done via a supported CLI or SDK. See our documentation on the [SNS CLI and SDKs](/topics-and-events/reference-content/sns-overview#further-actions)for more information. -### How to delete a topic +## How to delete a topic When you no longer want a topic, you can delete it. This action is irreversible and deletes the topic along with all its associated subscriptions. 1. Click **Topics and Events** in the **Serverless** section of the Scaleway console side menu. -2. Use the drop-down menu to select the [region](/messaging/concepts/#region) containing the topic you want to delete. +2. Use the drop-down menu to select the [region](/topics-and-events/concepts/#region) containing the topic you want to delete. 3. Either: - Click the topic you wish to delete, and navigate to its **Settings** page. Click the **Delete topic** button in the bottom right corner, or diff --git a/pages/topics-and-events/reference-content/index.mdx b/pages/topics-and-events/reference-content/index.mdx index b74fe93663..fcfcdbe04d 100644 --- a/pages/topics-and-events/reference-content/index.mdx +++ b/pages/topics-and-events/reference-content/index.mdx @@ -1,8 +1,8 @@ --- meta: - title: NATS, Queues, and Topics and Events - Additional content - description: NATS, Queues, and Topics and Events additional content + title: Topics and Events - Additional content + description: Topics and Events additional content content: - h1: NATS, Queues, and Topics and Events - Additional content - paragraph: NATS, Queues, and Topics and Events additional content + h1: Topics and Events - Additional content + paragraph: Topics and Events additional content --- diff --git a/pages/topics-and-events/reference-content/limitations.mdx b/pages/topics-and-events/reference-content/limitations.mdx index ed7ab269ea..c5f693efc0 100644 --- a/pages/topics-and-events/reference-content/limitations.mdx +++ b/pages/topics-and-events/reference-content/limitations.mdx @@ -1,23 +1,22 @@ --- meta: - title: NATS, Queues, and Topics and Events Limitations - description: Learn about the current limitations of Scaleway NATS, Queues, and Topics and Events + title: Topics and Events Limitations + description: Learn about the current limitations of Scaleway Topics and Events content: h1: Limitations - paragraph: Learn about the current limitations of Scaleway NATS, Queues, and Topics and Events -tags: messaging limitations space size storage payload max-streams max-consumers max-subscribers max-topics max-queues visibility-timeout + paragraph: Learn about the current limitations of Scaleway Topics and Events +tags: messaging limitations dates: - validation: 2024-10-18 + validation: 2025-04-10 posted: 2023-01-04 -validation_frequency: 8 categories: - serverless --- ## Usage limits -For the usage limits that apply when using Scaleway NATS, Queues, and Topics and Events, see the dedicated sections on our [Organization quotas](/organizations-and-projects/additional-content/organization-quotas/) page. Limits (quotas) apply to, for example, the maximum number of queues, streams, topics and consumers/subscribers, as well as to message retention duration and storage. +For the usage limits that apply when using Scaleway Topics and Events, see the dedicated sections on our [Organization quotas](/organizations-and-projects/additional-content/organization-quotas/) page. Limits (quotas) apply to, for example, the maximum number of topics, and consumers/subscribers, as well as to message retention duration and storage. ## VPC -NATS, Queues, and Topics and Events are not currently compatible with [Scaleway VPC](/vpc/quickstart/). +Topics and Events are not currently compatible with [Scaleway VPC](/vpc/quickstart/). diff --git a/pages/topics-and-events/reference-content/sns-overview.mdx b/pages/topics-and-events/reference-content/topics-and-events-overview.mdx similarity index 68% rename from pages/topics-and-events/reference-content/sns-overview.mdx rename to pages/topics-and-events/reference-content/topics-and-events-overview.mdx index d862ff1182..3cad047ce6 100644 --- a/pages/topics-and-events/reference-content/sns-overview.mdx +++ b/pages/topics-and-events/reference-content/topics-and-events-overview.mdx @@ -9,19 +9,19 @@ tags: messaging sns aws queuing publish-subscribe message-queue topic notificati categories: - serverless dates: - validation: 2024-10-18 + validation: 2025-04-10 posted: 2023-01-04 --- ## What is Scaleway Topics and Events? -Scaleway Topics and Events is a managed messaging service that facilitates the sending of notificatons or messages to a large number of subscribers, including email addresses, webhooks, and more. Topics and Events leverages the SNS protocol. +Scaleway Topics and Events is a managed messaging service that facilitates the sending of notifications or messages to a large number of subscribers, including email addresses, webhooks, and more. Topics and Events leverages the SNS protocol. ## What is SNS? SNS is a managed messaging service developed by AWS and leveraged by Scaleway Topics and Events. -SNS (Simple Notification Service) was released in 2010. It enables users to interconnect their applications and systems using a [publish/subscribe](/messaging/concepts#publishsubscribe) pattern. Many publishers can send messages to [topics](/messaging/concepts#topic), while consumers, e.g. applications, can subscribe to topics to receive all (or a subset) of messages sent to this topic. Scaleway Topics and Events makes it easy to migrate your SNS-connected applications by providing a dedicated protocol gateway. +SNS (Simple Notification Service) was released in 2010. It enables users to interconnect their applications and systems using a [publish/subscribe](/topics-and-events/concepts#publishsubscribe) pattern. Many publishers can send messages to [topics](/topics-and-events/concepts#topic), while consumers, e.g. applications, can subscribe to topics to receive all (or a subset) of messages sent to this topic. Scaleway Topics and Events makes it easy to migrate your SNS-connected applications by providing a dedicated protocol gateway. Some SNS features are not yet available with Scaleway Topics and Events. Supported subscribers are currently limited to: @@ -34,7 +34,7 @@ SNS (Simple Notification Service) was released in 2010. It enables users to inte ## Topics and Events credentials -You must [create credentials](/messaging/how-to/create-credentials/) that give your applications permission to connect to the Scaleway Topics and Events service. +You must [create credentials](/topics-and-events/how-to/create-credentials/) that give your applications permission to connect to the Scaleway Topics and Events service. Credentials are scoped to your Topics and Events service at [Project](/organizations-and-projects/concepts/#project)-level. You can choose to give each set of credentials the required level of permissions: @@ -44,11 +44,11 @@ Credentials are scoped to your Topics and Events service at [Project](/organizat ## Topics and subscriptions -You can [create topics](/messaging/how-to/create-manage-topics/) and [subscriptions](/messaging/how-to/create-manage-subscriptions/) via the Scaleway console. +You can [create topics](/topics-and-events/how-to/create-manage-topics/) and [subscriptions](/topics-and-events/how-to/create-manage-subscriptions/) via the Scaleway console. ## Further actions -All further actions such as sending messages etc. can be done using the AWS CLI or AWS SDKs. Check out our documentation to help you get started with the [AWS CLI](/messaging/api-cli/connect-aws-cli/) or [AWS SDKs](/messaging/api-cli/python-node-sqs/). +All further actions such as sending messages etc. can be done using the AWS CLI or AWS SDKs. Check out our documentation to help you get started with the [AWS CLI](/messaging/api-cli/connect-aws-cli/) or [AWS SDKs](/messaging/api-cli/topics-events-python-node/). ## Topics and Events Resources @@ -56,7 +56,7 @@ The following resources may be helpful: - [Official SNS Documentation](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) - Further information on supported API features: - - [SNS](/messaging/reference-content/sns-support/) + - [SNS](/topics-and-events/reference-content/sns-support/) - [Creating a simulated CPU monitor notification system with Scaleway Topics and Events](/tutorials/sns-instances-notification-system/) - [Official AWS CLI Documentation](https://aws.amazon.com/cli/) - [Official AWS SDK Documentation](https://aws.amazon.com/developer/tools/) \ No newline at end of file diff --git a/pages/topics-and-events/reference-content/sns-support.mdx b/pages/topics-and-events/reference-content/topics-and-events-support.mdx similarity index 99% rename from pages/topics-and-events/reference-content/sns-support.mdx rename to pages/topics-and-events/reference-content/topics-and-events-support.mdx index d1983c5c91..5847a314a9 100644 --- a/pages/topics-and-events/reference-content/sns-support.mdx +++ b/pages/topics-and-events/reference-content/topics-and-events-support.mdx @@ -9,7 +9,7 @@ tags: messaging queuing supported supports sns aws api actions categories: - serverless dates: - validation: 2024-10-18 + validation: 2025-04-10 posted: 2023-01-04 --- From 63498d0df6e1503337eb8947b0793609e59336bc Mon Sep 17 00:00:00 2001 From: Rowena Date: Fri, 11 Apr 2025 12:04:49 +0200 Subject: [PATCH 4/7] feat(topics-and-events): finish adding new doc --- menu/navigation.json | 118 +++++++++++++++--- pages/topics-and-events/faq.mdx | 2 +- pages/topics-and-events/how-to/index.mdx | 8 +- .../topics-and-events-overview.mdx | 2 +- 4 files changed, 109 insertions(+), 21 deletions(-) diff --git a/menu/navigation.json b/menu/navigation.json index 424fef987d..1f7da4d6b5 100644 --- a/menu/navigation.json +++ b/menu/navigation.json @@ -4304,23 +4304,111 @@ "slug": "queues" }, { - "items": [ - { - "label": "Overview", - "slug": "../serverless-sql-databases" - }, - { - "label": "Concepts", - "slug": "concepts" - }, - { - "label": "Quickstart", - "slug": "quickstart" + "items": [ + { + "label": "Overview", + "slug": "../topics-and-events" + }, + { + "label": "Concepts", + "slug": "concepts" + }, + { + "label": "Quickstart", + "slug": "quickstart" + }, + { + "label": "FAQ", + "slug": "faq" + }, + { + "items": [ + { + "label": "Create credentials", + "slug": "create-credentials" + }, + { + "label": "Manage credentials", + "slug": "manage-credentials" + }, + { + "label": "Create and manage queues", + "slug": "create-manage-topics" + }, + { + "label": "Create and manage subscriptions", + "slug": "create-manage-subscriptions" + }, + { + "label": "Monitor Topics and Events with Cockpit", + "slug": "monitor-topics-cockpit" + } + ], + "label": "How to", + "slug": "how-to" + }, + { + "items": [ + { + "label": "Topics and Events API Reference", + "slug": "https://www.scaleway.com/en/developers/api/messaging-and-queuing/sns-api/" + }, + { + "label": "Connecting Topics and Events to the AWS-CLI", + "slug": "connect-aws-cli" + }, + { + "label": "Using Topics and Events with the AWS-CLI", + "slug": "topics-events-aws-cli" + }, + { + "label": "Using Go, Python or Node.js with Topics and Events", + "slug": "python-node-topics-events" + } + ], + "label": "API/CLI", + "slug": "api-cli" + }, + { + "items": [ + { + "label": "Topics and Events overview", + "slug": "topics-and-events-overview" + }, + { + "label": "Topics and Events - supported actions", + "slug": "topics-and-events-support" + }, + { + "label": "Limitations", + "slug": "limitations" + } + ], + "label": "Additional Content", + "slug": "reference-content" + } + ], + "label": "Topics and Events", + "slug": "topics-and-events" }, { - "label": "FAQ", - "slug": "faq" - }, + "items": [ + { + "label": "Overview", + "slug": "../serverless-sql-databases" + }, + { + "label": "Concepts", + "slug": "concepts" + }, + { + "label": "Quickstart", + "slug": "quickstart" + }, + { + "label": "FAQ", + "slug": "faq" + }, { "items": [ { diff --git a/pages/topics-and-events/faq.mdx b/pages/topics-and-events/faq.mdx index 0063005a6c..6c4af903bd 100644 --- a/pages/topics-and-events/faq.mdx +++ b/pages/topics-and-events/faq.mdx @@ -29,6 +29,6 @@ For more details on supported and unsupported Topics and Events features, see ou ## How is Topics and Events billed? -Billing is based on [topic Volume](/messaging/concepts/#queue-volume) (the total sum of each message's size going out from the topic to the subscriptions). +Billing is based on [topic volume](/topics-and-events/concepts/#topic-volume) (the total sum of each message's size going out from the topic to the subscriptions). For full pricing details, see our [dedicated pricing page](https://www.scaleway.com/en/pricing/). \ No newline at end of file diff --git a/pages/topics-and-events/how-to/index.mdx b/pages/topics-and-events/how-to/index.mdx index e54fd91319..68efa2c53a 100644 --- a/pages/topics-and-events/how-to/index.mdx +++ b/pages/topics-and-events/how-to/index.mdx @@ -1,8 +1,8 @@ --- meta: - title: NATS, Queues, and Topics and Events - How Tos - description: NATS, Queues, and Topics and Events How Tos + title: Topics and Events - How Tos + description: Topics and Events How Tos content: - h1: NATS, Queues, and Topics and Events - How Tos - paragraph: NATS, Queues, and Topics and Events How Tos + h1: Topics and Events - How Tos + paragraph: Topics and Events How Tos --- diff --git a/pages/topics-and-events/reference-content/topics-and-events-overview.mdx b/pages/topics-and-events/reference-content/topics-and-events-overview.mdx index 3cad047ce6..8a5bf65026 100644 --- a/pages/topics-and-events/reference-content/topics-and-events-overview.mdx +++ b/pages/topics-and-events/reference-content/topics-and-events-overview.mdx @@ -48,7 +48,7 @@ You can [create topics](/topics-and-events/how-to/create-manage-topics/) and [su ## Further actions -All further actions such as sending messages etc. can be done using the AWS CLI or AWS SDKs. Check out our documentation to help you get started with the [AWS CLI](/messaging/api-cli/connect-aws-cli/) or [AWS SDKs](/messaging/api-cli/topics-events-python-node/). +All further actions such as sending messages etc. can be done using the AWS CLI or AWS SDKs. Check out our documentation to help you get started with the [AWS CLI](/topics-and-events/api-cli/connect-aws-cli/) or [AWS SDKs](/topics-and-events/api-cli/python-node-topics-events/). ## Topics and Events Resources From 68d719693296f0af815049a510e343c30a5f7c4f Mon Sep 17 00:00:00 2001 From: Rowena Jones <36301604+RoRoJ@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:28:28 +0200 Subject: [PATCH 5/7] Apply suggestions from code review Co-authored-by: Jessica <113192637+jcirinosclwy@users.noreply.github.com> --- pages/topics-and-events/api-cli/connect-aws-cli.mdx | 2 +- pages/topics-and-events/api-cli/topics-events-aws-cli.mdx | 2 +- pages/topics-and-events/concepts.mdx | 6 +++--- pages/topics-and-events/how-to/create-credentials.mdx | 5 ----- .../how-to/create-manage-subscriptions.mdx | 4 +--- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/pages/topics-and-events/api-cli/connect-aws-cli.mdx b/pages/topics-and-events/api-cli/connect-aws-cli.mdx index 057d23abba..c668b41f28 100644 --- a/pages/topics-and-events/api-cli/connect-aws-cli.mdx +++ b/pages/topics-and-events/api-cli/connect-aws-cli.mdx @@ -116,7 +116,7 @@ Now you have installed the AWS-CLI, you need to configure it for use with Scalew aws_secret_access_key= ``` -6. Test that everything is set up correctly with the following command: +5. Test that everything is set up correctly with the following command: ``` aws topics_events list-topics ``` diff --git a/pages/topics-and-events/api-cli/topics-events-aws-cli.mdx b/pages/topics-and-events/api-cli/topics-events-aws-cli.mdx index 061a8b4004..a61b719a4a 100644 --- a/pages/topics-and-events/api-cli/topics-events-aws-cli.mdx +++ b/pages/topics-and-events/api-cli/topics-events-aws-cli.mdx @@ -48,7 +48,7 @@ The AWS-CLI is an open-source tool built on top of the AWS SDK for Python (Boto) aws sns subscribe --topic-arn $(jq -r .TopicArn my-topic.json) --protocol http --notification-endpoint | tee my-subscription.json ``` -3. Find the HTTP request received by the HTTP server. It should have a body in json matching the following format. It contains information necessary to complete the subscription process: +3. Find the HTTP request received by the HTTP server. It should have a body in JSON matching the following format. It contains the information necessary to complete the subscription process: ```json { diff --git a/pages/topics-and-events/concepts.mdx b/pages/topics-and-events/concepts.mdx index 7c5089ce11..a55bbe9652 100644 --- a/pages/topics-and-events/concepts.mdx +++ b/pages/topics-and-events/concepts.mdx @@ -27,11 +27,11 @@ FIFO stands for **F**irst **I**n **F**irst **O**ut, and represents a type of top ## Filtering -In a [topic-based](#topic-based) system, where topics handle the logic, filtering is similar to routing. Messages are sent to defined topics, which can be thought of as filters in so far as subscribers can subscribe only to the topics they are interested in. In a [content-based](#content-based) system, filtering is carried out more directly by subscribers, who define filters for messages based on the content/attributes they want to receive. +In a [topic-based](#topic-based) system, where topics handle the logic, filtering is similar to routing. Messages are sent to defined topics, which can be thought of as filters, as subscribers can subscribe only to the topics they are interested in. In a [content-based](#content-based) system, filtering is carried out more directly by subscribers, who define filters for messages based on the content/attributes they want to receive. ## Message broker -A message broker is a piece of software that allows applications, systems and services to communicate with each other and send/receive data. It facilitates the exchange of information by receiving messages from a producer, and transmitting them to a consumer. Scaleway Topics and Events is a message broker tool based on the AWS SNS messaging system. +A message broker is a piece of software that allows applications, systems, and services to communicate with each other and send/receive data. It facilitates the exchange of information by receiving messages from a producer and transmitting them to a consumer. Scaleway Topics and Events is a message broker tool based on the AWS SNS messaging system. ## Messaging and Queuing @@ -76,7 +76,7 @@ A subscription protocol refers to the communication method used to deliver messa ## Topic -A topic is a communication channel used to send messages and notifications to subscribed endpoints or clients. Publishers send messages to topics, and those messages are received by subscribers. Subscribers can include Serverless Functions, Scaleway Queues and HTTP/HTTPS endpoints. As such, topics decouple the publishing and the receiving of messages, allowing for flexibility and scalabilty in building loosely-coupled systems. +A topic is a communication channel used to send messages and notifications to subscribed endpoints or clients. Publishers send messages to topics, and those messages are received by subscribers. Subscribers can include Serverless Functions, Scaleway Queues and HTTP/HTTPS endpoints. As such, topics decouple the publishing and the receiving of messages, allowing for flexibility and scalability in building loosely-coupled systems. ## Topic types diff --git a/pages/topics-and-events/how-to/create-credentials.mdx b/pages/topics-and-events/how-to/create-credentials.mdx index cf70a6eb8e..a308d758ab 100644 --- a/pages/topics-and-events/how-to/create-credentials.mdx +++ b/pages/topics-and-events/how-to/create-credentials.mdx @@ -47,8 +47,3 @@ Credentials for Topics and Events are granular: you can define the level of acce 8. Copy and save the credentials, before closing the window. You are returned to the **Credentials** tab. The name of your newly-generated credentials, along with the access key and access level are displayed. - - - - - diff --git a/pages/topics-and-events/how-to/create-manage-subscriptions.mdx b/pages/topics-and-events/how-to/create-manage-subscriptions.mdx index fb5f914d3b..80c0290d82 100644 --- a/pages/topics-and-events/how-to/create-manage-subscriptions.mdx +++ b/pages/topics-and-events/how-to/create-manage-subscriptions.mdx @@ -62,7 +62,7 @@ This page shows how to create and manage [subscriptions](/topics-and-events/conc You are prompted to select the **namespace** containing the Function or Container that you want to subscribe. Only namespaces in the same [Project](/organizations-and-projects/concepts/#project) and [region](/topics-and-events/concepts/#region) as the topic can be selected. - You are prompted to select the Serverless Function or Container to subscribe. Only Functions and Containers with a public [privacy policy](/serverless-functions/concepts/#privacy-policy) can subscribe to an topic. + You are prompted to select the Serverless Function or Container to subscribe. Only Functions and Containers with a public [privacy policy](/serverless-functions/concepts/#privacy-policy) can subscribe to a topic.
@@ -113,5 +113,3 @@ When you no longer want a subscribed endpoint or service to receive messages fro A pop-up asks you to confirm that you understand this action will delete the subscription. 6. Type **DELETE** and click **Delete subscription**. - - From ed0b282ec439548de100dcff90a13e0780af79fe Mon Sep 17 00:00:00 2001 From: Rowena Jones <36301604+RoRoJ@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:29:03 +0200 Subject: [PATCH 6/7] Update pages/topics-and-events/concepts.mdx --- pages/topics-and-events/concepts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/topics-and-events/concepts.mdx b/pages/topics-and-events/concepts.mdx index a55bbe9652..061970e68e 100644 --- a/pages/topics-and-events/concepts.mdx +++ b/pages/topics-and-events/concepts.mdx @@ -65,7 +65,7 @@ A subscription is a connection between a client or endpoint, and a topic. By cre ## Subscription protocols and endpoints -A subscription protocol refers to the communication method used to deliver messages to a subscriber. Different types of subscriber require different protocols. When you create a new subscription to a topic with Scaleway Topics and Events, the following options are available: +A subscription protocol refers to the communication method used to deliver messages to a subscriber. Different types of subscribers require different protocols. When you create a new subscription to a topic with Scaleway Topics and Events, the following options are available: | Protocol | Endpoint / Client | Note | |-------------------------------------|--------------------------------------------------|-----------------------------------| From e377f67e28dfc647654e2d5fd333bd9784f44c67 Mon Sep 17 00:00:00 2001 From: Rowena Jones <36301604+RoRoJ@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:30:31 +0200 Subject: [PATCH 7/7] Apply suggestions from code review Co-authored-by: Jessica <113192637+jcirinosclwy@users.noreply.github.com> --- .../api-cli/python-node-topics-events.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pages/topics-and-events/api-cli/python-node-topics-events.mdx b/pages/topics-and-events/api-cli/python-node-topics-events.mdx index d716612229..29a76340bb 100644 --- a/pages/topics-and-events/api-cli/python-node-topics-events.mdx +++ b/pages/topics-and-events/api-cli/python-node-topics-events.mdx @@ -63,7 +63,7 @@ func main() { Once connected, you can use any of the SDK's available functions. Be aware though that some functions are not [supported by Scaleway Topics and Events](/topics-and-events/reference-content/sns-support/), so make sure to check the link for more details on these. See the [official SDK documentation](https://pkg.go.dev/github.com/aws/aws-sdk-go/service/sns) for more information on getting started with the SDK, or keep reading for some code examples. -### Create topic (Go) +### Create a topic (Go) ```go createTopicResponse, _ := awsSNS.CreateTopic(&sns.CreateTopicInput{ @@ -74,7 +74,7 @@ fmt.Println(*createTopicResponse.TopicArn) ### Publish messages to this topic (Go) -Be careful: messages sent to topics with no subscriptions are automatically deleted +Be careful: messages sent to topics with no subscriptions are automatically deleted. ```go for i := 0; i < 10; i++ { @@ -162,9 +162,9 @@ sns = boto3.resource('sns', The `endpoint_url` for Scaleway Topics and Events (based on SNS) is `https://sns.mnq.fr-par.scaleway.com`. The values for the access and secret keys should be the credentials you [generated](/topics-and-events/how-to/create-credentials/) for Topics and Events.
-Once connected to, you can use any of the SDK's available functions. However, some functions are not [supported by Scaleway Topics and Events](/topics-and-events/reference-content/sns-support/), so do check the link to make sure. See the [official SDK documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) for more information, or keep reading for some code examples. +Once connected, you can use any of the SDK's available functions. However, some functions are not [supported by Scaleway Topics and Events](/topics-and-events/reference-content/sns-support/), so do check the link to make sure. See the [official SDK documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) for more information, or keep reading for some code examples. -### Create topic (Python) +### Create a topic (Python) ```python # Create a topic. This returns an SNS.Topic instance @@ -175,7 +175,7 @@ print(topic.attributes) ### Publish messages to this topic (Python) -Be careful: messages sent to topics with no subscriptions are automatically deleted +Be careful: messages sent to topics with no subscriptions are automatically deleted. ```python for i in range (0,10): @@ -281,7 +281,7 @@ var snsClient = new SNSClient({ Once connected, you can use any of the SDK's available functions. However, some functions are not [supported by Scaleway Topics and Events](/topics-and-events/reference-content/sns-support), so do check the link to make sure. See the [official SDK documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-sns/) for more information, or keep reading for some code examples. -### Create topic (NodeJS) +### Create a topic (NodeJS) You can find all available parameters for `createTopic` in the [AWS documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-sns/classes/createtopiccommand.html).