Автор оригинала: FreeCodeCamp Community Member.
Смертная архитектура – это последнее модное слово в отрасли, и многие из крупнейших технологических компаний начали обнимать его.
В этой статье мы узнаем, что это такое и почему вы должны использовать его. Мы также настроим AWS, создайте наше приложение Serverless и создайте Slack App!
Что такое безверенно?
Serverless – это облачная вычисления парадигмы, в которой разработчик больше не должен беспокоиться о поддержании сервера – они просто сосредоточены на коде.
Облачные провайдеры, такие как AWS или Azure, теперь несут ответственность за выполнение кода и обслуживания серверов, динамически выделения их ресурсов. Разнообразные события могут вызывать выполнение кода, включая задания CRON, HTTP-запросы или события базы данных.
Код, который разработчики отправляют в облако, обычно просто функция, поэтому, во многих случаях, неверная архитектура реализована с использованием функций-AS-A-A-Service или Faas. Основными облачными поставщиками предоставляют FAAS FAAS, такие как AWS Lambda и функции Azure.
Почему безведно?
Не только Were не позволяет разработчикам просто сосредоточиться на коде, но он также имеет много других преимуществ.
Поскольку облачные провайдеры теперь несут ответственность за выполнение кода и динамически распределять ресурсы на основе триггеров событий, вы обычно платите только за запрос или когда ваш код выполняется.
Кроме того, поскольку облачные провайдеры обрабатывают ваши серверы, вам не нужно беспокоиться о расширении масштабирования – поставщик облака будет справиться с ним. Это делает приложения без сервеса более низкой стоимостью, легче поддерживать и легче масштабироваться.
Настройка AWS Lambda
Для этого учебника я буду использовать aws lambda, поэтому сначала мы создадим AWS Account Отказ Я нахожу AWS UI трудно понять и трудно навигаться, поэтому я буду добавлять скриншоты для каждого шага.
Как только вы войти в систему, вы должны увидеть это:
Далее мы настроим пользователь IAM. Я (Управление идентификацией и управлением доступа) пользователь взаимодействует с AWS и его ресурсами от вашего имени. Это позволяет создавать различные пользователи IAM с различными разрешениями и целями, без ущерба для безопасности вашей учетной записи пользователя root.
Нажмите на вкладку «Услуги» в верхней части страницы и введите «IAM» в бар:
Нажмите на первый результат, и вы увидите, на левой боковой панели, что вы находитесь на приборной панели. Нажмите на опцию «Пользователи», чтобы создать наш новый пользователь IAM.
Нажмите на кнопку «Добавить пользователя», чтобы создать новый пользователь. Заполните детали следующим образом:
Вы можете назвать своего пользователя что угодно, но я пошел с Serverless-admin Отказ Убедитесь, что у вашего пользователя «Программный доступ» к AWS, не «AWS Управление консолью». Вы бы использовали последние для товарищей по команде или другим Люди кому нужен доступ к AWS. Нам просто нужен этот пользователь, чтобы взаимодействовать с AWS Lambda, поэтому мы можем просто дать им программный доступ.
Для разрешений я решил прикрепить существующую политику, так как у меня нет никаких групп, и у меня нет никаких существующих пользователей, которые я хочу скопировать разрешения для. В этом примере я создадим пользователь с доступом администратора, поскольку он только для личного проекта; Тем не менее, если вы должны были использовать приложение без сервеса в реальной производственной среде, ваш пользователь IAM должен быть выделен только для доступа к нужным частям adambda. (Инструкции можно найти здесь ).
Я не добавил никаких тегов и создал пользователя. Важно сохранить информацию, предоставленную вам информацию на следующем экране – идентификатор доступа и секретный ключ доступа.
Не оставляйте этот экран, не копируя оба! Вы не сможете увидеть ключ секретного доступа снова после этого экрана.
Наконец, мы добавим эти учетные данные в командную строку AWS. Используйте это Руководство Чтобы получить AWS CLI SETUP.
Убедитесь, что у вас установлено работает AWS --version Отказ Вы должны увидеть что-то вроде этого:
Затем запустите AWS Configure и заполните подсказки:
У меня есть регион по умолчанию, как US-East-2 уже настроен, но вы можете использовать это Чтобы определить, что такое ваш регион.
Чтобы убедиться, что у вас есть ваши учетные данные правильно настроены, вы можете запустить Cat ~/.aws/учетные данные в вашем терминале.
Если вы хотите настроить профиль, отличный от вашего по умолчанию, вы можете запускать команду следующим образом: AWS Configure --Profile [Имя профиля] Отказ
Если у вас были проблемы с последующими шагами, вы также можете проверить Документация AWS Отказ
Настроить через серверу
Перейдите на свой терминал и установите Смертный Пакет глобально использует NPM : NPM I -G безверенно Отказ ( Больше информации на серверу здесь ) И ваш терминал должен выглядеть что-то подобное:
Далее перейдите к каталогу, где вы хотите создать приложение, то запускайте Смертный И следуйте подсказкам:
Для этого приложения мы будем использовать Node.js. Вы можете назвать ваше приложение все, что вы хотите, но я позвонил, мой ЭКСПЕРТИРОВАНИЕЛПАПП Отказ
Откройте свой любимый редактор кода к содержимому в ЭКСПЕРТИРОВАНИЕЛПАПП (или что вы назвали вашему приложению).
Во-первых, мы посмотрим на Serverless.yml Отказ Вы увидите, что здесь много прокомментированного кода, описывающего различные параметры, которые вы можете использовать в файле. Определенно дайте ему чтение, но я удалил его только к:
service: exampleslackapp
provider:
name: aws
runtime: nodejs10.x
region: us-east-2
functions:
hello:
handler: handler.helloЯ включил регион Поскольку по умолчанию это США-Восток-1 Но мой профиль AWS настроен на US-East-2 Отказ
Давайте развернум то, что мы уже имели под управлением Смертное развертывание В каталоге приложения, что Смертный только что создан для нас. Выход должен выглядеть что-то подобное:
И если вы запустите Serverless Invoke -f Привет В вашем терминале он запустят приложение, и вы должны увидеть:
{
"statusCode": 200,
"body": "{\n \"message\": \"Go Serverless v1.0! Your function executed successfully!\",\n \"input\": {}\n}"
}Для дальнейшего доказательства того, что наше приложение SLAST живут, вы можете вернуться к консоли AWS. Перейдите к раскрыванию услуг, ищите «лямбда» и нажмите на первый вариант («Запустите код, не думая о серверах»).
И вот ваше приложение!
Далее мы рассмотрим на самом деле, используя безверенно, создавая наше приложение Slack. Наше Slack App будет публиковать случайные Рон Суонсон Цитата, чтобы расслабиться с помощью Команда Slash нравится:
Следующие шаги не обязательно должны быть сделаны в том порядке, что я их сделал, так что если вы хотите пропустить, не стесняйтесь!
Добавление API в наш код
Я использую Это API Чтобы генерировать котировки Рона Шонсона, поскольку документы довольно просты (и, конечно, это бесплатно). Чтобы увидеть, как запрашиваются запросы, и что возвращается, вы можете просто поставить этот URL в браузер:
https://ron-swanson-quotes.herokuapp.com/v2/quotes
Вы должны увидеть что-то вроде этого:
Итак, мы можем принять нашу первоначальную функцию и изменить его как таковую:
module.exports.hello = (event) => {
getRon();
};и Гетрон похоже:
function getRon() {
request('https://ron-swanson-quotes.herokuapp.com/v2/quotes', function (err, resp, body) {
console.log('error:', err)
console.log('statusCode:', resp && resp.statusCode)
console.log('body', body)
})
}Теперь давайте проверим, работает ли это. Чтобы проверить этот код локально, в вашем терминале: Serverless вызывает локальный - H привет Отказ Ваш выход должен выглядеть что-то вроде:
Serverless Invoke -f Привет будет запустить код, который вы развернули, как мы видели в предыдущих разделах. Serverless вызывает локальный - H привет Однако запускает ваш локальный код, так что это полезно для тестирования. Продолжай и развернитесь, используя Смертное развертывание !
Создайте свое приложение Slack
Чтобы создать свое приложение Slack, следуйте этим ссылка Отказ Он сначала заставит вас войти в Slack Workspace, поэтому будьте уверены, что вы можете добавить это приложение. Я создал тестирование одного для моих целей. Вам будет предложено этому модальному. Вы можете заполнить все, что вы хотите, но вот что у меня есть в качестве примера:
Оттуда вы будете доставлены на домашнюю страницу для вашего приложения. Вы обязательно должны исследовать эти страницы и варианты. Например, я добавил следующую настройку в свое приложение:
Далее нам нужно добавить несколько разрешений в приложение:
Чтобы получить токен AAUTH Access, вы должны добавить некоторые объем и разрешения, которые вы можете сделать, прокручиваясь вниз:
Я добавил «изменить ваши публичные каналы», чтобы бот мог написать на канал, «отправить сообщения как Ron Swanson», поэтому, когда сообщение будет опубликовано, он выглядит как пользователь, называемый ron Swanson, публикует сообщение и команды Slash Таким образом, пользователь может «запросить» цитату, как показано на скриншоте в начале статьи. После того, как вы сохраните изменения, вы сможете прокрутить обратно в OAuths & Permissions, чтобы увидеть:
Нажмите кнопку, чтобы установить приложение к Workspace, и у вас будет токен доступа к OAUTH! Мы вернемся к этому за секунду, поэтому либо скопируйте его или помните, что это в этом месте.
Подключите код и Slack App
В AWS Lambda найдите свою функцию Slack App. Ваш раздел «Код функции» должен отображать наш обновленный код с вызовом на наш RON SWANSON API (если он не вернется к вашему терминалу и запустить Serverless Deploy ).
Прокрутите ниже, что в раздел, который говорит « Переменные среды », и поместите токен Well Oauth Access (вы можете назвать ключ, все, что вы хотели бы):
Давайте вернемся к нашему коду и добавьте слабые в нашу функцию. В верхней части нашего файла мы можем объявить Const С нашим новым токеном ОАУТ:
const.env.oauth_token Отказ
Process.env Просто захватывает нашу переменные окружающей среды ( дополнительное чтение ). Далее давайте посмотрим на Slack API Чтобы выяснить, как опубликовать сообщение на канал.
Две картины выше, которые я взял из API, являются наиболее актуальными для нас. Итак, чтобы сделать этот запрос API, я буду использовать Запрос Проходя в объекте под названием Варианты :
let options = {
url: 'https://slack.com/api/chat.postMessage',
headers: {
'Accept': 'application/json',
},
method: 'POST',
form: {
token: SLACK_OAUTH_TOKEN,
channel: 'general', // hard coding for now
text: 'I am here',
}
}И мы можем сделать запрос:
request(options, function(err, resp, body) {
console.log('error:', err)
console.log('statusCode:', resp && resp.statusCode)
console.log('body', body)
})Наконец, я обрушу все это функцию:
function postRon(quote) {
let options = {
url: 'https://slack.com/api/chat.postMessage',
headers: {
'Accept': 'application/json',
},
method: 'POST',
form: {
token: SLACK_OAUTH_TOKEN,
channel: 'general',
text: quote,
}
}
request(options, function(err, resp, body) {
console.log('error:', err)
console.log('statusCode:', resp && resp.statusCode)
console.log('body', body)
})
}И мы можем назвать это из Гетрон нравится:
function getRon() {
request('https://ron-swanson-quotes.herokuapp.com/v2/quotes', function (err, resp, body) {
console.log('error:', err)
console.log('statusCode:', resp && resp.statusCode)
console.log('body', body)
postRon(body.substring(2, body.length - 2)) // here for parsing, remove if you want to see how/why I did it
})
}Так что наш код все вообще выглядит так:
'use strict';
let request = require('request');
const SLACK_OAUTH_TOKEN = process.env.OAUTH_TOKEN
module.exports.hello = (event) => {
getRon();
};
function getRon() {
request('https://ron-swanson-quotes.herokuapp.com/v2/quotes', function (err, resp, body) {
console.log('error:', err)
console.log('statusCode:', resp && resp.statusCode)
console.log('body', body)
postRon(body.substring(2, body.length - 2))
})
}
function postRon(quote) {
let options = {
url: 'https://slack.com/api/chat.postMessage',
headers: {
'Accept': 'application/json',
},
method: 'POST',
form: {
token: SLACK_OAUTH_TOKEN,
channel: 'general',
text: quote,
}
}
request(options, function(err, resp, body) {
console.log('error:', err)
console.log('statusCode:', resp && resp.statusCode)
console.log('body', body)
})
}Теперь давайте тестируем! К сожалению, наша переменная среды в AWS Lambda не доступна для нас, когда мы запуская Serverless вызывает локальный - H привет Отказ Есть несколько способов подходить к этому, но для наших целей вы можете просто заменить значение для Slack_oauth_token С вашим настоящим токеном ОАУТ (убедитесь, что это строка). Но будьте уверены, что вы переключите его назад, прежде чем нажать на управление версией!
Беги Serverless вызывает локальный - H привет И, надеюсь, вы должны увидеть такое сообщение в вашем # Генеральном канале:
Обратите внимание, что я сдал имя моего канала как «General», поскольку это мое тестовое рабочее пространство; Однако, если вы находитесь в фактическом рабочем пространстве, вы должны создать отдельный канал для тестирования приложений и поместить там сообщение, пока вы тестируете.
И в вашем терминале вы должны увидеть что-то вроде:
Если это работает, продолжайте и разверните его, используя Смертное развертывание Отказ Если это не так, лучший способ отлаживать это, чтобы настроить код и запустить Serverless вызывает локальный - H привет Отказ
Добавление команды SLASH
Последняя и окончательная часть добавляет команду SLASH! Вернитесь на домашнюю страницу вашей функции в AWS Lambda и ищите кнопку, которая говорит «Добавить триггер»:
Нажмите на кнопку, чтобы добраться до страницы «Добавить триггер» и выберите «Gateway API» в списке:
Я заполнил информацию на основе по умолчанию в основном:
Я также покинул эту API для использования для использования – однако, если вы используете это в производстве, вы должны обсудить, какой стандартный протокол будет с вашей командой. «Добавить» API, и вы должны получить конечную точку API. Держите это, потому что нам понадобится его для следующего шага.
Давайте вернемся к нашему приложению Slack и добавьте команду SLASH:
Нажмите «Создать новую команду», и она должна появиться с новым окном для создания команды. Вот как я наполнил мое:
Вы можете ввести все, что вы хотите «команда» и «Краткое описание», но для «URL-адреса запроса» вы должны поставить конечную точку API.
Наконец, мы вернемся к нашему коду, чтобы сделать некоторые окончательные корректировки. Если вы попытаетесь использовать команду SLASH, вы должны получить какую-то ошибку обратно – это связано с тем, что расслабитель ожидает ответа, а AWS ожидает, что вы получите ответ, когда конечная точка ударила. Итак, мы изменим нашу функцию, чтобы позволить Обратный вызов ( для справки ):
module.exports.hello = (event,context,callback) => {
getRon(callback);
};а потом мы изменим Гетрон сделать что-то с Обратный вызов :
function getRon(callback) {
request('https://ron-swanson-quotes.herokuapp.com/v2/quotes', function (err, resp, body) {
console.log('error:', err)
console.log('statusCode:', resp && resp.statusCode)
console.log('body', body)
callback(null, SUCCESS_RESPONSE)
postRon(body.substring(2, body.length - 2))
})
}где Success_Response находится в верхней части файла:
const SUCCESS_RESPONSE = {
statusCode: 200,
body: null
}Вы можете поставить обратный вызов здесь или в Postron – Это просто зависит от того, что ваши цели с обратным вызовом.
Наш код на данный момент сейчас выглядит что-то вроде:
'use strict';
let request = require('request');
const SLACK_OAUTH_TOKEN = OAUTH_TOKEN
const SUCCESS_RESPONSE = {
statusCode: 200,
body: null
}
module.exports.hello = (event,context,callback) => {
getRon(callback);
};
function getRon(callback) {
request('https://ron-swanson-quotes.herokuapp.com/v2/quotes', function (err, resp, body) {
console.log('error:', err)
console.log('statusCode:', resp && resp.statusCode)
console.log('body', body)
callback(null, SUCCESS_RESPONSE)
postRon(body.substring(2, body.length - 2))
})
}
function postRon(quote) {
let options = {
url: 'https://slack.com/api/chat.postMessage',
headers: {
'Accept': 'application/json',
},
method: 'POST',
form: {
token: SLACK_OAUTH_TOKEN,
channel: 'general',
text: quote,
}
}
request(options, function(err, resp, body) {
console.log('error:', err)
console.log('statusCode:', resp && resp.statusCode)
console.log('body', body)
})
}Вы должны быть в состоянии использовать /Рон Команда в провисании сейчас и получите цитату RON Swanson. Если вы этого не сделаете, вы можете использовать журналы CloudWatch, чтобы увидеть, что пошло не так:
Сейчас наш код работает сейчас, мы жестко определяли в названии канала. Но, что мы на самом деле хотим, это цитата, чтобы разместить в сообщении, где вы использовали /Рон Отказ
Итак, теперь мы можем использовать событие часть нашей функции.
module.exports.hello = (event,context,callback) => {
console.log(event)
getRon(callback);
};Использовать /Рон Чтобы запустить функцию, а затем проверьте журналы CloudWatch, чтобы увидеть, что зарегистрировано в консоли (вам может потребоваться обновить). Проверьте самые последние журналы, и вы должны увидеть что-то вроде этого:
Первый элемент в этом списке (где он говорит «ресурс», «Путь» и т. Д.) Это событие, поэтому, если вы расширите это, вы увидите длинный список вещей, но что мы ищем тело ‘полностью вниз внизу:
Тело – это строка с какой-то соответствующей информацией, одна из которых является «Channel_id». Мы можем использовать Channel_id (или Channel_name) и передавать его в функцию, которая создает наше слабые сообщения. Для вашего удобства я уже проанализировал эту строку: Event.body.split ("&") [3] .split ("=") [1] должен дать вам channel_id. Я жесткокодировал, в какой записи (3) канал_Ид был для простоты.
Теперь мы можем изменить наш код, чтобы сохранить эту строку в качестве переменной:
Пусть (как наш ответ)
module.exports.hello = (event,context,callback) => {
console.log(event)
channel = event.body.split("&")[3].split("=")[1]
console.log(context)
getGoat(callback);
};и в Postron :
let options = {
url: 'https://slack.com/api/chat.postMessage',
headers: {
'Accept': 'application/json',
},
method: 'POST',
form: {
token: SLACK_OAUTH_TOKEN,
channel: channel,
text: quote,
}
}Наконец, если вы используете Slack Command в любом канале в рабочем пространстве, вы сможете увидеть всплывающую цитату RON SWANSON! Если нет, как я упоминал ранее, самые распространенные инструменты, которые я использую для отладки приложений без сервеса, являются Serverless вызывает локальный -F <имя функции> и журналы cloudwatch.
Надеюсь, вы успешно сможете создать функционирующее приложение Slack! Я включал ресурсы и чтение фона, диспергируемые по всей статье, и я рад ответить на любые вопросы, которые вы можете иметь!
Окончательный репо с кодом: https://github.com/lsurasani/ron-swanson-slack-app/