専門的な話から趣味の話まで、
様々なテーマでお届け

S2ファクトリーが日々のウェブサイトや
アプリの制作を通じて、
役に立ちそうな技術情報や趣味の話まで
幅広いテーマで発信しています。

2023/01/27

Serverless Frameworkについて

Serverless Frameworkについてアイキャッチ
今回は弊社の小林が「Serverless Framework」について話しました。

Serverless Framework とは、サーバーを意識せずにアーキテクチャを容易に作成、管理できるものです。AWSLambda などを使ってサーバーレスなサービスを作成するとき、環境の管理、デプロイを簡単に操作してくれます。

Framework と名前についていますが、どちらかというとツールに近いかもしれません。Framework を省略して「Serverless」とだけ呼ばれることが多いかと思います。

基本的には AWS の Lambda を対象
にしているみたいですが、それ以外にも GCP や Azure などでも利用できるようです。

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 
すると、名前を何にするのか今すぐ deploy するのかなど聞かれてプロジェクトが作成されます。
この時、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 というプラグインを使えばローカルでテストはできるみたいです。

使っていて大丈夫なのか不安になる部分もまだありますが、慣れればきっと便利なツールなんだろうなと思います。興味のある方はぜひ触ってみてください。

S2ファクトリー株式会社

様々な分野のスペシャリストが集まり、Webサイトやスマートフォンアプリの企画・設計から制作、システム開発、インフラ構築・運用などの業務を行っているウェブ制作会社です。

実績

案件のご依頼、ご相談、その他ご質問はこちらからお問い合わせください。

案件のご依頼、ご相談、
その他ご質問は
こちらから
お問い合わせください。

様々な分野のスペシャリストがお客様と
ともに「できそう」を導き出します。

S2ファクトリー株式会社

様々な分野のスペシャリストが集まり、Webサイトやスマートフォンアプリの企画・設計から制作、システム開発、インフラ構築・運用などの業務を行っているウェブ制作会社です。

実績

案件のご依頼、ご相談、その他ご質問はこちらからお問い合わせください。