Сьогодні ми створимо т.зв. Яндекс-функцію (Офіційна назва
А ще я противник (але без фанатизму) традиційних серверів і прихильник т.зв. без сервера (безсерверних) рішень, оскільки не люблю (та й не вмію) адмініструвати сервери, а ще більше — платити за той час, коли вони не навантажені. Інша справа – функції. Їх хтось обслуговує без мене, а я плачу лише за виклики. На початку жовтня 2019 р. Яндекс представив свої Yandex Cloud Functions - здається перший у РФ без сервера. І що особливо приємно — для навичок Аліси вони взагалі безкоштовні, тож відтоді перебувають у полі мого периферійного зору. Але давайте вже приступимо.
Уявимо такий сценарій. Ваша програма (наприклад, навик Аліси
Про те, як із Яндекс-функцій робити записи до БД Хмарний камінник ми вже розглядали у туторіалі
1. Створення облікового запису в SendGrid
ПриміткаSendGrid це лише мій вибір, який я зробив з деяких причин, і головна з яких - наявність у них готового SDK для Node.js. Ви можете вибрати будь-який інший сервіс поштових розсилок.
Переходимо
На наступному кроці вибираємо Node.js:
Далі вигадуємо для свого API-ключа назва (відображатиметься тільки в консолі в списку ключів, і до нашого майбутнього коду стосунку не має; я ось придумав нетлінне demo-api-key) і натискаємо кнопку Створити ключ:
Ключик згенерується, ми його скопіюємо і збережемо в глибокій таємниці. А у нас з'явиться екран із кнопкою Verify Integration, Як на малюнку нижче, але ми її поки натискати не станемо, а перейдемо до написання коду:
2. Написання коду
А самого коду, як бачите, до смішного мало – 22 рядки!
У рядку #8 хардкодом прописано мою пошту (і тому сором'язливо прикрито) — ви вкажіть свою. У реальному ж житті ми отримуватимемо всі дані (включаючи e-mail) з об'єкта подія. Наприклад, якщо методом POST в нашу функцію надсилається об'єкт користувач з полем (властивістю) e-mail, значення цього поля можна отримати так:
const { user } = event;
const email = user.email;
А якщо адреса пошти передається у функцію методом GET, Наприклад: https://functions.yandexcloud.net/123abc?[email protected]
значення параметра e-mail можна отримати так:
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. Пакет валідатор електронної пошти перевіряє на валідність адресу пошти (як я одразу не здогадався?), але якщо ми в ній впевнені (давно вже перевірено без нас), її можна не встановлювати (і в коді, звичайно, перевірку не робити). Пакет dotenv призначений для читання записів із файлу .env як змінних середовища виконання. Але в Яндекс-функціях є можливість поміщати ці змінні у середу виконання. Як? - Я покажу це нижче. Тому пакет dotenv також можна не ставити, і файл .env - не створювати, і при цьому код у файлі index.js не змінювати. Але тут ми цей пакет встановили, тому створюємо файли index.js и .env:
touch index.js
touch .env
У файлі index.js пишемо 22 рядки коду, показаного на скріншоті вище (тільки у рядку #8 поміняйте пошту), а у файлі .env — (без будь-яких лапок і розділових знаків) вкажіть пару — ім'я/значення ключа API, який ми нещодавно отримали в консолі 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, і в ньому вкажіть ім'я/значення ключа API, Як показано трохи вище.
3. Деплой
Більш-менш виразно і докладно про Яндекс.Хмарі і про те, як там розміщувати Яндекс-функції розказано у моїй статті
Створюємо ZIP-архів (назвемо його, наприклад, mailer.zip), до якого включаємо каталог вузли_модулі та файли .env, index.js - всі з каталогу нашого проекту:
Створюємо функцію з назвою ... правильно - пошта, у лівому навігаційному меню вбираємо Редактор, заповнюємо необхідні поля, та переключившись на вкладку ZIP-архів завантажуємо наш архів mailer.zip:
А ось і згадана раніше можливість завантажити API-key безпосередньо тут, а не створювати у проекті файл .env, і не встановлювати пакет dotenv. Але ми все це зробили, тому показую просто для інформації. Тобто дублювати не треба!
Тепер у правому верхньому кутку натискаємо кнопку Створити версію, і чекаємо на пару секунд. Коли все буде готове, ми автоматично перейдемо до розділу Огляд. Там увімкнемо опцію Публічна функціящоб з нею можна було взаємодіяти із зовнішнього світу.
Бачіть синє посилання навпроти напису Посилання для виклику? Натисніть її. Відкриється порожнє вікно браузера ... Але зачекайте - мені надійшов лист:
Тепер можна повернутися до консолі SendGrid, і натиснути кнопку Verify Integration. Система перевірить все своїми каналами, і в результаті повинна повернути такий ось екран:
Ось так, хлопці (і дівчата, зрозуміло) все дійсно дуже просто і елегантно! Будуть ще статті. Кому читати таке цікаво — підписуйтесь, щоби не пропустити.
4. Донати
Джерело: habr.com