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

2 min


Введение

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

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

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

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

Модель публикации / подписки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Мы можем получить этот набор учетных данных, создав Я пользователь. Открыть 'Сервисы' меню, которое мы использовали для поиска ранее, и на этот раз поиск IAM.

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

IAM Main View

щелчок «Пользователи» слева, затем нажмите 'Добавить пользователя' – вы столкнетесь с экраном, который выглядит следующим образом:

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

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

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

Нажмите «Далее», и вам будут представлены разрешения. Нажать на «Присоединять существующие политики напрямую» кнопка и с помощью поиска 'SNS'вы легко сможете найти 'SNSFullAccess' опция:

Прикрепить вид политики

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

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

Отзыв пользователя IAM

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

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

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

Чтобы определить свой регион, посетите эта страница и найти ближайший к вам регион. По умолчанию в 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.

Демо Node.js приложение

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

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

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

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

Вы можете нажимать ввод до тех пор, пока сценарий не завершится с параметрами по умолчанию, делая нашу точку входа по умолчанию 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}!`));

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

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

$ node index.js

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

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

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

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.

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

  • Protocol: Мы установили его как электронную почту, но это может быть HTTP / S, SMS, SQS (если вы хотите использовать службу очередей AWS) или даже функцию Lambda
  • TopicArn: Это ARN – уникальный идентификатор для темы SNS, которую вы установили ранее. Если у вас его нет, то возьмите его из своей Темы в браузере и вставьте в код прямо сейчас.
  • EndpointТип конечной точки зависит от протокола. Поскольку мы отправляем электронные письма, мы даем ему адрес электронной почты, но если бы мы настраивали 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);
    });
});

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

  • Message: Это сообщение, которое вы хотите отправить – в данном случае это будет тело письма
  • Subject: Это поле только включено потому что мы отправляем электронное письмо – это устанавливает тему письма
  • TopicArn: Это тема, в которую мы публикуем сообщение – это будет публиковать в каждый подписчик на эту тему

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

Вы можете отправить сообщение сейчас, используя Почтальон, или 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, и вы можете отформатировать сообщение по своему усмотрению. Например, это особенно полезно для серверов / служб, которые могут не контролироваться вами, но позволяют отправлять уведомления веб-крючков.

лямбда

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

SMS

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

SQS

С типом конечной точки SQS вы можете помещать сообщения в очереди для построения управляемых событиями архитектур - взгляните на Эта статья Больше подробностей!

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

Eсть MessageStructure параметр, который вы можете передать, который позволяет использовать в теме для трансляции по нескольким каналам с разными сообщениями - это означает, что вы можете написать полное электронное письмо для всех подписчиков электронной почты, но в то же время отправить сообщение, оптимизированное для SMS всем абоненты мобильной связи, позволяющие многоканальную связь!

Вывод

Сервис простого оповещения AWS (SNS) - это супермасштабируемый сервис, который позволяет пользователям легко реализовать модель публикации / подписки. Это позволяет нам отправлять текстовые сообщения, электронные письма, push-уведомления или другие автоматические сообщения другим целям одновременно по нескольким каналам.

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


0 Comments

Ваш e-mail не будет опубликован. Обязательные поля помечены *