ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

Сегодня мы создадим т.н. ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯ (официальное название ಯಾಂಡೆಕ್ಸ್ ಮೇಘ ಕಾರ್ಯಗಳು), которая вступив в сговор с сервисом почтовых рассылок SendGrid будет слать «мыло» мирно спящим пользователям (шутка — я знаю, что все мы против спама).

А ещё я противник (но без фанатизма) традиционных серверов, и сторонник т.н. ಸರ್ವರ್ಲೆಸ್ (бессерверных) решений, поскольку не люблю (да и толком не умею) администрировать сервера, а ещё больше — платить за то время, когда они не нагружены. Другое дело — функции. Их кто-то обслуживает без меня, а я плачу только за вызовы. В начале октября 2019 г. Яндекс представил свои ಯಾಂಡೆಕ್ಸ್ ಮೇಘ ಕಾರ್ಯಗಳು — кажется первый в РФ ಸರ್ವರ್ಲೆಸ್. И что особо приятно — для навыков Алисы они вообще бесплатны, поэтому с тех пор находятся в поле моего периферийного зрения. Но давайте уже приступим.

Представим такой сценарий. Ваше приложение (например, навык Алисы Запомни и Забудь который, кстати, также работает на Яндекс-функциях) предлагает пользователю купить цифровой товар, например, дополнительные опции, и пользователь делает оплату. Некая платежная система (схожая до степени смешения с Yandex.Money) обрабатывает платеж, и шлёт на предоставленный вами адрес (а у нас это будет ссылка для вызова ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು) HTTP-запрос, содержащий детали платежа, такие как сумма, ФИО, телефон и электронная почта плательщика. Мы же хотим эти данные каким-то образом обрабатывать, например: проверять сумму, делать соответствующие записи в базу данных, отправлять пользователям ಎಸ್ಎಂಎಸ್ и ಮಿಂಚಂಚೆ с подтверждением получения оплаты и дальнейшими инструкциями. Такой себе ಸೂಕ್ಷ್ಮ ಸೇವೆ.

О том, как из Яндекс-функций делать записи в БД ಮೇಘ ಅಗ್ನಿಶಾಮಕ мы уже рассматривали в туториале Алиса помнит всё (и в дальнейшем, думаю, рассмотрим пример для другой БД — Yandex Database). О том, как отправлять пользователям ಎಸ್ಎಂಎಸ್ и интегрировать наше приложение с Яндекс.Деньгами — разберём в недалёком будущем. Сейчас займёмся только отправкой писем.

1. Создание аккаунта в SendGrid

ಹೇಳಿಕೆಯನ್ನುSendGrid — это лишь мой выбор, который я сделал по некоторым причинам, и главная из которых — наличие у них готового SDK для Node.js. Вы можете выбрать любой другой сервис почтовых рассылок.

ಮುಂದೆ ಸಾಗೋಣ на страницу регистрации аккаунта и заполняем там регистрационную форму. Затем переходим в ಡ್ಯಾಶ್ಬೋರ್ಡ್, в навигационной панели выбираем Email API -> Integration Guide, а на главной панели — ವೆಬ್ API ಮತ್ತು ನಾಜಿಮೇಮ್ ಕ್ನೋಪ್ಕು ಆಯ್ಕೆ. Всё как на картинке:

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

На следующем шаге выбираем Node.js:

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

Далее придумываем для своего ಎಪಿಐ-ключа название (будет отображаться только в консоли в списке ключей, и к нашему будущему коду отношения не имеет; я вот придумал нетленное demo-api-key) ಮತ್ತು ಬಟನ್ ಒತ್ತಿರಿ ಕೀಲಿಯನ್ನು ರಚಿಸಿ:

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

Ключик сгенерируется, мы его скопируем и сохраним в глубочайшей тайне. А у нас появится экран с кнопкой Verify Integration, как на картинке ниже, но мы её пока нажимать не станем, а перейдём к написанию кода:

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

2. Написание кода

А самого кода, как видите, до смешного мало — 22 строки!

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

ಸಾಲಿನಲ್ಲಿ #8 хардкодом прописана моя почта (и поэтому стыдливо прикрыта) — вы укажите свою. В реальной же жизни мы будем получать все данные (включая ಇಮೇಲ್) из объекта ಕ್ರಿಯೆಯನ್ನು. Например, если методом POST в нашу функцию отправляется объект ಬಳಕೆದಾರ с полем (свойством) ಇಮೇಲ್, значение этого поля можно получить так:

const { user } = event;
const email = user.email;

А если адрес почты передаётся в функцию методом ಪಡೆಯಿರಿ, ಉದಾಹರಣೆಗೆ: https://functions.yandexcloud.net/123abc?[email protected]
значение параметра ಇಮೇಲ್ можно получить эдак:

const email = event.queryStringParameters.email;

