Рубрики
Без рубрики

Публикация и подписка на AWS SNS-сообщения с Node.js

AWS SNS – это масштабируемое обслуживание, которое позволяет нам легко реализовать модель публикации / подписки. В этом руководстве мы построим приложение Node.js, подписывайтесь на тему Sns и подтолкни сообщений в подразделение.

Автор оригинала: Josh Simpson.

Вступление

Многие технологии, которые мы видим, полагаются на очень непосредственном цикле запроса/ответа – когда вы делаете запрос на сайт, вы получаете ответ, содержащий запрошенный вами веб-сайт, в идеале непосредственно. Все это зависит от пользователя, принимающего активное решение запросить эти данные.

Иногда нам нужно вдалиться от этой модели, и за то, что мы используем модель «Публикация/подписка». AWS Simple Уведомление (SNS) – это супер масштабируемый сервис, который позволяет пользователям легко реализовать модель публикации/подписки с легкостью. Это позволяет нам отправлять тексты, электронные письма, толкающие уведомления или другие автоматизированные сообщения на другие цели на нескольких каналах одновременно.

В этом посте мы узнаем, как создать веб-приложение, которое может опубликовать сообщение нескольким подписчикам сразу по электронной почте, все с SNS.

Вы, очевидно, нуждаетесь в Amazon Web Services (AWS) Счет, чтобы сделать это. И, к счастью, SNS имеет свободный уровень, в котором ваши первые 1 м SNS Push-уведомления бесплатны каждый месяц.

Публикация/Подписаться

Модель публикации/подписки состоит из двух компонентов в системе:

  • Издательство : Сервис, которая может передавать сообщения для других услуг ( подписано ) к нему.
  • Подписчик : Любое обслуживание, которое будет транслировать издателем.

Чтобы стать подписчиком, услуга должна уведомить издателя, что он хочет получить свои трансляции, а также там, где он хочет получить эти широковещания, в какой момент издатель будет включать его в свой список целей, когда он будет публикует сообщение.

Хорошая метафора для модели публикации/подписки – любая рассылка, которую вы зарегистрировались! В этом случае вы активно ушли в издателю и сообщили им, что вы хотите подписаться, а также с учетом их электронной почты.

Ничто не делается сразу, когда вы подписались, и вы не получаете какие-либо предыдущие вопросы рассылки.

Когда издатель следующий публикует сообщение (отправляет их ежемесячную рассылку), отправляется электронное письмо. Затем вы можете выбрать делать то, что вы будете с электронной почтой – вы можете удалить его, прочитать его или даже действовать на некоторые детали в нем.

Настройка темы SNS

Чтобы начать, нам сначала нужно настроить Тема на AWS SNS. Тема – это то, что мы рассмотрим «издатель» – мы можем отправлять сообщения на тему, которую он будет опубликовать всем своим подписчикам.

На вашей панели инструментов AWS выберите «Простая служба уведомления» и ударил «Темы» на левой стороне, а затем «Создать тему» кнопка.

Вам будет представлен экраном, который просит вас предоставить некоторую базовую информацию о Themic SNS:

Создать образ жизни

Этот экран имеет несколько вариантов, хотя по умолчанию отображает только одну группу – это имя (которое является обязательным) и отображаемое имя, которое может быть дополнительно установлено – это используется, если вы хотите опубликовать абоненты SMS с темы.

Некоторые из других вариантов включают в себя:

  • Шифрование сообщений : Шифрование сообщений после отправки издателем. Это действительно полезно только в том случае, если вы отправляете очень чувствительные/личные данные.
  • Политика доступа : Определяет точно Кто может публиковать сообщения на тему.
  • Политика повторной попытки : В том случае, если абонент не может получить опубликованное сообщение по любой причине.
  • Регистрация состояния доставки : Позволяет настроить Я ( Личность и управление доступом ) Роль в AWS, который пишет журналы состояния доставки в AWS CloudWatch Отказ

