Serverless Framework トップレベルプロパティ

前回の記事

今回は serverless.yml のトップレベルのプロパティについてまとめてみたいと思います。

基本的には以下のドキュメントを読んで要約し、思うところを徒然に書いていきます。

www.serverless.com

トップレベルプロパティ一覧

トップレベルのプロパティの分類は以下の構成になっています。

分類 設定内容(例)
Root Properties サービス名
Serverless Framework API バージョン
バリデーション設定
.env 利用有無
Deprication通知設定
Parameters 環境変数
Provider クラウドプロバイダ設定(以下 AWS 前提で記載)
CloudFormation設定(デプロイメソッド・ロールバック)
Lambda設定(ランタイム・メモリサイズ)
デプロイ先 S3 バケット設定(パブリックアクセス・バージョニング・暗号化)
API Gateway v2 設定(CORS・認証)
API Gateway v1 設定(APIキー・使用量プラン)
ALB 設定(認証)
ECR 設定(Lambdaを Docker イメージで動かす場合)
CloudFront 設定(キャッシュポリシー)
IAM 設定(Lambda ロール)
VPC 設定 (VPC Lambda 利用の場合)
Logs 設定(フォーマット・ログレベル)
Lambda Events としての S3 設定(バケット名・バージョニング)
Package デプロイする関数のディレクトリ・アーティファクトzip
Functions Lambda 関数。コンセプトで触れた "Event" もこの中で設定。
Function layers Lambda レイヤーの設定
AWS Resources その他 AWS リソース(CloudFormation テンプレート)

Provider 設定では全体的な共通設定が行えるようです。例えば Lambda のメモリサイズについては Provider でも Functions でも設定可能なので、"Functions に定義がなければ Provider 設定を反映" のような動きをするのだと思います。

API Gateway v1 (REST API)と API Gateway v2 (HTTP API)の違いは以下参照。

docs.aws.amazon.com

dev.classmethod.jp

Serverless Framework では、v1, v2 と呼び分けているので、あたかも v2 のほうが良い様に見えますが、特殊な要件がないならば v1(REST API) でしょう。

実際の構成は以下のようになります。上のテーブルの「分類」列をコメントとして記載しています。

serverless.yml
# Root Properties
service: myservice
frameworkVersion: '3'
configValidationMode: error
useDotenv: true
approached deprecation
deprecationNotificationMode: warn:summary
disabledDeprecations:
  - DEP_CODE_1 # Deprecation code to disable
  - '*' # Disable all deprecation messages

# Parameters
params:
  prod:
    my-parameter: foo
  dev:
    my-parameter: bar

# Provider
provider:
  name: aws
  stage: dev
  region: us-east-1
  ...(略)

# Package
package:
  patterns:
    - src/**
    - handler.js
    - '!.git/**'
    - '!.travis.yml'
  individually: true
  artifact: path/to/my-artifact.zip
  excludeDevDependencies: false

# Functions
functions:
  hello:
    handler: users.create
    image: baseimage
    runtime: nodejs14.x
    ...(略)


# Function Layers
layers:
  hello:
    path: layer-dir
    name: ${sls:stage}-layerName
    description: Description of what the lambda layer does
    compatibleRuntimes:
      - python3.8
    ...(略)


# AWS Resources
resources:
  Resources:
    usersTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: usersTable
        AttributeDefinitions:
          - AttributeName: email
            AttributeType: S
        ...(略)

  extensions:
    UsersCreateLogGroup:
      Properties:
        RetentionInDays: '30'

  Outputs:
    UsersTableArn:
      Description: The ARN for the User's Table
      Value: !GetAtt usersTable.Arn
      Export:
        Name: ${self:service}:${sls:stage}:UsersTableArn

まとめ

Serverless Framework のコンセプトとマッピングすると以下のようになるでしょうか。

  • Service:serverless.yml ファイル単位。Root Properties にサービス名を service として指定。
    • Function:functions として指定。
      • Event:functions.<function name>.events に指定。
    • Resource:resources に指定。

その他にも、params, package, layers がトップレベルで指定可能なことがわかりました。