Чтобы взглянуть на то, что именно содержится в объекте ಕ್ರಿಯೆಯನ್ನು, можно создать простейшую ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯ и покрутить её запросами:

module.exports.handler = async function (event) {
  return {
   'statusCode': 200, 
   'body': JSON.stringify(event)
  };
};

Подробнее (но менее доходчиво) об этом говорится в официальной документации ಇಲ್ಲಿ.

Итак, создаём каталог проекта (например, ಮೇಲ್ ಮಾಡುವವನು), переходим в него, инициализируем проект, устанавливаем зависимости:

mkdir mailer
cd mailer
npm init -y
npm i @sendgrid/mail email-validator dotenv

Здесь обязательным является только пакет @sendgrid/mail. ಪ್ಲಾಸ್ಟಿಕ್ ಚೀಲ email-validator проверяет на валидность адрес почты (как я сразу не догадался?), но если мы в нём уверены (давно уже проверено без нас), его можно не устанавливать (и в коде, естественно, проверку не делать). Пакет dotenv предназначен для чтения записей из файла .env как переменных среды выполнения. Но в Яндекс-функциях имеется возможность помещать эти переменные непосредственно в среду выполнение. Как? — я покажу это ниже. Поэтому пакет dotenv также можно не ставить, и файл .env — не создавать, и при этом код в файле index.js не менять. Но здесь мы этот пакет установили, поэтому создаём файлы index.js и .env:

touch index.js
touch .env

ಕಡತದಲ್ಲಿ index.js пишем 22 строки кода, показанного на скриншоте выше (только в строке #8 поменяйте почту), а в файле .env — (без каких-либо кавычек и знаков препинания) укажите пару — имя/значение ключа ಎಪಿಐ, который мы недавно получили в консоли SendGrid:
SENDGRID_API_KEY=your-very-secret-sendgrid-api-key

А если хотите, чтобы работы было поменьше — склонируйте репозиторий, установите пакеты:

git clone https://github.com/stmike/ycf-sendgrid-mailer-tutorial.git
cd ycf-sendgrid-mailer-tutorial
npm i

ಕಡತದಲ್ಲಿ index.js, в строке #8 поменяйте почту; в корневом каталоге создайте файл .env, и в нём укажите имя/значение ключа ಎಪಿಐ, как показано чуть выше.

3. Деплой

Более-менее внятно и подробно о Yandex.Cloud и о том, как там размещать ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು рассказано в моей статье ಆಲಿಸ್ ಇನ್ ದಿ ಲ್ಯಾಂಡ್ ಆಫ್ ಬಿಟ್ರಿಕ್ಸ್ — несведущих отсылаю в эту страну, а для всех остальных (и вернувшихся) — далее небольшой комикс (т.е. серия картинок и текста).

ನಾನು ಹೊಂದಿಸುತ್ತಿದ್ದೇನೆ ಜಿಪ್-архив (назовём его, например, mailer.zip), в который включаем каталог ನೋಡ್_ಮಾಡ್ಯೂಲ್‌ಗಳು и файлы .env, index.js — все из каталога нашего проекта:

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

Создаём функцию с названием… правильно — ಮೇಲ್ ಮಾಡುವವನು, в левом навигационном меню вбираем ಸಂಪಾದಕ, заполняем необходимые поля, и переключившись на вкладку ZIP ಆರ್ಕೈವ್ загружаем наш архив mailer.zip:

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

А вот и упомянутая ранее возможность загрузить API-key непосредственно здесь, а не создавать в проекте файл .env, и не устанавливать пакет dotenv. Но мы всё это уже сделали, поэтому показываю просто для информации. То есть — дублировать не надо!

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

Теперь в правом верхнем углу нажимаем кнопку ಆವೃತ್ತಿಯನ್ನು ರಚಿಸಿ, и ждём пару секунд. Когда всё будет готово, мы автоматически перейдём в раздел ಅವಲೋಕನ. Там включим опцию ಸಾರ್ವಜನಿಕ ಕಾರ್ಯ, чтобы с ней можно было взаимодействовать из внешнего мира.

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

Видите синюю ссылку напротив надписи ಕರೆ ಲಿಂಕ್? Нажмите её. Откроется пустое окно браузера… Но подождите — мне пришло письмо:

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

Теперь можно вернуться в консоль SendGrid, и нажать кнопку Verify Integration. Система проверит всё по своим каналам, и в результате должна вернуть такой вот экран:

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

Вот так, ребята (и девчата, разумеется) — всё действительно очень просто и элегантно! Будут ещё статьи. Кому читать подобное интересно — подписывайтесь, чтобы не пропустить.

4. Донаты

ಯಾಂಡೆಕ್ಸ್ ಕಾರ್ಯಗಳು ಮೇಲ್ ಕಳುಹಿಸುತ್ತವೆ

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