На данный момент мы собираемся заполнить имя и отображение, а затем прокрутить вниз и ударить «Создать тему» Отказ Примите к сведению Арн недавно созданного Тема Как нам понадобится позже.

Настройка пользователя IAM

Мы будем использовать AWS JavaScript SDK Чтобы взаимодействовать с AWS SNS – и иметь возможность сделать это, нам понадобится набор учетных данных, которые SDK можно использовать для отправки запросов на AWS.

Мы можем получить этот набор учетных данных, создав Я Пользователь. Открыть «Услуги» Меню, которое мы использовали для поиска раньше, и на этот раз поиск IAM.

Вы увидите экран, который выглядит так:

Я главный взгляд

Нажмите «Пользователи» Слева, затем нажмите «Добавить пользователя» – Вы столкнетесь с экраном, который выглядит так:

SNS Создание пользователя

Для учебных целей давайте создадим пользователь с именем SnSuser и установите флажок для программного доступа. Мы захочем получить доступ к нему через наше приложение программно, не только через консоль AWS.

Это позволяет всем доставлять учетные данные для доступа к конкретным частям AWS через CLI или JavaScript SDK, который мы собираемся использовать. Нам не нужно давать им доступ к консоли AWS Console, так как мы не планируем на то, что эти учетные данные взаимодействуют с AWS через браузер, как вы сейчас делаете.

Нажмите Далее, и вы будете представлены с разрешениями. Нажмите на «Прикрепите существующую политику напрямую» Кнопка и поиска «СНС» Вы легко сможете найти ‘Snsfullaccess’ вариант:

Прикрепить политическую политику

IAM Пользователи, роли и политики – это большая тема, которая определенно стоит расследовать – пока это должно работать для нас.

Удар «Далее: теги» В правом нижнем углу, а затем «Далее: Обзор» В том же месте, вы должны увидеть сводный экран, который выглядит что-то подобное:

IAM Обзор пользователей

Примечание: Убедитесь, что вы копируете Доступ к ключу ID и Секретный ключ доступа Или загрузите файл CSV, так как это единственный раз, когда вы можете получить эти учетные данные – в противном случае вам необходимо создать новый пользователь.

Хотя мы говорим о учетных данных, убедитесь, что вы не Опубликуйте эти учетные данные в любом месте в любом месте или зафиксируйте их в репозиторий Git. Плохие актеры просекуют GitHub для репозиторий с полномочиями в них, чтобы они могли получить доступ и использовать ресурсы, их учетную запись AWS, которая будет стоить вам несколько сладких денег.

Наконец, мы собираемся установить наши учетные данные локально (Linux/OSX/UNIX), чтобы наш узел приложения можно использовать их на следующем шаге.

Для того, чтобы определить ваш регион, посетите Эта страница и найти ближайший регион для вас. По умолчанию в AWS – US-East-2 – который базируется в Огайо. Это регион, который вы увидите, когда вы просматриваете AWS в вашем браузере:

touch ~/.aws/credentials
echo '[sns_profile]' >> ~/.aws/credentials
echo 'aws_access_key_id = ' >> ~/.aws/credentials # The access key ID from the IAM user
echo 'aws_secret_access_key = ' >> ~/.aws/credentials # The secret access key from the IAM user
echo 'region = ' # From the regions page, examples include: us-east-1, us-west-1, eu-west-1, etc.

Demo Node.js приложение

Далее мы собираемся создать приложение узла, используя Express. Это приложение будет иметь Два конечные точки. Первое будет для добавления адресов электронной почты в качестве подписчиков на нашу тему, вторая будет для отправки электронного письма Все наших подписчиков.

Примечание : Пока мы используем конечную точку электронной почты в этой демонстрации, тот же общий код может использоваться для любой из других конечных точек SNS, таких как HTTP, SMS, LAMBDA и т. Д. Вам просто нужно поменять несколько параметров в API SNS API вызов.

Во-первых, давайте создадим папку для нашего проекта в нашем терминале, перейдите в каталог и инициализируйте наше приложение узла:

$ mkdir node-sns-app
$ cd node-sns-app
$ npm init

Вы можете нажать Enter, пока сценарий не завершится параметрами по умолчанию, сделав нашу унылую точку у по умолчанию index.js Отказ

Далее нам нужно установить модули Express и AWS-SDK, чтобы мы могли использовать их обоих:

$ npm install express --save
$ npm install aws-sdk --save

Далее мы хотим создать Наше приложение. В том же каталоге сделайте файл под названием index.js :

$ touch index.js

Во-первых, мы поставим в некоторых коде, чтобы убедиться, что мы можем запустить приложение с AWS:

const express = require('express');
const app = express();

const AWS = require('aws-sdk');
const credentials = new AWS.SharedIniFileCredentials({profile: 'sns_profile'});
const sns = new AWS.SNS({credentials: credentials, region: 'eu-west-2'});

const port = 3000;

app.use(express.json());

app.get('/status', (req, res) => res.json({status: "ok", sns: sns}));

app.listen(port, () => console.log(`SNS App listening on port ${port}!`));

Большинство из этого является Boilerplate для Express, но линии 4-6 экземпляра AWS, скажите ему, чтобы использовать учетные данные в профиле, который мы создали в ~/AWS/учетные данные Ранее и создайте экземпляр с ним класса SNS.

Теперь мы можем идти вперед и запустить файл:

$ node index.js

Посещение localhost: 3000/Статус распечатает большой кусок JSON, который в нем есть свои полномочия AWS. Если это работает, то мы можем двигаться дальше и создавать наши конечные точки.

Конечная точка подписки

Во-первых, нам нужно добавить Пост Конечная точка для добавления подписчиков – в этом случае новые адреса электронной почты. Ниже /Статус Конечная точка, мы добавим /Подписаться Конечная точка:

app.post('/subscribe', (req, res) => {
    let params = {
        Protocol: 'EMAIL', 
        TopicArn: '',
        Endpoint: req.body.email
    };

    sns.subscribe(params, (err, data) => {
        if (err) {
            console.log(err);
        } else {
            console.log(data);
            res.send(data);
        }
    });
});

Хорошо, давайте пройдем через это. Во-первых, мы создаем Пост конечная точка. Внутри этой конечной точки мы создаем переменную параметры, готовые к передаче нашим запрос на нашу подписаться на SNS.

Переменная параметров нуждается в нескольких вещах:

  • Протокол : Мы установили это как электронное письмо, но это может быть Http/s , SMS , SQS (Если вы хотите использовать службу очередей AWS), или даже функцию лямбда
  • Topicarn : Это Арн – Уникальный идентификатор для темы SNS, который вы настроили ранее. Если у вас его нет, посмотрите и сбери его с вашей темы в браузер и вставьте его в код сейчас.
  • Конечная точка : Тип конечного точка зависит от протокола. Поскольку мы отправляем электронные письма, мы бы дали ему адрес электронной почты, но если мы создали Http/s Подписка, мы бы поставили адрес URL вместо этого или номер телефона для SMS Отказ

Вы можете узнать больше о методе подписки Из официальной документации Отказ

Как только это снова начните сервер снова. Вам нужно будет отправить запрос с корпусом JSON в ваше приложение – вы можете сделать это с инструментами, такими как почтальон, или если вы предпочитаете сделать это на CLI:

$ curl -H "Content-type: application/json" -d '{ "email": "" }' 'localhost:3000/subscribe'

Если конечная точка и сообщение верны, этот адрес электронной почты получит электронное письмо с просьбой, если вы хотите подтвердить вашу подписку – любая подписка, созданная через AWS SNS, необходимо подтвердить конечную точку в какой-либо форме, в противном случае AWS может использоваться злонамеренным для спама или Тип DDOS атаки.

