AWS Lambda

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

概要

こんにちは、テクニカルサポートの牛山です。

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

Rustについて

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

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

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

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

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

前提条件

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

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/*'
→デフォルトにする。

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 ~
→ホームディレクトリ直下へ移動。

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

Lambda(rust)

Lambda(node.js)

まとめ

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

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA