👣

ResourceConflictException: Lambdaの状態変化におけるデプロイエラー

2022/01/19に公開約3,300字

Serverless Next.js Componentを用いてデプロイしようとすると、エラーが発生するようになりました。使用していたのはnpmで引っ張ってきた公式が提供するcomponentです。

serverless.yml
app:
  component: "./node_modules/@sls-next/serverless-component"
package.json
  "@sls-next/serverless-component": "^1.19.0"

https://github.com/serverless-nextjs/serverless-next.js

エラー内容

Expansion of AWS Lambda states to all functions

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/troubleshooting-invocation.html
https://aws.amazon.com/de/blogs/compute/coming-soon-expansion-of-aws-lambda-states-to-all-functions/

ResourceConflictExceptionで調査していくと、どうやらLmabdaの状態変化によるエラーが原因と分かりました。デプロイによりLambdaがInProgressになっている状態で、何かしらの更新処理が走っているからだと思われます。

「aws:states:opt-out」

設定の説明文を「aws:states:opt-out」とすると更新を遅らすことができ、InProgress状態に更新が走ることを防げるみたいです。早速変更してみます。

確認のため、対象のLambdaの状態をみてみると「State=Active」「LastUpdateStatus=Seccessful」なので、先ほどの説明文の変更とともにデプロイ!

% aws lambda get-function --function-name hogehoge --query 'Configuration.[State, LastUpdateStatus]' --region fugafuga
- Active
- Successful

ですが、「aws:states:opt-out」で新しいバージョンが発行されるにも関わらず、まだ同じエラー文がでます。しかも、変更したはずの説明文が勝手に元に戻ってしまう現象が起きました。

おそらくserverlessによるデプロイのタイミングで、説明文が上書きされているからだと思われます。コンソールで説明文を変更してもダメなら強行突破だ!

直接componentをいじってみる

ということで試しにnode_modules/配下に格納されているcomponentを直接いじってみて様子を見ることにしました。

component.ts
   const defaultEdgeLambdaInput: LambdaInput = {
      description:
        inputs.description ||
+       "aws:states:opt-out",
-       "Default Lambda@Edge for Next CloudFront distribution",

https://github.com/serverless-nextjs/serverless-next.js/blob/master/packages/serverless-components/nextjs-component/src/component.ts#L764

するとエラーが消えて無事にデプロイできました!
と思ったらここでWarning「componentのバージョン古いよ〜!」が...😱😱😱

% serverless --stage=dev

  hoge: 
    appUrl:         https://fuga.cloudfront.net
    bucketName:     piyo
    distributionId: hogera

  *****************************************************************************************************************************************************************
  Warning: You are using the beta version of Serverless Components. Please migrate to the GA version for enhanced features: https://github.com/serverless/components
  *****************************************************************************************************************************************************************

全ての原因はcomponentバージョン管理不足でした😇

公式のissueを読み漁るとちゃんと修正してくださってました。(v3.5.X〜)

https://github.com/serverless-nextjs/serverless-next.js/issues/1976

解決

npmでcomponentパッケージ管理していたのをやめて、常に最新のバージョンを参照できるようにします。まずはローカルの依存パッケージを削除します(削除しないとずっとnpmから引っ張ってきたものを参照するらしいです)。

% npm uninstall @sls-next/serverless-component --save-dev 

あとは以下の修正をしてデプロイ!成功です👍

serverless.yml
app:
+  component: "@sls-next/serverless-component"
-  component: "./node_modules/@sls-next/serverless-component"

バージョン3.5.XからLmabdaの状態管理エラー対応修正がされているらしいので、3.5.X以降を指定します。バージョン指定をしなければ、常に最新バージョンを使用できます。
今後とも公式のリリースを追うことを誓います😇

Discussion

ログインするとコメントできます