Как начать работать с топиками в Yandex Cloud Notification Service
Cloud Notification Service (CNS) — сервис для мультиканальной отправки уведомлений пользователям. HTTP API сервиса совместим с Amazon SNS API
Чтобы отправлять сообщения в разные эндпоинты одновременно, используйте топики. Топик позволяет отправлять уведомления сразу всем подписанным на него эндпоинтам.
Чтобы начать работать с топиками:
- Подготовьте облако к работе.
- Создайте каналы для уведомлений и эндпоинты:
-
SMS.
Для SMS можно не добавлять телефонные номера в канале, а добавить их сразу в топике.
- Создайте топик.
- Подпишите эндпоинты на топик.
- Отправьте уведомление в топик.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Создайте топик
-
В консоли управления
выберите каталог. -
Перейдите
в сервис Cloud Notification Service. -
Слева выберите раздел Топики.
-
Нажмите кнопку Создать топик.
-
Введите имя топика. Имя топика должно быть уникальным в Cloud Notification Service.
-
(Опционально) Настройте запись логов:
- В разделе Логирование включите Запись логов.
- В списке Каталог выберите каталог, в котором будет расположена лог-группа.
- В поле Лог-группа выберите существующую лог-группу или создайте новую.
-
(Опционально) Включите опцию Yandex Message Queue, чтобы отправлять сообщения в очереди Message Queue, которые подписаны на топик. Укажите сервисный аккаунт, у которого есть роль
ymq.writer:- на каталог, в котором находятся очереди, подписанные на топик;
- на каталог, в котором находится сам сервисный аккаунт.
-
Нажмите Создать топик.
-
Если у вас еще нет AWS CLI, установите и сконфигурируйте его.
-
Выполните команду:
aws sns create-topic \ --name <имя_топика> \ --attributes "{\"SQSServiceAccountId\":\"<идентификатор_сервисного_аккаунта>\"}"Где:
name— произвольное имя топика, должно быть уникальным в Cloud Notification Service.
-
SQSServiceAccountId— идентификатор сервисного аккаунта, от имени которого сообщения из топика будут отправляться в очереди Message Queue. Необязательный параметр. У сервисного аккаунта должна быть рольymq.writer:- на каталог, в котором находятся очереди, подписанные на топик;
- на каталог, в котором находится сам сервисный аккаунт.
Примечание
Чтобы указать сервисный аккаунт в атрибуте
SQSServiceAccountId, у пользователя должна быть рольiam.serviceAccounts.userна каталог, в котором находится сервисный аккаунт. Иначе команда завершится с ошибкой авторизации.
Подробнее о команде
aws sns create-topicсмотрите в документации AWS .
-
Если у вас еще нет AWS SDK для Python (boto3), установите и настройте его.
-
Чтобы создать канал push-уведомлений, используйте следующий код:
response = client.create_topic( Name="<имя_топика>", Attributes={ "SQSServiceAccountId": "<идентификатор_сервисного_аккаунта>", }, ) print(f"Topic ARN:", response['TopicArn'])Где:
Name— произвольное имя топика, должно быть уникальным в Cloud Notification Service.
-
SQSServiceAccountId— идентификатор сервисного аккаунта, от имени которого сообщения из топика будут отправляться в очереди Message Queue. Необязательный параметр. У сервисного аккаунта должна быть рольymq.writer:- на каталог, в котором находятся очереди, подписанные на топик;
- на каталог, в котором находится сам сервисный аккаунт.
Примечание
Чтобы указать сервисный аккаунт в атрибуте
SQSServiceAccountId, у пользователя должна быть рольiam.serviceAccounts.userна каталог, в котором находится сервисный аккаунт. Иначе команда завершится с ошибкой авторизации.
Подпишите эндпоинты на топик
-
Выберите топик.
-
Слева выберите Подписки.
-
Нажмите кнопку Создать подписку.
-
Выберите тип канала уведомлений:
-
Мобильные push-уведомления.
Введите ARN эндпоинта в формате:
arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>. Скопировать ARN эндпоинта можно на странице его настроек. -
Push-уведомления в браузере.
Введите ARN эндпоинта в формате:
arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>. -
SMS.
Введите номер телефона в формате E.164
, например+79991112233. Телефон не требуется предварительно добавлять в канале уведомлений SMS, при этом сам канал должен быть создан. -
Yandex Message Queue
Введите URL очереди Message Queue.
-
-
Нажмите Создать подписку.
Таким же образом подпишите на топик другие эндпоинты.
Выполните команду:
aws sns subscribe \
--topic-arn <ARN_топика> \
--protocol <тип_канала> \
--notification-endpoint <ARN_эндпоинта_или_номер_телефона>
Где:
-
topic-arn— ARN топика. -
protocol— тип канала отправки уведомлений, напримерsms,application,sqs. -
notification-endpoint— эндпоинт, который подписывается на топик:- для мобильных push-уведомлений и push-уведомлений в браузере — ARN эндпоинта в формате
arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>; - для SMS — номер телефона в формате E.164
, например+79991112233; - для Message Queue — URL очереди.
Чтобы топик мог отправлять сообщения в очередь, у него должен быть задан атрибут
SQSServiceAccountId. Подробнее в инструкциях по созданию и управлению топиком. - для мобильных push-уведомлений и push-уведомлений в браузере — ARN эндпоинта в формате
Подробнее о команде aws sns subscribe смотрите в документации AWS
Используйте следующий код:
try:
response = client.subscribe(
TopicArn = "<ARN_топика>",
Protocol = "<тип_канала>",
Endpoint = "<ARN_эндпоинта_или_номер_телефона_или_URL_очереди>"
)
print(f"Topic ARN: {response['TopicArn']}")
except botocore.exceptions.ClientError as error:
print(f"Error: {error}")
Где:
-
TopicArn— ARN топика. -
Protocol— тип канала для отправки уведомлений, напримерsms,application,sqs. -
Endpoint— эндпоинт, который подписывается на топик:- для мобильных push-уведомлений и push-уведомлений в браузере — ARN эндпоинта в формате
arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>; - для SMS — номер телефона в формате E.164
, например+79991112233; - для Message Queue — URL очереди.
Чтобы топик мог отправлять сообщения в очередь, у него должен быть задан атрибут
SQSServiceAccountId. Подробнее в инструкциях по созданию и управлению топиком. - для мобильных push-уведомлений и push-уведомлений в браузере — ARN эндпоинта в формате
Отправьте уведомление в топик
-
Выберите топик.
-
Нажмите кнопку Отправить уведомление.
-
Выберите вид уведомлений:
- Одинаковые — во все типы каналов будет отправлено одно и то же уведомление.
- Различные — можно ввести разные тексты для разных типов каналов.
-
Введите единый текст для всех каналов или разные тексты для разных типов каналов в формате JSON. Если канал не указан, будет отправлен текст по умолчанию из поля
default.Формат уведомления в JSON:
{ "default": "<Текст_по_умолчанию>", "sms": "<Текст_уведомления_для_sms>", "sqs": "<Текст_уведомления_для_очереди_сообщений>", "WEB": "<Текст_уведомления_для_браузера>", "APNS": { "aps": { "alert": { "title": "Заголовок_уведомления", "body": "Текст_уведомления" } } }, "GCM": { "notification": { "title": "Заголовок_уведомления", "body": "Текст_уведомления" } }, "HMS": { "notification": { "title": "Заголовок_уведомления", "body": "<Текст_уведомления>" } }, "RUSTORE": { "notification": { "title": "Заголовок_уведомления", "body": "<Текст_уведомления>" } } } -
Нажмите кнопку Отправить.
Выполните команду:
Для отправки уведомления:
aws sns publish \
--topic-arn <ARN_топика> \
--message-structure json \
--message '{"default": "<текст_уведомления>","APNS": {"aps":{"alert":"<текст_уведомления>"}},"GCM": {"notification":{"body":"<текст_уведомления>"}},"HMS": {"notification":{"body":"<текст_уведомления>"}},"RUSTORE": {"notification":{"body":"<текст_уведомления>"}},"WEB": "<текст_уведомления>","sms": "<текст_уведомления>","sqs": "<текст_уведомления>"}'
Где:
topic-arn— ARN топика.message-structure— формат сообщенияjson.message— текст уведомления или путь к файлу с уведомлением. Для отправки разных уведомлений в зависимости от типа канала укажите канал и текст уведомления. Если какой-либо канал не указан, будет отправлено сообщение по умолчанию.
Подробнее о команде aws sns publish смотрите в документации AWS
Используйте следующий код:
try:
response = client.publish(
TopicArn="<ARN_топика>",
Message=json.dumps({
"default": "<текст_уведомления>",
"APNS": {"aps":{"alert":"<текст_уведомления>"}},
"GCM": {"notification":{"body":"<текст_уведомления>"}},
"HMS": {"notification":{"body":"<текст_уведомления>"}},
"RUSTORE": {"notification":{"body":"<текст_уведомления>"}},
"WEB": "<текст_уведомления>",
"sms": "<текст_уведомления>",
"sqs": "<текст_уведомления>"
}),
MessageStructure="json"
)
print(f"Message ID: {response["MessageId"]}")
except botocore.exceptions.ClientError as error:
print(f"Error: {error}")
Где:
TopicArn— ARN топика.Message— текст уведомления. Можно указать единый текст для всех типов каналов или разные тексты для каждого типа канала. Если какой-либо канал не указан, будет отправлено сообщение по умолчанию из поляdefault.MessageStructure— формат сообщения (json).