Rails on Lambda


Rails on Lambdaとは?

AWS Lambda上でRailsが動くぽいので試してみた。
過去にaws lambda上で動くrailsライクなフレームワークjetsの存在は知っていたが、Railsがそのまま動くのは知らなかった。
lambdaのコンテナイメージのサポートが関係してそう。

lamby

Lambyは、まさにRailsをlambda上で走らせるためツールで、新規Railsプロジェクトの作成、Dockerイメージのビルド、Lambdaへのデプロイ、ApiGatewayの作成など面倒を見てくれる。

簡単に試す

公式のQuickStartに書いてあるとおりにやるとできた。
とりあえず実行したコマンドは、下記のとおりだけど詳しくは公式をみるのが良い。

プロジェクト作成

デプロイ等に必要なコマンドが配置されたRailsプロジェクトを作成してくれる。
実行するとプロジェクト名を聞かれるので好きな名前を入力する。

$ docker run \
  --rm \
  --interactive \
  --volume "${PWD}:/var/task:delegated" \
  lambci/lambda:build-ruby2.7 \
  sam init --location "gh:customink/lamby-cookiecutter"
project_name [my_awesome_lambda]:

セットアップ

作られたプロジェクトディレクトリに移動して、下記のコマンドを実行する。
ここから、AWSに必要な設定が行われれるので
AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_REGION など自分のAWS環境にアクセスできるように環境変数等をせってシておく必要がある。

$ cd my_awesome_lambda
$ ./bin/bootstrap
$ ./bin/setup
  • bootstrap : ecrにリポジトリが作成される
  • setup : bundle installyarn を実行して必要なgenやnpm packageがインストールされる

デプロイ

あとは下記のコマンドを実行すれば動くようになる。
実行するとビルドされたdockerイメージがecrにプッシュされ、API Gateway、IAM、LambdaFunctionがClouformation経由で作成される。
そして最後にアクセス可能になったURLが表示される。=> https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/production

$ ./bin/deploy

おなじみの画面↓たったこれだけで、動くところまでいけるのは便利だ。

作られたlambdaの設定について

  • Memoryは、1792MBで設定されていた。しかし実行時の使用は150MB程度だったので、実装内容しだいではあるが、もうすこしサイズを下げて256MB程度でも良さそうだった。

速度について

気になる速度について、 ChromeのDeveloperツールで確認すると、下記のような感じだった
rails new したばかりのDBアクセスすらないrootページなのでなんともいえないけど

  • 初回: 3-4s くらい
  • 2回目以降: 100ms-160ms くらい

クラメソさん記事によると、1000並列同時アクセスした場合でも同様に初回起動のもの(コールドスタートのもの)は遅くなるが、それほど変わらない速度でレスポンスを返せるとのことだった

まとめ

正直、これだけだとDBアクセスもない、実用的な処理も入っていない状態
なので、使えるかどうか判断しにくいけど、公式のドキュメントにも書いてある、相性の良さそうなAurora Servelessとも連携させるなどしてみたい。

参考