AWS Lambda на Go, работающая локально с SAM и Docker

Serverless меняет игру. Достаточно сказано. В качестве аргумента, serverless — это все, для чего мне не нужен сервер. В неполный список можно включить хранение объектов, функции как сервис, управление идентификацией, распространение контента для ваших внешних клиентов и, возможно, даже DNS. Каждый провайдер публичного облака предлагает услуги, с которыми можно взаимодействовать или склеивать их с помощью бессерверных технологий, например, очередей сообщений и логики склеивания.

Этот пост посвящен AWS, потому что это то, с чем я знаком, и мне это нравится. AWS изменила то, что я могу создавать и как я могу это делать. Хорошее проектирование архитектуры поможет сохранить низкие затраты, и да, слишком легко набрать счет за облако в 50 тысяч долларов и получить прощение от облачных богов, так что будьте осторожны!

Отказ от ответственности и предупреждение! Я участвую в программе AWS Community Builder 2022 в категории serverless. Для меня большая честь быть выбранным и присоединиться к более чем пятистам другим участникам по всему миру. Это мой первый пост о AWS serverless для сообщества в целом, и я надеюсь, что он будет полезен. Я не так давно искал это в Гугле и решил, что стоит поделиться.

Рабочие процессы

Раньше я был техническим менеджером по продуктам и инженером по техническому маркетингу для платформы автоматизации, известной как StackStorm, которая представляет собой богатый набор движков рабочих процессов и интеграций, некоторые из которых встроены, а некоторые основаны на плагинах. Вы можете подключить StackStorm к Slack, электронной почте и сетевым точкам управления и управлять им программно с помощью REST. StackStorm предлагал модель архитектуры, управляемой событиями, в которой обработка была очень асинхронной и разделенной. Это означает, что каждая функция выполняется в своем собственном пространстве памяти, изолированном от вызывающего ее кода. Выходы каждой функции становятся доступными как входы следующей функции. Чтобы сформулировать это по-другому, представьте себе логическую схему, где каждый квадрат — это функция кода, а каждая точка принятия решения — логика клея. События протекают между каждым блоком в блок-схеме, с входной и выходной информацией из предыдущих блоков. Событие — это не что иное, как сгусток информации с такими полями, как UUID, причина вызова, временная метка и, возможно, выходы из других функций.

Каждая функция вызывается отдельно в StackStorm и сшивается вместе с помощью механизма рабочего процесса, что и является аспектом блок-схемы. Изменив язык на AWS из StackStorm, мы получаем другую семантику и готовую для сборки форму StackStorm.

Компоненты

AWS предлагает ряд технологий, которые делают это возможным. Вот неполный список и те, к которым я тяготею:

Lambda — это название сервиса Functions-as-a-Service и название экземпляра функции. Лямбды можно писать на таких популярных языках, как Go и JavaScript. Эти лямбды можно вызывать внутри или снаружи через REST благодаря Lambda URLs **которые были анонсированы в апреле 2022 года! Это отдельные функции.

Step Functions — это визуальный конструктор рабочих процессов с низким кодом, который действует как движок рабочего процесса. Вы можете визуально составить рабочий процесс из 200+ сервисов AWS с помощью около 9000+ вызовов API. Впечатляет.

SQS — это очереди, которые могут предлагать семантику «доставить один раз» или «хотя бы один раз» и обеспечивают столь необходимую развязку между компонентами. Если вы никогда раньше не использовали очереди, думайте о них как о трубах, которые могут поддерживать порядок. Эти трубы обеспечивают связь между различными сервисами, в нашем случае между Lambdas.

DynamoDB — это бессерверная база данных! Она может использоваться для простых вещей, таких как хранилище ключей/значений или реляционных данных с дизайном одной таблицы. Она также поддерживает потоковую передачу данных, что очень удобно, поскольку обеспечивает легкое соединение между зависимыми компонентами. Выражаясь по-другому, представьте, что у вас есть Lambda, которая должна выполнять работу при обновлении или создании записи. Потоковая передача может помочь вам легко реализовать эту модель.

S3 — это мощное хранилище объектов, и я постоянно поражаюсь тому, насколько оно хорошо. Сейчас это почти утилита, и без нее, я уверен, многие компании умерли бы ночью.

