- PVSM.RU - https://www.pvsm.ru -
Весной этого года я сидел в локдауне на Багамах, без права сходить на берег и, борясь со скукой, решил посмотреть, что это за зверь такой Amazon Web Services, и да, я пропал. Случилось, что называется, любовь с первого взгляда. Одной из технологий, что пьянила меня не хуже багамского рома, были бессерверные вычисления.
От переполняющих меня чувств я начал названивать своим корпоративно-инфраструктурным товарищам, рассказывая им об этом не виденном ими чуде, но они крутили пальцем у виска и отвечали, что знаем, мол, мы ваши штучки-дрючки, развод на бабки сплошной. Нет ничего более надежного, чем толстый железный сервер под кроватью.
Я их понимаю. Толстые железные сервера обеспечат их подразделения ИТ-инфраструктуры хлебом с маслом на долгие годы. Так что, эта история не для них, а для тех, кто еще не потратил на инфраструктуру ЦОДа несколько десятков чемоданов денег и хочет при этом пользоваться всеми благами цивилизации.
Удивительно, но термин «бессерверные» придумали не маркетологи, а деятель по имени Остин Коллин в 2015 году. Идея была проста – зачем каждой организации содержать штат админов? Лучше согнать всех админов в одно место, запастись для них Budweiser и пусть они админят свои сервера где-то далеко под землей. Бизнес должен быть сосредоточен на бизнесе и в плане инфраструктуры ему достаточно ответить на один простой вопрос – как много бабла я готов платить в месяц за используемые мощности. Ведь вся прелесть бессерверных технологий, что горизонтальное масштабирование ограничено только размером кошелька. Причем масштабирование может быть осуществелно в автоматическом режиме. На днях я забыл остановить стресс тест для одного проекта и был неприятно удивлен размером выставленного счета. Это обратная сторона медали, которая, к слову, легко решается сервисом AWS Billing Alert.
Итак, мы решили создать наше первое бессерверное приложение, но не по какому то туториалу, где множество ограничений, а почти по-настоящему. Почти, потому что, кроме «Hello World» это приложение ничего не делает, но зато сколько всего в этом задействовано!
Приложение состоит из четырех основных частей:
AWS S3 – это объектное хранилище данных, ставшее, можно сказать, стандартом в индустрии. Mail.ru, Яндекс, Мегафон – используют устоявшийся термин Simple Object Storage и совместимое с AWS S3 API.
Одна из фишек S3 – это возможность использования корзины в качестве веб-сервера статического контента. То есть мы просто загружаем все наши CSS, JavaScript и HTML в корзину и ставим галку «Static Web Hosting». Но есть одно «Но». Доступ к корзине по HTTP возможен только без шифрования. То есть включил галку
И тут нам на помощь приходит сервис дистрибьюции CloudFront, что доставляет контент близко к пользователям по всему миру, за исключением 1/6 части суши. То есть даже в Африке есть edge location, а в России нет. И появится ли не известно. В России, кстати, есть свои сети доставки контента, и я подумываю провести эксперимент по интеграции двух сервисов.
Для возможности использования SSL мы в сервисе Certificate Manager выпускаем бесплатный сертификат по имени нашего домена и привязываем его к нашей CloudFront дистрибьюции, после чего наш контент становится доступен по HTTPS, который терминируется на CloudFront edge location и дальше идет по сети AWS в незашифрованном виде. Но наша корзина S3 надежно защищена политиками и доступ к ней имеет только владелец аккаунта и созданная нами дистрибьюция. Конечно, для параноиков есть возможность зашифровать саму корзину при помощи SSE-KMS и перешифровывать его SSL при помощи Lambda@Edge на edge location. Но сегодня мы не такие параноики и не будем так делать.
Перед CloudFront сидит DNS сервис Route 53, и мудро перенаправляет трафик, направленный в сторону нашего домена к дистрибьюции CloudFront.
Задача этого сервиса – выполнять функции подписки, верификации по е-мейлу или телефону и авторизации для веб пользователей и пользователей мобильных приложений. Amazon Cognito умеет работать с внешними поставщиками удостоверений, которые поддерживают стандарты SAML или OpenID Connect, с социальными платформами (Facebook, Twitter, Amazon) и позволяет использовать собственный поставщик удостоверений.
Чтобы все это работало с нашим приложением мы используем Cognito SDK для JavaScript. Теперь у нас неавторизованный пользователь переадресуется на созданную нами страницу регистрации и входа в систему. Мы, конечно, можем использовать функцию предоставления пользовательского интерфейса авторизации Cognito Hosted UI, где уже преднастрены страницы входа в систему, восстановления забытого пароля, MFA и интеграции по SAML. Но, на сегодняшний день эта функция доступна только на английском языке, что, честно говоря, меня удивляет и расстраивает. Казалось бы, глобальный сервис…
Список атрибутов пользователя по — умолчанию соответствует спецификации OpenID Connect, но никто нам не запрещает использовать наши собственные кастомные атрибуты. К сожалению, после того как в пуле появились пользователи атрибуты изменить не удастся и надо создавать новый пул и мигрировать в него пользователей, но может это и к лучшему.
API Gateway – это высокопроизводительный шлюз для HTTP, Rest API и Web Socket. Мы создаем на шлюзе ресурс и его метод GET перенаправляет запрос к нашей Lambda функции. А чтобы враг не прошел, мы настраиваем на шлюзе Authorizer и без токена в зубах никого к нашей функции не подпускаем. При этом мы наступаем со всей дури на грабли CORS, о которых молчит большинство туториалов, грабли, связанные с интеграцией Lambda proxy и необходимости явно прописывать в API заголовки для каждого HTTP статуса. В свою очередь наша функция при помощи библиотеки boto3 может общаться с любым ресурсом AWS, но только при наличие правильно настроенных разрешений.
Страшилка на ночь
В самом начале я писал, как можно попасть на бабки просто забыв погасить инстанс EC2. Без правильно настроенных разрешений можно попасть по самые помидоры и мир полон страшных историй, как за одну чорную-чорную ночь списалось 10к денег из-за ошибок в настройке разрешений.
В нашем приложении для полноты картины не хватало внешнего источника данных, и мы создаем таблицу DynamoDB из одного элемента: id = UUID identifier; Text = «Hello World».
Джеф Безос все-таки акула бизнеса. И он уже придумал как сортировщикам товаров подавать сигналы прямо в голову, чтобы они сортировали более сортировочно. Так что халявы, казалось бы, не будет. И вообще, сколько может стоить вся эта бессерверная история для стартапа на коворкинге в Бургер Кинг?
К нашему счастью в AWS существует такая фича как «уровень бесплатного пользования». Это как первые 3 дозы хмурого за счет дилера, но рано или поздно придется платить по счетам самому. Но в отличие от диллера, если вы знаете параметры вашего сервиса, то можно оценить его стоимость при помощи инструмента AWS Pricing Calculator [2].
Базовая тарификация у используемых нами сервисов, следующая:
Секрет мастерства:
Тарифицируемый минимум – это 100 миллисекунд. Наша функция выполняется за 2. То есть можно 50 раз запросить «Hello World» за эти же деньги или нагрузить ее другим, не менее полезным функционалом. Так что обязательно смотрим в CloudWatch Logs Insights и оцениваем, что почем.
В DynamoDB с расчетами все не совсем просто и стоимость зависит от выбора модели согласованности данных. Условно – чем ниже согласованность, тем больше данных в одном юните 1-4-8 Кб.
В нашем тестовом приложении мы уместились в уровень бесплатного пользования за исключением таблицы DynamoDB. Ее существование встало нам в круглую сумму $0,59 в месяц, что при нынешнем курсе доллара вполне приемлемо.
Так что у нас в распоряжении есть отличный инструмент, позволяющий реализовывать практически любые фантазии практически бесплатно.
Зима будет длинной и холодной – самое время начать творить в облаке.
Автор: Федор Аредаков
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/oblachny-e-servisy/359051
Ссылки в тексте:
[1] хостинг: https://www.reg.ru/?rlink=reflink-717
[2] AWS Pricing Calculator: https://calculator.aws/
[3] Источник: https://habr.com/ru/post/529242/?utm_source=habrahabr&utm_medium=rss&utm_campaign=529242
Нажмите здесь для печати.