Обязательно подтвердите подписку перед следующим шагом для любых электронных писем, которые вы подписываетесь.

Конечная точка электронной почты

Теперь, чтобы сделать конечную точку для отправки нашего электронного письма:

app.post('/send', (req, res) => {
    let params = {
        Message: req.body.message,
        Subject: req.body.subject,
        TopicArn: ''
    };

    sns.publish(params, function(err, data) {
        if (err) console.log(err, err.stack); 
        else console.log(data);
    });
});

Опять же, давайте посмотрим, какие параметры здесь сделаны:

  • Сообщение : Это сообщение, которое вы хотите отправить – в этом случае это было бы телом электронной почты
  • Тема : Это поле включено только потому что Мы отправляем электронное письмо – это устанавливает предмет электронной почты
  • Topicarn : Это тема, которую мы публикуем сообщение – это опубликует на каждый Абонент электронной почты для этой темы

Если вы хотите узнать больше о методе публикации, посмотрите на документацию, есть и Другие свойства Отказ

Вы можете отправить сообщение сейчас, используя Postman, или Curl – До тех пор, пока мы проходим в наших параметрах для предмета и сообщения:

$ curl -H "Content-type: application/json" -d '{ "subject": "Hello there!", "message": "You just received an email from SNS!" }' 'localhost:3000/send'

Как только этот запрос сделан, все подписчики на конечную точку должны получить это письмо! Поздравляем, вы только что опубликовали свое первое сообщение, используя SNS и Node.js!

Что дальше?

Шаблон сообщения

Видите, как ваше сообщение – это строка, вы можете использовать строку интерполяции для динамического ввода – например:

app.post('/send', (req, res) => {
    let now = new Date().toString();
    let email = `${req.body.message} \n \n This was sent: ${now}`;
    let params = {
        Message: email,
        Subject: req.body.subject,
        TopicArn: '

HTTP конечные точки

Вы можете настроить сервис, предназначенный для приема сообщения, если вы хотите вызвать фоновое действие, но не обязательно заботиться о немедленном получении результата. Просто установите конечную точку как HTTP/S, и вы можете отформатировать сообщение, однако вы выбираете. Например, это особенно полезно для серверов/услуг, которые у вас могут не иметь контроля, но позволяют отправлять уведомления WebHook.

Лямбда

В аналогичной вене вы можете использовать эти сообщения для запуска и входов в руки на функции лямбда. Например, это может забить работу обработки. Посмотрите на этот пост, чтобы узнать, как!

смс

Если вы удалите Тема Поле, вы можете отправить 160 символьных SMS-сообщений на любые подписанные номера телефонов.

Кв. Квс

С типом конечной точки SQS вы можете поставить сообщения в очереди, чтобы построить архитектуры, ориентированные на события – посмотрите на эту статью для более подробной информации!

Смешанные сообщения?

Есть MessageRucture Параметр, который вы можете передать, что позволяет вам использовать на тему для передачи нескольких каналов с разными сообщениями – это означает, что вы можете написать полное письмо для всех абонентов электронной почты, но в то же время отправить сообщение, которое оптимизировано для SMS для всех Мобильные подписчики, позволяющие для нескольких каналов связи!

Заключение

AWS Simple Уведомление (SNS) – это супер масштабируемый сервис, который позволяет пользователям легко реализовать модель публикации/подписки с легкостью. Это позволяет нам отправлять тексты, электронные письма, толкающие уведомления или другие автоматизированные сообщения на другие цели на нескольких каналах одновременно.

В этой статье мы создали тему и подписано на него программно, используя AWS Node.js SDK. Затем мы создали конечные точки HTTP в нашем демонстрационном приложении, которые позволяют пользователям подписаться на нашу тему SNS по электронной почте, а другую конечную точку транслировать электронное письмо всем подписчикам.!