techblog

rustでServerless Framework使用してaws lambda関数をデプロイし実行してみた

rustでServerless Framework使用してaws lambda関数をデプロイし実行してみた

目次

  1. 概要
  2. 前提条件
  3. Rustについて
  4. Serverless Frameworkのセットアップ
    1. Node.jsのインストール
    2. Serverless Frameworkのインストール
    3. プロジェクトの作成
    4. AWS上にデプロイ
    5. AWS上にデプロイされたLambda関数の実行
    6. AWS上での確認
      1. CloudFormation
      2. Lambda(rust)
      3. Lambda(node.js)
  5. まとめ

概要

今回は、rust言語で、Serverless Frameworkを用いてAWS Lambda上にデプロイ(サンプルプログラム)し、Hello World!というお決まりのワードを表示してみたいと思います。

前提条件

  • awsコマンドインストール済で、aws configure認証情報設定済であること。
  • dockerがインストール済で、dockerサービスが起動していること。

Rustについて

Rustはシステムプログラミングや、コマンドラインプログラム、Webサーバ等、さまざまな用途に使用できるプログラミング言語です。

スピードとメモリー使用の観点で効率的で信頼性の高いコードへと自然に導くよう設計されており、C言語で問題となっているメモリー関連で弱かった部分をカバーしています。

また、コンパイラー型言語なのでコンパイル時、コードに問題のある箇所を確実に補足してくれます。

今回は、そのような特徴をもったRustがAWSからAWS SDK for RustというSDKがαリリースされましたので実際に使用していきたいと思います。

  • AWS SDK を使用した、連携は第2回目の記事で記載します。
  • ※ 今回は、ただRustをLambda上で動かしてみるという内容になります。

Serverless Frameworkのセットアップ

Node.jsのインストール

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

. ~/.nvm/nvm.sh
→nvmの有効化

nvm install --lts --latest-npm
→nodeのインストール

nvm alias default 'lts/*'
→デフォルトにする。

LTSバージョンインストールについて

node -e "console.log('Running Node.js ' + process.version)"

Running Node.js v14.17.1

→Node.jsがインストールされたことを確認。

Serverless Frameworkのインストール

mkdir sls
→ディレクトリ作成

cd sls

npm init
→いくつか質問されるがすべてEnterで、最後の質問は、yesでOk。

npm install --save serverless
→Serverless Framework本体をインストール。

npm bin serverless

/root/sls/node_modules/.bin

echo 'export PATH="$HOME/sls/node_modules/.bin/:$PATH"' >> ~/.bash_profile
→パスを通す。

source ~/.bash_profile
→適用する。

serverless -v

Framework Core: 2.48.0 (local)
Plugin: 5.4.1
SDK: 4.2.3
Components: 3.12.0

→Serverless Frameworkがインストールされたことを確認。

こちらの記事に書かれている内容となります。

プロジェクトの作成

cd ~
→ホームディレクトリ直下へ移動。

npx serverless install \
  --url https://github.com/softprops/serverless-aws-rust \
  --name rust-first-lambda-app \
  && cd rust-first-lambda-app \
  && npm install --silent

Need to install the following packages:
  serverless
Ok to proceed? (y) y



Serverless: Downloading and installing "serverless-aws-rust"...
Serverless: Successfully installed "serverless-aws-rust" as "rust-first-lambda-app"

→serverless AWS Rust templateが用意されているのでありがたく使わせてもらいます。

AWS上にデプロイ

npx serverless deploy

Serverless: Building Rust hello func...
Serverless: Running containerized build
Unable to find image 'softprops/lambda-rust:0.2.7-rust-1.43.1' locally
0.2.7-rust-1.43.1: Pulling from softprops/lambda-rust



   Compiling hello v0.1.0 (/code)
    Finished release [optimized] target(s) in 2m 58s
  adding: bootstrap (deflated 61%)
Serverless: Packaging service...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...



Serverless: Stack update finished...
Service Information
service: rust-first-lambda-app
stage: dev
region: us-east-1
stack: rust-first-lambda-app-dev
resources: 6
api keys:
  None
endpoints:
  None
functions:
  hello: rust-first-lambda-app-dev-hello
layers:
  None

→Serverless Frameworkの標準的なデプロイコマンドで実施、AWS Lambda上に提供されるrustカスタムランタイムでビルドされ、その後、CloudFormationスタックが作成されデプロイされます。

AWS上にデプロイされたLambda関数の実行

npx serverless invoke -f hello -d ’{“Hello”:“World!”}’

{
    "Hello": "World!"
}

→正常に渡した値が返ってきていることが確認できました。

AWS上での確認

node.jsとrustで比較するのは、酷かもしてれませんが、メモリ効率、実行速度ともに良いですね。

CloudFormation

image 画像をホバー/タップすると拡大表示されます

Lambda(rust)

image 画像をホバー/タップすると拡大表示されます

Lambda(node.js)

image 画像をホバー/タップすると拡大表示されます

まとめ

Serverless Frameworkを使用すると簡単にAWS上へLambda関数をデプロイすることができ、ビルド環境もコンテナー上で処理されるのでいいことだらけですね。