Amplify — это набор функций для размещения всего, начиная от веб-сайта и заканчивая полноценным приложением, с бэкендами (Lambda) и управлением идентификацией через Cognito. Он также легко интегрируется с Route53, что упрощает управление DNS.

Cognito — это сервис идентификации, который конкурирует с Auth0, если вы с ним знакомы. Нужны учетные записи пользователей для вашего приложения и возможность регистрации? Cognito — это то, что вам нужно.

Route53 — это управление DNS. Вы можете регистрировать домены с помощью этой службы или просто запускать hosted-зоны, если у вас есть доменное имя, предоставленное в другом месте. Он предлагает все ожидаемые возможности DNS и может помочь вам с географическим преобразованием записей в регионы, локальные для пользователя и т.д.

Cloud Trail — это механизм протоколирования для AWS. Лямбды записываются в журнал (если вы правильно его настроите), и это сервис для бессерверных операций.

SAM, что расшифровывается как Serverless Application Model, — это метод создания бессерверных приложений с открытым исходным кодом. Эта статья в блоге Amazon посвящена SAM, и она очень полезна.

Подробнее о AWS Serverless вы можете прочитать здесь: https://aws.amazon.com/serverless/.

Локальное тестирование

Ранее (https://dave.dev/blog/2021/07/14-07-2021-awsddb/) я писал об использовании DynamoDB на вашей рабочей машине. Это было замечательно для обучения и разработки. Действительно. Но для Lambda нам нужно нечто подобное. Вы можете себе представить, что создание и отладка на консоли AWS может быть утомительным занятием.

При изучении локального запуска AWS Lambda я начал здесь: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html и быстро понял, что это намного проще, чем я думал. Вы абсолютно точно можете разрабатывать и тестировать Lambdas локально на любом языке, который поддерживает среда выполнения Lambda, и далее я расскажу, как это сделать.

Hello World (или это уловка?)

Клятва-0-метр обрезан до нуля, поехали!

Шаг первый — установить sam cli, я буду использовать brew, потому что это просто. Также убедитесь, что у вас установлен и запущен Docker, потому что SAM запускает экземпляры Lambda на Docker.

brew tap aws/tap
brew install aws-sam-cli
Войдите в полноэкранный режим Выход из полноэкранного режима

Проблема 1! Мне нужно было обновить xcode на моей машине. Клятва-0-метр[1/x].

После завершения команд brew у меня была рабочая установка SAM с версией 1.55.0..

Далее необходимо установить Visual Code AWS Toolkit, что было простым нажатием кнопки, поэтому я не буду делать скриншот. Просто прочитайте это: https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html. Если вы не используете VS Code, нет проблем. Существуют плагины для других IDE.

Далее нам нужно создать пример приложения. Создайте каталог с творческим названием «delete_me_42» или что-то в этом роде. Перейдите в эту директорию и выполните команду sam init.

# Run this command
$ sam init

You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.

Which template source would you like to use?
    1 - AWS Quick Start Templates
    2 - Custom Template Location
Choice: 1

Choose an AWS Quick Start application template
    1 - Hello World Example
    2 - Multi-step workflow
    3 - Serverless API
    4 - Scheduled task
    5 - Standalone function
    6 - Data processing
    7 - Infrastructure event management
    8 - Lambda EFS example
    9 - Machine Learning
Template: 1

Use the most popular runtime and package type? (Python and zip) [y/N]: n

Which runtime would you like to use?
    1 - dotnet6
    2 - dotnet5.0
    3 - dotnetcore3.1
    4 - go1.x
    5 - graalvm.java11 (provided.al2)
    6 - graalvm.java17 (provided.al2)
    7 - java11
    8 - java8.al2
    9 - java8
    10 - nodejs16.x
    11 - nodejs14.x
    12 - nodejs12.x
    13 - python3.9
    14 - python3.8
    15 - python3.7
    16 - python3.6
    17 - ruby2.7
    18 - rust (provided.al2)
Runtime: 4

What package type would you like to use?
    1 - Zip
    2 - Image
Package type: 1

Based on your selections, the only dependency manager available is mod.
We will proceed copying the template using mod.

Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: n

Project name [sam-app]: test

Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)

    -----------------------
    Generating application:
    -----------------------
    Name: test
    Runtime: go1.x
    Architectures: x86_64
    Dependency Manager: mod
    Application Template: hello-world
    Output Directory: .

    Next steps can be found in the README file at ./test/README.md

    Commands you can use next
    =========================
    [*] Create pipeline: cd test && sam pipeline init --bootstrap
    [*] Validate SAM template: sam validate
    [*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch
Вход в полноэкранный режим Выйти из полноэкранного режима

Этих вариантов достаточно, чтобы SAM создал вам работающую Go Lambda.

Здесь показано дерево файлов, которые создает SAM.

cd ./test
tree

.
├── Makefile
├── README.md
├── events
│   └── event.json
├── hello-world
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   └── main_test.go
└── template.yaml

2 directories, 8 files
Войти в полноэкранный режим Выйти из полноэкранного режима

И запустить?

Созданная лямбда является примером использования функциональности API Gateway и может быть выполнена прямо из коробки с помощью предоставленного события. Однако она не сработала у меня при использовании браузера. Самый простой способ проверить это — предоставить синтетическое событие, которое притворяется вызовом API, проходящим через шлюз API. Переключатель -e предназначен для передачи файла события.

sam build
sam local invoke -e events/event.json

Invoking hello-world (go1.x)
Skip pulling image and use local one: public.ecr.aws/sam/emulation-go1.x:rapid-1.55.0-x86_64.

Mounting /Users/david/Documents/blog/SAM_Test/test/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
START RequestId: 3c999a79-6ea7-4e87-b934-22a1995f9dd1 Version: $LATEST
END RequestId: 3c999a79-6ea7-4e87-b934-22a1995f9dd1
REPORT RequestId: 3c999a79-6ea7-4e87-b934-22a1995f9dd1  Init Duration: 0.96 ms  Duration: 696.86 ms Billed Duration: 697 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode":200,"headers":null,"multiValueHeaders":null,"body":"Hello, xxx.xxx.xxx.xxxn"}
Вход в полноэкранный режим Выход из полноэкранного режима

Отлично, это сработало! Вот так просто мы создали Go Lambda и запустили ее в Docker на вашей машине. Теперь вы можете возиться с кодом Go, потому что процесс сборки в основном такой же. При желании вы можете использовать SAM для развертывания этой Lambda на своей учетной записи AWS.

Копаем внутрь

Пример SAM состоит из трех важных частей:

  • Файл шаблона template.yaml SAM, который содержит все, что нужно Cloud Formation. Вы также можете включить встроенные политики IAM, что значительно упрощает процесс. Будьте внимательны к вводу Events: в этом файле. Возможно, вам понадобится обслуживать EventBridge или SQS вместо API-шлюза.
  • Файл events/event.json, содержащий синтетическое событие тестирования. Убедитесь, что ваши синтетические события соответствуют вашему сценарию использования.
  • Go-код и тестовый файл Go. Сохраняйте в коде шаблон с главной процедурой входа, вызывающей функцию-обработчик. Время выполнения Lambda должно знать точку входа и будет передавать данные различных типов экземпляров в зависимости от того, что вы вызываете в Lambda.

Вы можете вызывать локальные экземпляры Lambda через SAM, а также получать удаленные журналы. Я нашел Visual Code AWS Toolkit более чем полезным, и это отличный компаньон для тестирования и разработки Lambda.

На GitHub вы найдете рабочий пример, который отличается от версии ‘Hello World’ файлом template.yaml, другим кодом Go и синтетическими событиями, адаптированными для SQS. Этот репозиторий находится здесь: https://github.com/davedotdev/aws-local-lambda-test.git.

Есть сопутствующий видеоролик, который более подробно рассказывает о SQS и длится около 18 минут:

Мой счетчик клятв набрал всего 1, изучая это, и я был более чем удивлен тем, что просто работает. Хорошая работа AWS.

Материалы для чтения

  • Современные паттерны проектирования: https://docs.aws.amazon.com/prescriptive-guidance/latest/modernization-data-persistence/enabling-patterns.html
  • Создание встроенной политики IAM: https://aws.amazon.com/premiumsupport/knowledge-center/lambda-sam-template-permissions/

Оцените статью
devanswers.ru
Добавить комментарий