今回は serverless.yml
のトップレベルのプロパティについてまとめてみたいと思います。
基本的には以下のドキュメントを読んで要約し、思うところを徒然に書いていきます。
トップレベルプロパティ一覧
トップレベルのプロパティの分類は以下の構成になっています。
分類 | 設定内容(例) |
---|---|
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)の違いは以下参照。
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
に指定。
- Event:
- Resource:
resources
に指定。
- Function:
その他にも、params
, package
, layers
がトップレベルで指定可能なことがわかりました。