2023/01/27
Serverless Frameworkについて
今回は弊社の小林が「Serverless Framework」について話しました。
Serverless Framework とは、サーバーを意識せずにアーキテクチャを容易に作成、管理できるものです。AWS の Lambda などを使ってサーバーレスなサービスを作成するとき、環境の管理、デプロイを簡単に操作してくれます。
Framework と名前についていますが、どちらかというとツールに近いかもしれません。Framework を省略して「Serverless」とだけ呼ばれることが多いかと思います。
基本的には AWS の Lambda を対象にしているみたいですが、それ以外にも GCP や Azure などでも利用できるようです。
Serverless は Node.js で作られた CLI ツールのため、使用するには Node.js をマシンにインストールしなければいけません。
続いて、ターミナルから
のように表示されれば完了です。
今回は Starter を選択しました。
すると、名前を何にするのか今すぐ deploy するのかなど聞かれてプロジェクトが作成されます。
この時、AWS のアカウントと Access Key が必要なので事前に登録して発行しておくようにしましょう。
AWS の CloudFormation から作成したものが確認できます。
中身を確認してみると、 Lambda とソースを置いておくためのバケットが自動で S3 に作られていました。
サンプルのソースも作られているようです。
そして肝になるのが
など各サービス全体の設定が行えます。
下は初めから書かれているサンプルコードです。
このソースをターミナルから変更して
その時、
さらに、
これは結構便利な機能だと個人的には思います。
また、
など様々なイベントをトリガーにできて、セットも用意されています。詳しくはこちらをご覧ください。
今回はこちらを参考に行いました。
作られたサンプルコードです。ここに色々と設定を修正したり追記したりしていきます。
そこで Serverless を利用すれば、IAM やSSM などのリソースを
所感ですが、このような欠点もあるなというふうに感じています。
Serverless の場合、
ただ、Serverless Offline というプラグインを使えばローカルでテストはできるみたいです。
使っていて大丈夫なのか不安になる部分もまだありますが、慣れればきっと便利なツールなんだろうなと思います。興味のある方はぜひ触ってみてください。
Serverless Framework とは、サーバーを意識せずにアーキテクチャを容易に作成、管理できるものです。AWS の Lambda などを使ってサーバーレスなサービスを作成するとき、環境の管理、デプロイを簡単に操作してくれます。
Framework と名前についていますが、どちらかというとツールに近いかもしれません。Framework を省略して「Serverless」とだけ呼ばれることが多いかと思います。
基本的には AWS の Lambda を対象にしているみたいですが、それ以外にも GCP や Azure などでも利用できるようです。
- AWS
- Google Cloud Platform
- Cloud Function など
- Azure
- Functions など
AWS Lambda で試す
それでは実際に Lambda を使って Serverless なサービスを作ってみましょう。Serverless は Node.js で作られた CLI ツールのため、使用するには Node.js をマシンにインストールしなければいけません。
続いて、ターミナルから
npm install -g serverless
で Serverless をインストールします。
$ serverless --version
Framework Core: 3.19.0
Plugin: 6.2.2
SDK: 4.3.2
serverless
とコマンド入力すると、下のように何を作るかと聞かれ、選択できます。今回は Starter を選択しました。
test-project % serverless
Creating a new serverless project
? What do you want to make? (Use arrow keys)
❯ AWS - Node.js - Starter
AWS - Node.js - HTTP API
AWS - Node.js - Scheduled Task
AWS - Node.js - SQS Worker
AWS - Node.js - Express API
AWS - Node.js - Express API with DynamoDB
AWS - Python - Starter
AWS - Python - HTTP API
AWS - Python - Scheduled Task
AWS - Python - SQS Worker
AWS - Python - Flask API
AWS - Python - Flask API with DynamoDB
Other
この時、AWS のアカウントと Access Key が必要なので事前に登録して発行しておくようにしましょう。
AWS の CloudFormation から作成したものが確認できます。
中身を確認してみると、 Lambda とソースを置いておくためのバケットが自動で S3 に作られていました。
サンプルのソースも作られているようです。
test-project % ls
README.md handler.js serverless.yml
handler.js
というファイルがメインのソースになります。
module.exports.hello = async (event) => {
return {
statusCode: 200,
body: JSON.stringify(
{
message: 'Go Serverless v3.0! Your function executed successfully!',
input: event,
},
null,
2
),
};
};
serverless.yml
という設定ファイルです。- インフラ環境
- リージョン
- IAM のロール設定
- Lambda 関数のトリガーとなるイベント
など各サービス全体の設定が行えます。
下は初めから書かれているサンプルコードです。
service: test-project
frameworkVersion: '3'
provider:
name: aws
runtime: nodejs14.x
functions:
hello:
handler: handler.hello
このソースをターミナルから変更して
serverless deploy
すると、CloudFormation 上でデータが更新されます。その時、
serverless remove
しておかないと元のデータが残った上で更新が走るので注意が必要です。serverless invoke --function hello
を実行すると Lambda が実行され、その結果がターミナル上で確認できます。{
"statusCode": 200,
"body": "{\n \"message\": \"Go Serverless v3.0! Your function executed successfully!\",\n \"input\": {}\n}"
}
さらに、
serverless invoke --function hello --log
と後ろに log
を付けることで、CloudWatch Logs に出るようなログが見れます。というわけで、いちいち CloudWatch Logs を確認せずともターミナルだけで動作確認できます。これは結構便利な機能だと個人的には思います。
また、
serverless.yml
にイベントのトリガーを追記すれば、API Gateway を作ることができます。- S3 の操作をトリガーとしたイベント
- Lambda SNS のスケジュールイベント
- HTTP API を追加してみるの通知をトリガーとしたイベント
など様々なイベントをトリガーにできて、セットも用意されています。詳しくはこちらをご覧ください。
Google Cloud Platform で試す
Lambda の時と同じように serverless で環境を構築していきます。今回はこちらを参考に行いました。
作られたサンプルコードです。ここに色々と設定を修正したり追記したりしていきます。
service: gcp-sample
provider:
name: google
stage: dev
runtime: nodejs10
region: us-centrall
project: my-project
# The GCF credentials can be a little tricky to set up. Luckily we've documented this for you here:
# https://serverless.com/framework/docs/providers/google/guide/credentials/
#
# the path to the credentials file needs to be absolute
credentials: ~/.gcloud/unique-rarity-375914-ec6c6fea192d.json
frameworkVersion: '3'
plugins:
- serverless-google-cloudfunctions
# needs more granular excluding in production as only the serverless provider npm
# package should be excluded (and not the whole node_modules directory)
package:
exclude:
functions:
first:
handler: http
events:
- http: path
# NOTE: the following uses an "event" event (pubSub event in this case).
# Please create the corresponding resources in the Google Cloud
# before deploying this service through Serverless
#second:
# handler: event
# events:
# - event:
# eventType: providers/cloud.pubsub/eventTypes/topic.publish
# resource: projects/*/topics/my-topic
# you can define resources, templates etc. the same way you would in a
# Google Cloud deployment configuration
#resources:
# resources:
# - type: storage.v1.bucket
# name: my-serverless-service-bucket
# imports:
# - path: my_template.jinja
credentials
には Google Cloud で生成したサービスアカウントのキーをダウンロードして渡しておくようにします。serverless deploy
が成功すると Cloud Functions にサービスが作成されます。まとめ
私は Terraform で基本的には AWS の環境を管理しているんですが、そうすると Lambda までは管理できません。それを無理やり Terraform に落とし込もうとすると、 Lambda としてアップロードされているものを zip にして、それをそのまま Terraform のソース一覧の中に置いておくだけの処理をされてしまいます。そこで Serverless を利用すれば、IAM やSSM などのリソースを
serverless.yml
に書けるので、Terraform の代わりになるなと。この記事のように棲み分けて書いてみるということをやっている方もいるようです。所感ですが、このような欠点もあるなというふうに感じています。
- dry-run がない
- S3 に読みづらいバケットが増えること
Serverless の場合、
deploy
するとそのまま deploy
が走って何がどう変わるのかを教えてくれません。一応 AWS だと Cloud Formation を一旦挟んでから展開されるので、Cloud Formation に書き出されるはずの yml
だけを出力するコマンドはあるのですが、だからと言って差分が見れるわけではありません。ただ、Serverless Offline というプラグインを使えばローカルでテストはできるみたいです。
使っていて大丈夫なのか不安になる部分もまだありますが、慣れればきっと便利なツールなんだろうなと思います。興味のある方はぜひ触ってみてください。