Переход без сервера с вашего терминала.
Если вам нравятся бессерверные технологии, вы уже знаете, что такое AWS Lambda. Но если вы не знаете, AWS Lambda - это бессерверный сервис, предоставляемый Amazon, где вы можете создавать «функции» и развертывать их в AWS, который можно запускать без каких-либо экземпляров сервера (например, EC2). Отсюда и название serverless. Затем вы можете запускать эти функции с помощью различных встроенных триггеров, таких как события S3, правила CloudWatch, шлюзы API и многое другое.
AWS Lambda поддерживает лишь несколько языков программирования, таких как NodeJS, Java, Python и другие. Если вы пишете свою лямбда-функцию на Python, вы можете использовать Chalice, чтобы немного упростить жизнь. Используя Chalice, вы можете написать лямбда-функцию, протестировать ее локально и даже развернуть лямбда-функцию в своей среде разработки, тестирования или производства. В этом посте мы увидим, как мы можем установить Chalice на наши локальные машины, написать простой REST API для возврата знаменитого «Hello, world!» response и разверните его на этапе разработки в AWS Lambda. Это развертывание автоматически создаст сервис шлюза API в AWS, который предоставит миру нашу функцию Lambda с защищенной конечной точкой HTTPS. Итак, приступим.
Установить Чашу
Чтобы установить Chalice, вам сначала нужно установить Python и pip на вашем компьютере. Предположим, что у вас все это установлено. Следующим шагом будет установка Chalice, что на самом деле очень просто. Просто установите его с помощью pip или pip3 с помощью соответствующей команды ниже:
pip install chalice
Если вы используете Python 3.x с pip3, вы можете использовать следующую команду для установки Chalice:
pip3 install chalice
Вам нужно убедиться, что вы используете Python 2.7, Python 3.6 или Python 3.7 на своем локальном компьютере. Это связано с тем, что на момент написания этой статьи Amazon поддерживает только эти три версии Python для Lambdas. Так что даже Чаша поддерживает только эти три версии. Так что убедитесь в этом.
Теперь, когда на вашем компьютере установлен Chalice, мы продолжим и настроим учетные данные AWS на вашем локальном компьютере, чтобы Chalice мог развертывать ваши функции на Lambda, а также создавать шлюзы API для этих функций.
Настройка учетных данных AWS
Если у вас уже есть установка aws-cli на локальном компьютере, возможно, вы уже настроили учетные данные AWS. В этом случае вы можете пропустить этот шаг и перейти к следующему разделу.
Есть много способов настроить учетные данные AWS на локальном компьютере. Дополнительную информацию можно найти в документации AWS. Но в этом руководстве мы пойдем самым простым способом: создадим файл среды и сохраним в нем учетные данные.
Для этого нам сначала нужно создать каталог .aws в вашем домашнем каталоге. Этот каталог будет содержать всю необходимую нам конфигурацию. Для этого используйте в своем терминале следующую команду:
mkdir ~/.aws
Затем cd в этот каталог и создайте файл с именем config внутри этого каталога. Вы можете использовать любой редактор по вашему выбору. Я буду использовать vim, если мне это удобно. Вы можете использовать следующую команду, чтобы изменить каталог и создать файл, а затем открыть этот файл для редактирования:
cd ~/.aws && vim config
Внутри этого файла нам нужно установить наш ключ доступа AWS, секретный ключ и предпочтительный регион по умолчанию. Все функции Lambda, которые вы развертываете с помощью Chalice, будут использовать эти учетные данные. Так что будьте осторожны с учетными данными, которые вы предоставляете здесь. Теперь в файл вставьте следующее содержимое и соответствующим образом измените значения:
[default]
aws_access_key_id=<your_access_key_here>
aws_secret_access_key=<your_secret_key_here>
region=<your_region_here>
Сохраните этот файл и выйдите из редактора. Вы закончили настройку учетных данных AWS. Перейдем к созданию нового проекта с Chalice и написанию нашего кода.
Создание нового проекта с Чашей
Для этого cd перейдите в каталог, в котором вы хотите сохранить новый проект. Я воспользуюсь следующей командой, чтобы сменить каталог на локальный репозиторий кода:
cd ~/code/python/
Оказавшись в нужном каталоге, мы можем использовать команду new-project, которую предоставляет Chalice, для создания нового проекта. Я создам новый проект с названием «chalice-poc», используя следующую команду:
chalice new-project chalice-poc
После выполнения этой команды перечислите каталоги, и вы сможете увидеть созданный новый каталог. Теперь войдите в этот каталог:
cd chalice-poc
До конца урока мы будем в этом каталоге. Теперь откройте этот каталог в IDE или текстовом редакторе по вашему выбору. Вы должны увидеть множество файлов и каталогов, уже созданных для вас. Я использую Sublime Text для всех своих проектов Python. Итак, я запускаю следующую команду, чтобы открыть весь каталог в редакторе:
subl .
Общие сведения о папках и файлах по умолчанию
Вы можете увидеть структуру папок примерно следующего вида, которая уже создана для вас.
Давайте кратко поговорим о каждом из этих файлов:
- .chalice / config.json - этот файл будет содержать всю конфигурацию ваших сред, используемых для развертывания вашей функции Lambda в AWS. Конфигурация, такая как переменные среды, ARN пользователя, который должен использоваться для развертывания лямбда-функции, имя лямбда-функции и т. Д.
- app.py - это главный файл Python вашей лямбда-функции. Управление приходит сюда, когда срабатывает ваша лямбда-функция.
- requirements.txt - это файл, используемый для управления зависимостями. Вы указываете имя и версию зависимости, которую хотите, и AWS позаботится о том, чтобы подготовить ее для вашей функции Lambda. Но имейте в виду, что здесь доступны не все зависимости Python. Если вы не нашли его в реестре, вам придется упаковать их самостоятельно.
Код
Теперь, когда у нас это есть, давайте откроем файл app.py и проверим, что у нас есть. В зависимости от используемой версии Chalice вы должны найти что-то вроде следующего:
from chalice import Chalice
app = Chalice(app_name='chalice-poc')
@app.route('/') def index(): return {'hello': 'world'}
# The view function above will return {"hello": "world"} # whenever you make an HTTP GET request to '/'. # # Here are a few more examples: # # @app.route('/hello/{name}') # def hello_name(name): # # '/hello/james' -> {"hello": "james"} # return {'hello': name} # # @app.route('/users', methods=['POST']) # def create_user(): # # This is the JSON body the user sent in their POST request. # user_as_json = app.current_request.json_body # # We'll echo the json body back to the user in a 'user' key. # return {'user': user_as_json} # # See the README documentation for more examples. #
Как видно из кода, уже предоставленного в файле, у нас есть предварительно созданный API с конечной точкой /, которая возвращает объект JSON клиенту. Мы можем запустить именно это, и это сработает. У вас будет локально работающая функция Lambda. Но ради этого, давайте изменим ответ API. Мы будем использовать правильный объект Response с кодом ответа и телом.
Для этого нам нужно импортировать объект Response из Chalice. Поэтому мы изменим оператор импорта в верхней части страницы на это:
from chalice import Chalice, Response
Мы просто добавили еще один класс в оператор импорта. Затем мы изменим метод index (), чтобы он возвращал новый объект Response:
@app.route('/')
def index():
return Response(status_code=200, body={'hello': 'world'})
На этом мы остановим кодирование. Здесь вы можете принять переменные пути, параметры запроса и тело POST или PUT. Но для простоты мы просто воспользуемся этим GET API. Следующая часть - это локальный запуск этой лямбда-функции.
Локальный запуск лямбда-функции
Chalice позволяет очень легко запускать и тестировать Lambda-функции локально, как если бы мы развернули их на наших серверах. Чтобы запустить Lambda локально, нам просто нужно запустить очень простую команду в нашем терминале. Я предполагаю, что вы все еще находитесь в каталоге проекта в своем терминале. Исходя из этого предположения, запустите в терминале следующую команду:
chalice local
После того, как вы запустите эту команду, вы должны получить подтверждение того, что локальный сервер запущен и обслуживает какой-то порт, который по умолчанию равен 8000. Итак, вы должны получить следующий результат:
➜ chalice-poc chalice local
Serving on http://0.0.0.0:8000
Restarting local dev server.
Итак, как только вы увидите это сообщение, вы можете перейти в свой браузер и ввести адрес localhost: 8000, и вы должны получить ответ, который мы написали в коде.
В некоторых случаях вы можете увидеть ошибку или исчезновение из Chalice, в котором говорится, что он не может разрешить localhost. А в некоторых случаях вы можете не получить никаких ошибок или предупреждений, но не сможете подключиться к Chalice с вашего локального компьютера. Это обычная проблема, которую я видел, и ее очень просто решить. Мы воспользуемся параметром –host команды Chalice, чтобы указать localhost как 0.0.0.0. Итак, ваша команда теперь будет выглядеть примерно так, вместе с тем же выводом:
➜ chalice-poc chalice local --host 0.0.0.0
Serving on http://0.0.0.0:8000
Restarting local dev server.
Настройка лямбда-функции для развертывания
Теперь, когда функция Lambda запущена и работает локально, как и ожидалось, мы сделаем необходимую конфигурацию, чтобы можно было развернуть функцию Lambda в облаке AWS.
Для этого мы перейдем в каталог .config в корне проекта и откроем файл config.json. У вас уже должно быть некоторое содержимое, подобное приведенному ниже, в файле:
{
"version": "2.0",
"app_name": "chalice-poc",
"stages": {
"dev": {
"api_gateway_stage": "api"
}
}
}
Итак, Чалис также дала нам план для этой конфигурации. Мы просто добавим здесь еще несколько полей к объекту «dev». Для каждого этапа вашей настройки здесь есть объект. Внутри объекта «стадий» вы можете создать любое количество стадий с произвольными именами, и Чаша будет просто следовать этой инструкции. В любом случае, давайте внесем изменения в наш файл, чтобы он выглядел примерно так:
{
"version": "2.0",
"app_name": "chalice-poc",
"stages": {
"dev": {
"api_gateway_stage": "api",
"manage_iam_role":false,
"iam_role_arn":"arn:aws:iam::xxxyyyzzz:role/abc",
"environment_variables": {
}
}
},
"app_name": "chalice-poc-dev"
}
Как вы можете видеть в конфигурации выше, мы попросили Чалис не управлять ролями IAM, и мы сами упомянули роль ARN. Если вы не знакомы со всем этим, вы можете просто установить для параметра «manage_iam_role» значение true, и Chalice позаботится об этом. Я не делаю этого, потому что предпочитаю создавать роли сам и использовать их повторно, когда это возможно. В любом случае, мы закончили настройку. Давайте развернемся.
Развертывание функции Lambda в AWS
Развертывание в AWS, я думаю, самая простая часть этого руководства. Это всего лишь одна команда, и все готово. Когда вы будете готовы к развертыванию, вернитесь к конфигурации учетных данных AWS и убедитесь, что все правильно.
Чтобы развернуть вашу лямбда-функцию в облаке с помощью Chalice, просто выполните следующую команду в терминале из корневого каталога проекта:
chalice deploy
После того, как вы запустите эту команду, потребуется некоторое время для завершения. В это время вы не получите отзывов в терминале. Так что не пугайтесь и не беспокойтесь о том, что происходит. По завершении процесса вы получите общедоступный URL-адрес шлюза API, который находится перед развернутой лямбда-функцией, примерно так:
Creating deployment package.
Updating lambda function: chalice-poc-dev
Updating rest API
Resources deployed:
- Lambda ARN: arn:aws:lambda:us-east-2:xxxyyyzzzaaa:function: chalice-poc-dev
- Rest API URL: https://abcdefgh.execute-api.us-east-2.amazonaws.com/api/
Вы можете использовать этот URL-адрес для запуска вашей лямбда-функции. Так что снова откройте браузер и перейдите по указанному URL-адресу. Вы должны немедленно увидеть ответ.
Вы можете записать URL-адрес, указанный здесь как URL-адрес для этого этапа вашей лямбда-функции. Но не беспокойтесь, если вы потеряете этот URL. Вы можете вернуть его в разделе API Gateway в Консоли AWS.
Итак, это конец урока. Вы можете создать больше маршрутов в файле app.py, добавить к нему больше методов и создать правильную лямбда-функцию. Пожалуйста, дайте мне знать в комментариях ниже, если у вас есть какие-либо проблемы с вашей Lambda или вы не можете следовать руководству. И, как обычно, если вам нужен полный проект, посмотрите его в моем репозитории на Github.
Следуйте за мной в Twitter, чтобы узнать больше о Data Science, Machine Learning и общих технических новинках. Также вы можете следить за моим личным блогом.