[Rust] AWS Lambda へデプロイしてみる
この記事は最終更新日から2年以上が経過しています。
概要
Rust で作ったものをAWS Lambda で動かしてみようと思う。aws-lambda-rust-runtime を使えばできそうだったので試してみる。 Rust自体を書けるようになることが先じゃないかという考え方もある気がするが、実際に動く環境を先に作っておくと後々ハマったりしないので先に動く環境を整える
やったことメモ
サンプルコードの生成
まずは cargo-lambda を install する
$ brew tap cargo-lambda/cargo-lambda
$ brew install cargo-lambda
$ cargo install cargo-lambda
インストールが終わったらサンプルプロジェクトを作成する
$ cargo lambda new aws-lambda-sample
? Is this function an HTTP function? No
? AWS Event type that this function receives cloudwatch_events::CloudWatchEvent
とりあえず CloudWatchEvent
で作っておく。作っただけで動くサンプルができているので lambda 用にビルドしてみる
$ cargo lambda build --release --arm64 --bins
これで lambda にデプロイできる形に build できた
AWS-lambda へのデプロイ方法の選定
- cargo-lambda を使ってデプロイ
- AWS CLI を使ってデプロイ
- AWS Serverless Application Model (SAM) を使ってデプロイ
- Serverless Framework を使ってデプロイ
- Docker を使ってデプロイ
READMEを読む限り、方法としては上記の5種類があるっぽい。 ここで慣れてない方法を選択すると目的外のことでハマって時間を食うので、慣れてるSAMでやることにする。
local から sam deploy
SAM CLI などのセットアップは終わっている前提。 終わってない場合は、公式のドキュメント を参考に導入しておく。
以下のように template.yaml
を準備しておく
# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
SampleRustFunction:
Type: AWS::Serverless::Function
Properties:
MemorySize: 128
Architectures: ["arm64"]
Handler: bootstrap
Runtime: provided.al2
Timeout: 5
CodeUri: ./target/lambda/aws-lambda-sample/bootstrap
Outputs:
FunctionName:
Value: !Ref SampleRustFunction
Description: sample
SAMでデプロイするための設定ファイルを生成する。最近は sam deploy --guided
で出来るようになったらしい。
$ sam deploy --guided
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Not found
Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-app]: aws-lambda-sample
AWS Region [us-east-1]: ap-northeast-1
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [y/N]:
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]: y
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]:
Save arguments to configuration file [Y/n]: Y
SAM configuration file [samconfig.toml]:
SAM configuration environment [default]:
Looking for resources needed for deployment:
Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-1943pn3c3rsgk
A different default S3 bucket can be set in samconfig.toml
Saved arguments to config file
Running 'sam deploy' for future deployments will use the parameters saved above.
The above parameters can be changed by modifying samconfig.toml
Learn more about samconfig.toml syntax at
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html
Error: Unable to upload artifact ../target/aarch64-unknown-linux-gnu/release/aws-lambda-sample referenced by CodeUri parameter of SampleRustFunction resource.
S3 Bucket does not exist.
このままではS3バケットがなくてデプロイできないので samconfig.toml
を書き換える。
S3バケットは事前に作っておく。
# samconfig.toml
version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "aws-lambda-sample"
s3_bucket = "TODO:ここを準備したバケットに書き換える"
s3_prefix = "aws-lambda-sample"
region = "ap-northeast-1"
capabilities = "CAPABILITY_IAM"
image_repositories = []
ここまで来ればデプロイできるはずなので、以下のコマンドでデプロイする
$ sam deploy
CloudWatchEvent のテンプレートを使ってテストしてみる。 動いたのでこれで問題なし。