Рубрики
Uncategorized

AWS лямбда + ржавчина

Эта статья была впервые опубликована на TechPilot.dev TL; DR: Здесь есть пример репо, чтобы те, кто … с меткой DevOps, Rust, AWS, Backend.

Эта статья была впервые опубликована на Techpilot.dev TL; DR: Есть пример репо здесь Для тех, кто хочет пропустить режим истории

Ржавчина Примечал мой интерес, когда обнаружил, что он последовательно занимал первое место в ежегодном обсуждении разработчиков Stackoverflow для самого любимого в мире языка программирования. Вот Обзор 2020 года, но он также имеет первую должность на 2019, 2018, 2017 и 2016 годы.

Оказывается, это так же круто, как говорится, и теперь я в этом конкретном моменте в фазе шумихи, когда я пытаюсь сделать все в ржавении. Я знаю, что это ужасная идея, и я настоятельно советую против этого: выберите язык, у которого есть самая сильная поддержка (ака библиотеки, сообщество) для проблемы, которую вы пытаетесь решить. Делая ML в Rust, когда Python де-факто стандарт не такой большой идеи.

В любом случае, я подумал, что могу сделать исключение, и, поскольку я не в восторге от любых популярных языков бэкэнд, я начал экспериментировать в этом направлении.

Запуск HTTP-сервера Rust, используя Ракета Это действительно легко и хорошо задокументировано, однако, если вы планируете пройти через сервезор, есть еще много неизведанных территорий.

Для AWS Lambda есть пара ресурсов, но многие устарели или каким-то неполными.

Вот основные шаги, которые нам придется следовать:

  • Реализировать обработчики лямбда
  • (Крест) Составьте наш код для платформы Amazon Linux (x86, 64bit)
  • построить каждую лямбду как автономное двоичное
  • Настроить AWS Lambda для развертывания
  • Развертывать и наслаждайтесь

Итак, давайте начнем!

# create a new crate
cargo new rust_aws --bin
# delete the main.rs, we'll be using a binary for each lambda
cd rust_aws && rm src/main.rs
# these are the two lambdas we're going implement
touch src/comment.rs
touch src/contact.rs

Следующий, Наши зависимости в Cargo.toml.

[package]
name = "your_proj_name"
version = "0.1.0"
authors = ["You "]
edition = "2018"

[dependencies]
lambda_runtime = "0.2.1"
lambda_http = "0.1.1"
tokio = { version = "^0.3", features = ["full"] }

[[bin]]
name = "comment"
path = "src/comment.rs"

[[bin]]
name = "contact"
path = "src/contact.rs"

Несколько вещей, чтобы упомянуть здесь. Во-первых, у нас есть лямбда_runtime и lambda_http Ящики, которые несут ответственность за общение с API Lambda. Обычно это означает запустить код установки, выбрасывая имя обработчика из переменной среды и передавать события в наш код. Вы можете узнать больше о том, как пользовательские занятия Runtimes здесь Отказ

Хотя лямбдас нестабилен, AWS может запустить наши двоичные файлы и отправлять несколько событий в тот же процесс, пока процесс не выходит. Это требует петли событий: модный способ обрабатывать асинхронный ввод/вывод и планирование. Мы используем Токио для этого.

Наконец, мы объявили 2 разных двоичных файла, один по имени комментарий другой Контакт и каждый будет развернут как автономная функция лямбда

Далее, компиляция. Если вы не находитесь на машине Linux X86, 64-битного Linux, вам придется пересекать свой код. Для этого нам нужна правильная набор инструментов:

# adds the x86 64 target to the toolchain
rustup target add x86_64-unknown-linux-musl
# installs the x86 64 toolchain on macOS (for Windows, you can probably do it with cygwin-gcc-linux, but I haven't tried it out)
brew install FiloSottile/musl-cross/musl-cross

Наконец, нам нужно позволить грузовик Знайте, что мы пересекаем: добавьте следующее в ./.cargo/config.toml.

[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"

Теперь мы готовы компилировать. Cargo Build --Target X86_64-Unknown-Linux-Musl Чтобы проверить это.

Следующее, что нам нужно сделать, это настроить СЭМ . Я предполагаю, что вы уже знакомы с Сэмом и сосредоточиться только на критическом разделе для нашего дела. Вы можете посмотреть на полный шаблон.мым В примерном репозитории. Кроме того, пропустить Сэм init Поскольку в любом случае нет шаблона ржавчины в любом случае (для моих знаний) и просто начните с шаблон.мым Файл и создайте свою собственную структуру каталогов.

Давайте пройдемся через одно из определений лямбдаса:

# template.yml
Resources:
    Comment:
    Type: AWS::Serverless::Function
    Properties:
    FunctionName: Comment
    Handler: doesnt.matter.the.runtime.is.custom
    Runtime: provided
    MemorySize: 128
    Timeout: 10
    CodeUri: .
    Description: 
    Policies:
        - AWSLambdaBasicExecutionRole
    Events:
    comment:
    Type: Api
    Properties:
    Path: /comment
    Method: post

Это говорит Сэм, чтобы создать функцию лямбда безвесовой функции с именем Комментарий , с пользовательским временем выполнения (обрабатывается или ржавчина lambda_runtime ) и разоблачить его как ресурс API отдыха в /комментарий .

Мы почти закончили. Одна последняя (важная) вещь: когда мы строим и разверним наш лямбдас с SAM Build && Sam развертывает Сэм будет искать Makefile Так как он не знает, как построить наш проект сам по себе.

touch Makefile
build-Comment:
    cargo build --bin comment --release --target x86_64-unknown-linux-musl
    cp ./target/x86_64-unknown-linux-musl/release/comment $(ARTIFACTS_DIR)/bootstrap

build-Contact:
    cargo build --bin contact --release --target x86_64-unknown-linux-musl
    cp ./target/x86_64-unknown-linux-musl/release/contact $(ARTIFACTS_DIR)/bootstrap

То, как это работает просты, вам нужно добавить цель для каждого имени лямбда и префикс с помощью сборка- Отказ Вот и все. Сэм вызвал их по мере необходимости. Каждая цель создает соответствующую бинарный ( --bin Contact ) и копирует его в каталоге артефактов, где он будет застегнут и отправлен на серверы AWS для развертывания.

И это все. Были сделаны. Веселитесь с вашим новым rust-powered AWS Lambdas!

Оригинал: «https://dev.to/rad_val_/aws-lambda-rust-292g»