Getting started with topics in Yandex Cloud Notification Service
Cloud Notification Service (CNS): Service for multichannel user notifications. Its HTTP API is compatible with the Amazon SNS API
To send messages to different endpoints at the same time, use topics. You can subscribe the endpoints to a topic and send notifications to all of them at once.
To get started with topics:
- Get your cloud ready.
- Create notification channels and endpoints:
-
For SMS notifications, you may add phone numbers directly to the topic rather than the channel.
- Create a topic.
- Subscribe endpoints to the topic.
- Send a notification to the topic.
Get your cloud ready
Sign up for Yandex Cloud and create a billing account:
- Navigate to the management console
and log in to Yandex Cloud or create a new account. - On the Yandex Cloud Billing
page, make sure you have a billing account linked and it has theACTIVEorTRIAL_ACTIVEstatus. If you do not have a billing account, create one and link a cloud to it.
If you have an active billing account, you can create or select a folder for your infrastructure on the cloud page
Learn more about clouds and folders here.
Create a topic
-
In the management console
, select the folder. -
Navigate
to Cloud Notification Service. -
Select Topics on the left.
-
Click Create topic.
-
Enter a name for the topic. The name must be unique within Cloud Notification Service.
-
Optionally, set up logging:
- Under Logging, enable the Write logs option.
- In the Folder list, select a folder to house the log group.
- In the Log group field, select an existing log group or create a new one.
-
Optionally, enable Yandex Message Queue to send messages to Message Queue queues subscribed to the topic. Specify a service account assigned the
ymq.writerrole:- For the folder with the queues subscribed to the topic.
- For the folder with the service account itself.
-
Click Create topic.
-
If you do not have the AWS CLI yet, install and configure it.
-
Run this command:
aws sns create-topic \ --name <topic_name> \ --attributes "{\"SQSServiceAccountId\":\"<service_account_ID>\"}"Where:
name: Topic name, which can be any name unique within Cloud Notification Service.
-
SQSServiceAccountId: ID of the service account you are going to use to send messages from the topic to a Message Queue. This is an optional parameter. The service account must have theymq.writerrole:- For the folder with the queues subscribed to the topic.
- For the folder with the service account itself.
Note
To specify a service account in the
SQSServiceAccountIdattribute, the user must have theiam.serviceAccounts.userrole for the folder with the service account. Otherwise, the command will fail with an authorization error.
Learn more about the
aws sns create-topiccommand in this AWS guide .
-
If you do not have the AWS SDK for Python (boto3) yet, install and configure it.
-
To create a push notification channel, use the following code:
response = client.create_topic( Name="<topic_name>", Attributes={ "SQSServiceAccountId": "<service_account_ID>", }, ) print(f"Topic ARN:", response['TopicArn'])Where:
Name: Topic name, which can be any name unique within Cloud Notification Service.
-
SQSServiceAccountId: ID of the service account you are going to use to send messages from the topic to a Message Queue. This is an optional parameter. The service account must have theymq.writerrole:- For the folder with the queues subscribed to the topic.
- For the folder with the service account itself.
Note
To specify a service account in the
SQSServiceAccountIdattribute, the user must have theiam.serviceAccounts.userrole for the folder with the service account. Otherwise, the command will fail with an authorization error.
Subscribe endpoints to the topic
-
Select a topic.
-
Select Subscriptions on the left.
-
Click Create subscription.
-
Select a notification channel type:
-
Mobile push notifications.
Enter the endpoint ARN in
arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>format. You can copy the ARN on the endpoint’s settings page. -
In-browser push notifications.
Enter the endpoint ARN in
arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>format. -
SMS.
Enter your phone number in E.164
format, e.g.,+79991112233. You do not need to pre-add the phone number to the SMS notification channel, but you need to create the channel itself. -
Yandex Message Queue
Enter the Message Queue URL.
-
-
Click Create subscription.
Subscribe other endpoints to the topic in the same way.
Run this command:
aws sns subscribe \
--topic-arn <topic_ARN> \
--protocol <channel_type> \
--notification-endpoint <endpoint_ARN_or_phone_number>
Where:
-
topic-arn: Topic ARN. -
protocol: Notification channel type, e.g.,sms,application,sqs. -
notification-endpoint: Endpoint subscribing to the topic.- For both mobile and browser push notifications, enter your endpoint ARN in
arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>format. - For SMS, enter a phone number in E.164
format, e.g.,+79991112233. - For Message Queue, enter the queue URL.
For a topic to be able to send messages to a queue, it must have the
SQSServiceAccountIdattribute set. See the guide on creating and managing a topic for more details. - For both mobile and browser push notifications, enter your endpoint ARN in
Learn more about the aws sns subscribe command in this AWS guide
Use the following code:
try:
response = client.subscribe(
TopicArn = "<topic_ARN>",
Protocol = "<channel_type>",
Endpoint = "<endpoint_ARN_or_phone_number_or_queue_URL>"
)
print(f"Topic ARN: {response['TopicArn']}")
except botocore.exceptions.ClientError as error:
print(f"Error: {error}")
Where:
-
TopicArn: Topic ARN. -
Protocol: Notification channel type, e.g.,sms,application, orsqs. -
Endpoint: Endpoint subscribing to the topic:- For both mobile and browser push notifications, enter your endpoint ARN in
arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>format. - For SMS, enter a phone number in E.164
format, e.g.,+79991112233. - For Message Queue, enter the queue URL.
For a topic to be able to send messages to a queue, it must have the
SQSServiceAccountIdattribute set. For details, see the guides on creating and managing a topic. - For both mobile and browser push notifications, enter your endpoint ARN in
Send a notification to the topic
-
Select the topic.
-
Click Send notification.
-
Select a notification type:
- Same: To send the same notification to all channel types.
- Different: To enter different texts for different channel types.
-
Enter the same text for all channels, or different texts for different channel types, in JSON format. If a channel is not specified, the notification will contain the
defaultmessage text.Notification format in JSON:
{ "default": "<Default_text>", "sms": "<Notification_text_for_sms>", "sqs": "<Notification_text_for_message_queue>", "WEB": "<Notification_text_for_bowser>", "APNS": { "aps": { "alert": { "title": "Notification_title", "body": "Notification_text" } } }, "GCM": { "notification": { "title": "Notification_title", "body": "Notification_text" } }, "HMS": { "notification": { "title": "Notification_title", "body": "<Notification_text>" } }, "RUSTORE": { "notification": { "title": "Notification_title", "body": "<Notification_text>" } } } -
Click Send.
Run this command:
To send a notification:
aws sns publish \
--topic-arn <topic_ARN> \
--message-structure json \
--message '{"default": "<notification_text>","APNS": {"aps":{"alert":"<notification_text>"}},"GCM": {"notification":{"body":"<notification_text>"}},"HMS": {"notification":{"body":"<notification_text>"}},"RUSTORE": {"notification":{"body":"<notification_text>"}},"WEB": "<notification_text>","sms": "<notification_text>","sqs": "<notification_text>"}'
Where:
topic-arn: Topic ARN.message-structure: Message format (json).message: Notification text or path to the notification file. To send different notifications depending on channel type, specify the channel and notification text: If some channel is not specified, the default message will be sent.
Learn more about the aws sns publish command in this AWS guide
Use the following code:
try:
response = client.publish(
TopicArn="<topic_ARN>",
Message=json.dumps({
"default": "<notification_text>",
"APNS": {"aps":{"alert":"<notification_text>"}},
"GCM": {"notification":{"body":"<notification_text>"}},
"HMS": {"notification":{"body":"<notification_text>"}},
"RUSTORE": {"notification":{"body":"<notification_text>"}},
"WEB": "<notification_text>",
"sms": "<notification_text>",
"sqs": "<notification_text>"
}),
MessageStructure="json"
)
print(f"Message ID: {response["MessageId"]}")
except botocore.exceptions.ClientError as error:
print(f"Error: {error}")
Where:
TopicArn: Topic ARN.Message: Notification text. You can add the same text for all channel types or different texts for each channel type. If a channel is not specified, the notification will contain thedefaultmessage text.MessageStructure: Message format (json).