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