Cover Image for [Rust] AWS Lambda へデプロイしてみる

[Rust] AWS Lambda へデプロイしてみる

概要

Rust で作ったものをAWS Lambda で動かしてみようと思う。aws-lambda-rust-runtime を使えばできそうだったので試してみる。 Rust自体を書けるようになることが先じゃないかという考え方もある気がするが、実際に動く環境を先に作っておくと後々ハマったりしないので先に動く環境を整える

やったことメモ

のREADMEに沿ってやっていく

サンプルコードの生成

まずは 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 へのデプロイ方法の選定

  1. cargo-lambda を使ってデプロイ
  2. AWS CLI を使ってデプロイ
  3. AWS Serverless Application Model (SAM) を使ってデプロイ
  4. Serverless Framework を使ってデプロイ
  5. 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 のテンプレートを使ってテストしてみる。 動いたのでこれで問題なし。