🍟

Cargo Lambda | Rustコードを AWS Lambda に手っ取り早くデプロイする

に公開

はじめに

お久しぶりです〜!

最近スプラトゥーン3のアップデートがあり、ドライブワイパーRustなるブキが追加されました。
カーリングボムで前に出てメインの素早いキル性能と回転率爆早のウルトラショットで後衛に圧をかけつつ、、、
みたいなことを考えていると、最近Rust触っていないことに気づき、記事を執筆することに。
今回はCargo Lambdaを使ってRustコードをLambdaにデプロイしてみようと思います!

Cargo Lambdaを使うための下準備

まずは何もない(Cargoとかは使える)状態で、下準備を整えていきたいと思います。
大前提、Macで下準備を整えていきたいと思いますので、あくまでもMac向けです。ご容赦ください。

cargo-lambdaをインストール

最初にHomebrewでcargo-lambdaをインストールしていきます!
以下のコマンドを実行。

$ brew install cargo-lambda/tap/cargo-lambda
Homebrewがない方向け
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Rustコードの作成

無事に、cargo-lambdaのインストールが完了したら、プロジェクトディレクトリを作成します。

$ cargo lambda new rust-lambda && cd rust-lambda

下準備はたったのこれだけ!あとは適当にRustコードを書いていきます。
参考までに以下のコードを真似しても良きです。

main.rs
use lambda_runtime::{run, service_fn, Error, LambdaEvent};
use serde::{Deserialize, Serialize};

#[derive(Deserialize)]
struct Request {
    name: String,
}

#[derive(Serialize)]
struct Response {
    message: String,
}

async fn handler(event: LambdaEvent<Request>) -> Result<Response, Error> {
    let request = event.payload;
    let message = format!("Hello, {}!", request.name);
    
    Ok(Response { message })
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    run(service_fn(handler)).await
}
Cargo.toml
[package]
name = "rust-lambda"
version = "0.1.0"
edition = "2021"

[dependencies]
lambda_runtime = "0.8.1"
tokio = { version = "1.0", features = ["rt-multi-thread", "macros"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

AWS LambdaにDeploy!

コードが完成したら、あとは画面ぽちぽちとコマンド実行のみで終わりです。お疲れ様でした。
ローカルからコマンドを実行し、Lambda Functionを作成するため、ローカルにAWSシークレット、シークレットアクセスキーを作成し、セットしておく必要があります。

IAMユーザーの作成

まずはAWSマネコンからIAMユーザーを作成します。
IAM

ポリシーを直接アタッチし、以下を追加します。

  • IAMFullAccess
  • AWSLambda_FullAccess
    IAM

最後にこんな感じでポリシーが付与されていればOKです。
IAM

作成できたら、IAMユーザーのアクセスキーを作成して、一旦手元にメモしておきます。

AWS CLIが必要になるので、まだの場合は先にインストールを行なっておきます。
以下のコマンドを実行します。

$ aws configure
  • AWS Access Key ID:作成したアクセスキー
  • AWS Secret Access Key:作成したシークレットアクセスキー
  • Default region name:ap-northeast-1
  • Default output format:json

ビルド & デプロイ

いよいよ最後。ビルドしてデプロイしていきます!
以下のコマンドでビルドを行います。

$ cargo lambda build --release

ビルドが完了したら、いざデプロイ。

$ cargo lambda deploy

無事デプロイされているようです!
ターミナル

テストを実行

AWSコンソールでLambdaを開くと、以下のようにLambda関数が作成されていました。
Lambda

テストタブから、以下のようなJSONを使って、テストを実行します。
Lambda

{
    "name": "Cargo Lambda"
}

期待した応答が返ってきました👏
Lambda

とても簡単ですね!

おわりに

Cargo Lambdaを使って、RustコードをLamdaにデプロイするところまでを実施しました。
Terraform等のIaCを使わずとも、お手軽に構築できる点は魅力的ですね!何の問題もなければ5分ほどでデプロイからテストまでできちゃいます。

また、今回は割愛しましたが、Github Actionsを使ってデプロイもできるようだったので、自動デプロイも実現できそうです。
ほとんど労力かかっていないので、Rust x LambdaのCDはこれで決まり!かなと思います。

では!

Discussion