ようへいの日々精進XP

よかろうもん

Serverless で An error occurred: xxxxxxxxx - A version for this Lambda function exists ( 1 ). Modify the function to create a new version. というエラーが出た場合の対応 (暫定版)

tl;dr

Serverless で, コードを一切変更せずに, serverless.yml の設定だけをイジって (関数にタグを設定した) デプロイ sls deploy したら, 以下のようなエラーが発生して, とりあえず対処したのでメモしておきます.

An error occurred: xxxxxxxxx - A version for this Lambda function exists ( 1 ). Modify the function to create a new version.

とりあえず の対処なので, 正しい対処の方法なのか解っていないので, より良い対策が確認できたら追記したいと思います.

versionFunctions: false

serverless.yml に追加

versionFunctions: false を serverless.yml に追加しました.

---
# yamllint disable rule:line-length

service: sample-application
provider:
  name: aws
  versionFunctions: false
  runtime: go1.x
  region: ap-northeast-1
 
...

この状態でデプロイすることで, 先述のエラーは発生しなくなりました.

versionFunctions について

以下, ドキュメントです.

www.serverless.com

デフォルトでは Lambda 関数はデプロイ毎に新しいバージョンが作成され続けますが, versionFunctions: false を指定することで, これを抑制することが出来ます. デプロイ毎に新しいバージョンが作られなくなることで, 古いバージョンにロールバックしてデプロイすることが出来なくなります.

尚, Serverless ではデプロイの際にコードの sha256 ハッシュ値を計算していますが, このハッシュ値を比較して, バージョンを変更するようです. (ハッシュ値が異なれば新しいバージョンと判断している) 今回のエラーはコードが変更されていないにも関わらず, Serverless が Lambda 関数の新しいバージョンを作成しようとした為に発生したと思われます.

github.com

参考

www.serverless.com

seed.run

以上

色々と解っていないわたくしでございました.