Переход без сервера с вашего терминала.

Если вам нравятся бессерверные технологии, вы уже знаете, что такое 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 и общих технических новинках. Также вы можете следить за моим личным блогом.