Автор оригинала: Nicholas Major.
Что противоположно мальчику, который плакал волка? Мальчик, который воскликнул, что происходит что-то удивительное? Мальчик, который воскликнул бесплатную пиццу?
Смертная архитектура может быть свободной пиццей, эквивалентной веб-технологии с точки зрения того, насколько это удивительно. Это все еще очень новые технологии, но чем больше я узнаю об этом и использую его, тем больше я убежден, что это будущее веб-разработки.
В этом посте:
Я собираюсь перейти на то, что такое промежуточная архитектура, и как использование его отличается от работы с традиционной веб-структурой. Я также пройду по преимуществам безвесочных.
Тогда я покажу вам, как вы можете сделать и развернуть простой серверу без сервеса для приложения raction, используя AWS LAMBDA (Безсекретная платформа Amazons).
И, наконец, обернуть его, я пойду на некоторые из недостатков архитектуры без сердца.
Сторона примечания: я собираюсь использовать платформу Amazon для всех примеров в этом посте, но имейте в виду, что там есть другие провайдеры без прослушивания без прослушивания. Детали реализации будут отличаться в зависимости от того, какой вы используете.
Давайте начнем!
Что такое безверенно?
Хорошо, хорошо, технически термин сервера не вводит в заблуждение. Термин Were Serverless относится к FAAS или функции в качестве службы. Мы называем это безвесочным, потому что, хотя эти функции все еще работают на сервере где-то, вам не нужно платить, настроить или поддерживать сервер самостоятельно.
FAAS – форма Вычисление на основе событий Отказ В основном вы настраиваете функции, которые будут запущены определенными событиями. Эти функции выполняются в небольших (или больших) контейнерах, содержащих все зависимости, которым они должны работать.
Вот классная часть – эти функции могут быть вызваны всевозможные события Отказ
Вот несколько событий AWS Lambda могут быть вызваны:
- События Amazon S3 – например, когда объект добавлен или удален из S3.
- Amazon Simple Eail Service – когда вы получите электронную почту.
- Amazon Alexa – Да, вы можете запускать функции, разговаривая с Алекса.
- Amazon Dynamodb – триггеру при изменении данных в вашей базе данных.
- Запланированные события – самоуверенность.
- Ворота Amazon API – Святой Грааль!
Amazon API Gateway! Вы можете вызвать эти события с помощью API. Aaaaaand, не только вы можете вызвать функцию с помощью запроса API, что функция может отправить обратно ответ! Это спина!
Когда вы сломаете любую веб-каркас, даже большие, такие как рельсы, все они сводится к каждому запросу на выполнение и возвращаемое значение одной функции. В случае рельсов каждый запрос сопоставлен на одно действие контроллера, и весь остальный код просто помогает контроллеру создать ответ.
Сначала кажется немного странным, чтобы подумать о веб-приложениях с точки зрения индивидуальных функций, но все другие части структуры есть, они просто обрабатываются в инваструктуре.
Хороший пример этого – это маршрутизация. В Serverless вы используете файл конфигурации, чтобы сообщить о забавке, какие события API подключаться к тому, какие функции, поэтому ни один из вашего фактического кода не участвует в маршрутизации.
Почему серверу
Стоимость Одним из самых больших преимуществ безвесочных является стоимость. Вы платите только за запрос и время выполнения функции. Это значит больше не платить за простые серверы. Это заканчивает спасение некоторых компаний много денег.
Масштабируемость Serverless решает большинство проблем масштабирования, потому что каждая функция – это собственное маленькое микросервис, которое может автоматически масштабировать поставщиком.
Некоторые из этих других преимуществ довольно субъективны, но они часто придумывают в обсуждениях без сервера.
Время на рынок Одним из заявленных преимуществ является более быстрым временем для рынка. Это на самом деле имеет смысл. Вы экономите много времени, не беспокоитесь о dev ops, а некоторые из вещей, которые вы должны были написать код для обработки инвастры, оставляя вам больше времени для разработки важных частей вашего приложения.
Снижение сложности программного обеспечения Конечно, все еще можно писать плохо, тесно связанный код в серверу, но разделение вашего приложения в различные функции помогают вам писать лучше, свободно связанный код, приводящий к меньшим комплексным программным обеспечению.
Более короткие циклы выпуска Если все слабо связано, это может означать более короткие циклы выпуска.
Индустриальное направление Другой Почему Это тот факт, что это похоже на то, как отрасль направляется. Некоторое время, в отрасли тяжело тренды на пути к большему спереди. Поскольку фронтальные рамки, такие как угловые и реагирование, выполняют все больше и больше тяжелого подъема для клиента, задние концы для веб-приложений были сокращены. WESERLELS, кажется, тестирует, насколько маленьким может быть задняя часть.
Как
Вот момент, когда вы ждали!
При подготовке к этому посту я построил небольшое реагированное приложение под названием «Визитная кардинальность». Приложение позволяет людям создавать красочные визитки.
Теперь я хочу, чтобы это приложение позволило пользователям фактически загружать PDFS их дизайна визитной карточки. Чтобы это сделать, мне понадобится небольшая задняя обработка. В частности, я хочу одну конечную точку, которая получит HTML дизайна визитной карточки и вернуть URL-адрес, пользователь может использовать для загрузки PDF дизайна.
Прежде чем мы начнем, давайте найдя момент, чтобы оценить тот факт, что мы будем отправлять HTML от клиента до конца. ржу не могу.
Вот наша дорожная карта:
- Настройте и создайте новый проект
- Развернуть и отправить запрос теста
- Настройте ведро S3
- Код нашей функции
- Тестирование и окончательное развертывание
Давайте начнем…
Настройте и создайте новый проект
Serverless Toolkit над Serverless.com Имеет удивительную структуру с невероятной документацией, и это то, что мы собираемся использовать сегодня.
У вас уже должно быть Узел V6.5.0
или выше установлено.
Сначала установите Serverless CLI: NPM Установить -G Serverless
Отказ
Тогда следуйте за Эти инструкции Чтобы настроить учетную запись AWS и учетные данные.
После выполнения этих инструкций у вас должен быть идентификатор ключа доступа и ключ секретного доступа, и оба должны быть добавлены в среду оболочки под названиями переменной Aws_access_key_id
и Aws_secret_access_key
Отказ Вот где Serverless CLI ищет учетные данные при развертывании.
Теперь, когда у вас есть все настроен, давайте создадим наш задний конец, запустив эту команду:
serverless create --template aws-nodejs --path business-cardistry
Это должно создать новую папку для нас под названием Бизнес-кардинальность
Отказ Давайте пойдем в эту папку и оглянемся вокруг.
$ cd business-cardistry $ ls -lah total 24 drwxr-xr-x 5 nmajor staff 160B Dec 27 13:37 . drwxr-xr-x 110 nmajor staff 3.4K Dec 27 13:37 .. -rw-r--r-- 1 nmajor staff 86B Dec 27 13:37 .gitignore -rw-r--r-- 1 nmajor staff 466B Dec 27 13:37 handler.js -rw-r--r-- 1 nmajor staff 2.8K Dec 27 13:37 serverless.yml
Как вы можете видеть, кроме .gitignore
у нас есть только два файла, Handler.js
и Serverless.yml
Отказ Позже эта структура файлов может расти в какую-либо структуру, нам нужно поддерживать наш код, но все возвращаются к этим двум файлам.
Лучший способ узнать, как работают эти файлы, – это погрузиться и немного изменить их, чтобы увидеть, как они работают.
Я открыл Serverless.yml
И удалил все комментарии, поэтому теперь у нас есть что-то подобное (я добавил некоторые аннотации):
# serverless.yml service: business-cardistry # Name of our service provider: name: aws # AWS is our FaaS provider runtime: nodejs6.10 # The language our functions are using functions: # This is our list of functions hello: # We have a function named hello handler: handler.hello # references a function called hello in handler.js
Давайте изменим наш Привет
функция, переименоваясь в PDF
и подключение к этому событию API. Мы делаем это, изменяя наши Функции
раздел, чтобы выглядеть так:
functions: pdf: handler: handler.pdf events: - http: path: pdf method: post
Как видите, мы добавили События
Уровень нашего Привет
раздел. Мы устанавливаем путь к PDF
и метод для пост
Отказ Это означает, что мы можем вызвать это событие, отправив почтовый запрос на Некоторые URL-GOOT-TOE/PDF Отказ Это выглядит очень похоже на систему маршрутизации в традиционной веб-каркасе, но опять же, она обрабатывается на уровне инфраструктуры.
Теперь давайте посмотрим на Handler.js
Отказ
# handler.js 'use strict'; module.exports.hello = (event, context, callback) => { const response = { statusCode: 200, body: JSON.stringify({ message: 'Go Serverless v1.0! Your function executed successfully!', input: event, }), }; callback(null, response); };
Опять же, давайте изменим это, изменив Привет
к PDF
Отказ Давайте также изменим тело, чтобы вернуть только сообщение. Теперь файл должен выглядеть так:
'use strict'; module.exports.pdf = (event, context, callback) => { const response = { statusCode: 200, body: JSON.stringify({ message: 'Go Serverless v1.0! Your function executed successfully!', }), }; callback(null, response); };
Хорошо, сейчас Serverless.yml
Определяет функцию под названием PDF
, который связан с PDF
Функция в Handler.js
Отказ Теперь мы должны иметь все, что нам нужно развернуть и отправить запрос.
Развернуть и отправить запрос теста
На самом деле нет никакого прямого способа запустить ваш скрипт без сервера, поэтому нам действительно нужно развернуть его, чтобы проверить его.
Вы можете развернуть его с помощью команды:
serverless deploy -s dev
dev
Часть говорит ему, чтобы установить сцену для разработки. Этап заключается в том, как мы дифференцируем производственный код от кода развития. Мы будем развернуть его на этап производства, когда все работает.
Вы должны увидеть что-то вроде этого, когда вы развертываете:
$ serverless deploy -s dev Serverless: Packaging service... Serverless: Excluding development dependencies... Serverless: Uploading CloudFormation file to S3... Serverless: Uploading artifacts... Serverless: Uploading service .zip file to S3 (327 B)... Serverless: Validating template... Serverless: Updating Stack... Serverless: Checking Stack update progress... ............................... Serverless: Stack update finished... Service Information service: business-cardistry stage: dev region: us-east-1 stack: business-cardistry-dev api keys: None endpoints: POST - https://o20pczjzbl.execute-api.us-east-1.amazonaws.com/dev/pdf functions: pdf: business-cardistry-dev-pdf
Для нашей конечной точки есть URL. Давайте попробуем это!
$ curl -X POST https://o20pczjzbl.execute-api.us-east-1.amazonaws.com/dev/pdf {"message":"Go Serverless v1.0! Your function executed successfully!"}
Оно работает! Я все еще взорвался, насколько легко.
Настройте ведро S3
Поскольку мы собираемся отправить обратно ссылку, которую пользователь может использовать для загрузки своей визитной карточки, нам нужно загрузить PDFS на S3. Давайте быстро настроим ведро S3 с надлежащими разрешениями.
Во-первых, давайте поговорим о разрешениях. Лямбдас имеет роль исполнения, которую они предполагают, когда они бегут. Разрешения на роль выполнения определят, какие услуги AWS (как S3) может получить доступ нашу функцию лямбда.
По умолчанию каждая новая функция Lambda получает свою новую роль, нам нужно сначала получить роль ARN новой роли, созданной для нашей функции. Роль ARN является идентификатором роли, которую мы будем использовать, чтобы дать этот доступ к роли к S3.
Позже, когда мы развертываем функцию производства, мы изменим роль выполнения функции производства в соответствии с ролью dev, которая даст производственную функцию одинаковым доступом, что имеет функцию Dev.
Но сначала нам нужна эта роль ARN.
Войдите в свою консоль AWS и перейдите в службу лямбда.
Вы должны увидеть нашу функцию в списке. Продолжай и нажмите на него.
Прокрутите вниз до раздела, который говорит «роль исполнения», и вы должны увидеть роль, которая выбрана в данный момент. Не меняйте это – нам просто нужно было увидеть имя роли.
Теперь, получите роль ARN, перейдем к службе IAM в консоли AWS, нажмите «Роли» в боковой панели и выберите роль для функции. Вы должны увидеть «роль ARN» в верхней части страницы роли.
Или, если у вас установлен AWS CLI, вы можете получить роль ARN, запустив эту команду:
aws iam get-role --role-name name-of-role
Роль ARN должна выглядеть что-то подобное:
ARN: AWS: IAM:: 525814828111: Роль/Бизнес-кардина-ДЭВ-США-Восток-1-Ланцдар
Теперь перейдите на службу S3.
Нажмите «Создать ведро».
Дайте ведро имя, но оставьте все остальное по его значению по умолчанию, нажав «Далее», «Далее» «Далее» «Создать ведро».
Затем нажмите на ваше недавно созданное ведро.
Выберите вкладку Permissions, затем Bucket Policy.
Вставьте это в редактор. Обязательно замените Роль – здесь с ролью ARN.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutForAllS3TestfilesLambda", "Effect": "Allow", "Principal": { "AWS": "role-goes-here" }, "Action": "s3:*", "Resource": "arn:aws:s3:::business-cardistry/*" } ] }
Хорошо, эта политика позволяет нашей собственной ролью выполнять все действия S3 на нашем новом ведре S3. S3 должно быть хорошо, чтобы пойти!
Код нашей функции
Хорошо, теперь мы можем добраться до кодирования. Давайте сделаем наши PDF
функция. Он должен получить какой-то HTML, обрабатывать его в файловый буфер PDF, а затем загрузить этот буфер на S3.
Давайте инициализируем NPM и добавьте некоторые зависимости.
$ npm init -y $ npm install --save html-pdf aws-sdk shortid
HTML-PDF
Библиотека Мы используем, требуется программа Фантомс
Быть доступным в качестве исполняемого двоичного двоика. Обычно, если у нас работал этот скрипт на сервере, мы бы просто установили Фантомс
на сервере. Поскольку это неверно, нам нужно убедиться, что контекст времени выполнения имеет доступ к Фантомс
исполняемый двоичный файл.
То, как я обрабалл, это было в Скачать двоичный и положить его в Bin
Папка в корне проекта.
Затем я обязательно добавил это в файл Serverless.yml:
package: include: - bin/phantomjs
Теперь, когда функция развернута, она захватывает, что двоичные и загружает его при сохранении его разрешений и создание его в среде выполнения функции.
Хорошо. Давайте доберемся до кода. Вот что мой PDF
Функция выглядит как:
'use strict'; const pdf = require('html-pdf'); const path = require('path'); const AWS = require('aws-sdk'); const shortid = require('shortid'); module.exports.pdf = (event, context, callback) => { const html = event.body; pdf.create(html, { height: '200px', width: '350px', phantomPath: path.resolve(process.env.LAMBDA_TASK_ROOT, 'bin/phantomjs'), }).toBuffer((err, buffer) => { if (err) return console.log(err); const fileKey = `cards/${shortid.generate()}.pdf`; const bucket = 'business-cardistry'; const s3 = new AWS.S3(); s3.putObject({ Bucket: bucket, Key: fileKey, Body: buffer, ACL: 'public-read' },function (resp) { const fileUrl = s3.getSignedUrl('getObject', { Bucket: bucket, Key: fileKey, Expires: 60, }); callback(null, { statusCode: 200, headers: { 'Content-Type' : 'application/json', 'Access-Control-Allow-Origin' : '*', }, body: JSON.stringify({ fileUrl }), }); }); }); };
Я не собираюсь зайти в код слишком глубоко, но он принимает тело запроса и использует его для генерации буфера PDF. Затем он загружает буфер до S3 и возвращает подписанный URL для загрузки объекта.
Вы видите линию, которая говорит path.resolve (process.env.lambda_task_root, 'bin/phantomjs')
? Вот как мы ссылаемся на то, что исполняемый файл Phantomjs.
Вы заметите, что нам не нужно указывать какие-либо учетные данные AWS. Он автоматически получает учетные данные из роли выполнения.
Тестирование и окончательное развертывание
Поскольку эта конечная точка просто получает HTML и возвращает FilePath, мы все равно сможем проверить его с помощью команды curl. Во-первых, давайте снова развернумся в разработку.
serverless deploy -s dev
Приведенное выше команда развертывания будет развернуть весь проект. Чтобы развернуть только одну функцию, вы можете использовать команду:
serverless deploy function -f pdf -s dev
Если вы столкнулись с любыми ошибками, вы можете проверить журналы для PDF
Функция с этой командой:
logs -f pdf -s dev
Теперь мы можем проверить его, отправив еще один запрос скручиваемости со строкой HTML
$ curl -d 'Hello PDF!
' -X POST https://o20pczjzbl.execute-api.us-east-1.amazonaws.com/dev/pdf {"fileUrl":"https://business-cardis...j2hJHSBQ%3D%3D"}
Оно работает! Когда я вставляю в ссылку FileRL в браузер, он загружает PDF, который выглядит так:
Что именно то, что мы ожидаем.
Так что теперь давайте развернумся в производстве!
$ serverless deploy -s production Serverless: Packaging service... Serverless: Excluding development dependencies... Serverless: Creating Stack... Serverless: Checking Stack create progress... ..... Serverless: Stack create finished... Serverless: Uploading CloudFormation file to S3... Serverless: Uploading artifacts... Serverless: Uploading service .zip file to S3 (35.56 MB)... Serverless: Validating template... Serverless: Updating Stack... Serverless: Checking Stack update progress... .............................. Serverless: Stack update finished... Service Information service: business-cardistry stage: production region: us-east-1 stack: business-cardistry-production api keys: None endpoints: POST - https://8103v1xvqk.execute-api.us-east-1.amazonaws.com/production/pdf functions: pdf: business-cardistry-production-pdf
Теперь это создало совершенно новую функцию в лямбде, поэтому помните все эти разговоры о исполнительных ролях? Нам нужно изменить роль выполнения функции производства в соответствии с ролью функции Dev. Таким образом, производственная функция будет иметь доступ к S3 ..
Так что вернитесь на страницу лямбда в AWS, нажмите на новую функцию производства, которая была только что создана, и измените роль выполнения в роль Dev:
Как только это сделано, мы можем дважды проверить конечную точку производства.
$ curl -d 'Hello PDF!
' -X POST https://8103v1xvqk.execute-api.us-east-1.amazonaws.com/production/pdf {"fileUrl":"https://business-cardis...j2hJHSBQ%3D%3D"}
Aaaaaaand это работает! Теперь после модификации URL-адреса запроса в моем React Code мое приложение завершено!
Обязательно проверьте Cardistry.nmajor.com чтобы увидеть это в действии.
Я знаю, что это был просто простой пример с одной конечной точкой, но этот же процесс может быть использован для построения десятков конечных точек для почти любого приложения. Я надеюсь, что это дает вам хорошее представление о том, что возможно с серверу, и насколько легко и мощно это может быть!
Ограничения и недостатки безвесочных
Как удивительно, так как неверный, есть некоторые ограничения и недостатки:
Задержка Хотя AWS Lambda предназначен для выполнения функций в миллисекундах, у вас есть некоторая дополнительная задержка при использовании сервера. Однако мы говорим о нескольких сотен добавленных миллисекунд. Для большинства веб-приложений это не будет проблемой, но если задержка действительно важна для вашего проекта, это то, что вы хотите рассмотреть.
Поставщик блокировки Поскольку Serverless зависит от так сильно на инфраструктуре и поддерживающих службах, но вам может потребоваться повторно написать большие части вашего приложения, чтобы переместить его к другому провайдеру.
Черный ящик Многие из частей вашего приложения выходят из вашего элемента управления, поэтому, когда дела идут не так или, если вы попадаете на краевой корпус с вашим приложением, у вас мало контроля над своей способностью разрешать его самостоятельно.
Новые технологии Servalless все еще находится в своей младенчестве, поэтому, как и с любой новой технологией, при принятии решения о том, следует использовать большую осторожность при принятии решения о том, рано и не прыгнет на полосовой глотки.
Заключение
Я полагаю, что Serverless – это следующая большая вещь в веб-разработке. Так много в веб-разработке одинаково. Каждая рамка решает многие из тех же проблем таким же образом. Serverless решает эти проблемы на инфраструктуре, оставляя вас свободно работать над важными и разными частями вашего приложения.
Объедините это с преимуществами стоимости и масштабируемости, и тот факт, что существует так много удивительных фреймворков в интерфейсах, таких как ReCv, и дни традиционных задних рамок пронумерованы.
Другие источники:
- Serverless-stack.com – Всеобъемлющий учебник по созданию и развертыванию приложений с полным стеком с использованием серверу и реагирует на AWS.
- Serverless.com – Отличная документация, сообщество и другие ресурсы.