Эта статья была впервые опубликована на 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»