月曜日までに考えておきます

ITネタとゲームネタ中心に興味のあること色々書きます。

Serverless Framework 使ってみた

AWS Lambda などのクラウド上で関数を実行できるサービスの開発効率をあげるためのフレームワーク・ツールである Serverless Fremework を、認識はしていたものの今まで使ったことがなかったので使ってみました。

Serverless - The Serverless Application Framework powered by AWS Lambda and API Gateway

仕事上、AWS Lambda は使う方だと思うのですが、複数人で一つの関数を高頻度で更新するようなユースケースではないため、マネジメントコンソール、または AWS CLI からのポチポチ手作業でもそんな困ってなかったのですが、実際に使ってみると便利さを実感しました。

試した手順

上記のページにある、以下の手順を Mac で実行したところ、いきなり npm install serverless -g でエラーが出てしまいましたが、Node.js のバージョンを上げたら npm のバージョンも上がり、正常に動作するようになりました。

# Install serverless globally
$ npm install serverless -g
# Create a serverless function
$ serverless create --template hello-world
# Deploy to cloud provider
$ serverless deploy
# Function deployed! Trigger with live url
$ http://xyz.amazonaws.com/hello-world

そのまま実行すると、CloudFormation Stack が作られ、us-east-1 リージョンに Lambda 関数と API GatewayAPI が作られていました。serverless remove すると CloudFormation Stack が削除され、作成されたリソースも一緒に削除されるという仕組みでした。

この時点でリージョンを変える手順がわからず、幾つか日本語情報の記事(*)なども見てみたところ、認証については aws configure の情報を使ってくれるようですが、region の情報は使ってくれないようでした。serverless.yml の region にてちゃんと設定する必要がありそうです。 この設定項目は上記の hello-world テンプレートでは存在しないのですが、aws-python みたいなちゃんと開発用のテンプレートを使えば存在してました。 ためしに ap-northeast-1 にしてみたところ、無事東京リージョンにデプロイされました。

(*) 日本語の記事

便利だと思った点

ローカル実行ができるのは便利ですね。 Lambda 上でトライ&エラーするのはなかなかストレスフルですし課金も発生するので、一旦ローカルで動く状態にしてからデプロイする、というアプリケーション開発であれば当たり前のことが、実現できるようになるの捗ります。 ただ、まだ対応していないのか runtime を Python3.6 にした状態ですとこんなエラー出ちゃいました。

events.js:182
      throw er; // Unhandled 'error' event
      ^

Error: spawn python3.6 ENOENT
    at exports._errnoException (util.js:1022:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:189:19)
    at onErrorNT (internal/child_process.js:366:16)
    at _combinedTickCallback (internal/process/next_tick.js:102:11)
    at process._tickDomainCallback (internal/process/next_tick.js:198:9)

Python2.7 だと動いてました。自分の環境が原因の可能性もあるのでもう少し調べてみます。

あとは、GitHub や CodeCommit などのリポジトリ push を起点に serverless deploy を動かして CI みたいなことも簡単にできそうで、ちゃんと開発に Lambda を使うなら必須だなぁと思いました。

競合製品として、Apex というものもあるようなので、こちらも追って調べてみたいと思います。

Apex – Serverless Infrastructure