Serverless Frameworkのデプロイ用S3バケットの設定

Serverless Frameworkでデプロイすると、デプロイ用のS3バケットが勝手に作成されます。勝手な作成を抑制する設定のメモです。

Serverless FrameworkはCloudFormationのテンプレートやLambdaに使うソースコードをS3バケットに保存してデプロイ処理します。バケット名は、「サービス名-ステージ名-英数字12文字」という名前になり、サービスやステージごとに作成されてしまいます。

バケットの中は「serverlss/サービス名/ステージ名/デプロイ日時/」というフォルダの中にjsonやzipファイルが置かれます。したがってServerless Framework用のバケットを1つ用意して、それを複数のサービスやステージで共有しても衝突はしません。

デプロイ用S3バケットの指定

バケット名を serverless.yml に以下のように書けばよいです。

provider:
  deploymentBucket:
    name: FOOBAR_DEPLOYMENT_BUCKET

このようにバケット名を明示的に指定した場合は、バケット自動作成されませんので、バケットがない場合は「Could not locate deployment bucket. Error: The specified bucket does not exist」というエラーになります。事前に自分で作成が必要です。

バケット作成のコマンドの例

$ aws s3 mb s3://FOOBAR_DEPLOYMENT_BUCKET

maxPreviousDeploymentArtifacts の設定

デプロイ用S3には最大で過去5回のデプロイのファイルが保存されます。それより古いデプロイファイルは自動で削除されます。

この5回という値を変更するには serverless.yml に以下のように書きます。

provider:
  deploymentBucket:
    name: FOOBAR_DEPLOYMENT_BUCKET
    maxPreviousDeploymentArtifacts: 3 # デプロイ用S3バケットには最大で3世代のみ保存

versionFunctions の設定

上記と紛らわしくて私は最初混乱したのですが versionFunctions という設定があります。

versionFunctions は、デプロイ用S3バケットとは関係なく、Lambda自体のバージョニングをするかどうかの設定です。 versionFunctionstrue にすると下のスクショにあるVersionsのところのバージョン番号が進んでいきます。false にすると、バージョン番号が進まず $LATEST のみが更新されるようです。デフォルトは true です。

f:id:suzuki-navi:20210108142117p:plain

serverless-prune-plugin プラグイン

versionFunctionstrue にしてLambdaのバージョニングをする場合、古いバージョンが残り続けてしまいます。古いバージョンのLambdaは上記デプロイ用S3バケットとは別のLambda用のS3バケットに保存されてますので、場合によってはS3の容量を消費します。

古いバージョンを自動で削除させるには serverless-prune-plugin プラグインを導入します。

$ serverless plugin install -n serverless-prune-plugin

インストールすると serverless.yml に以下の記述が追記されます。

plugins:
  - serverless-prune-plugin

このプラグイン指定のほかに以下のような記述を追加すると、Lambdaの古いバージョンを自動で削除してくれるようになります。

custom:
  prune:
    automatic: true
    number: 3 # 最大で3バージョンを保存

リンク

ドキュメント

Serverless Frameworkに関する私の記事