ResourceConflictException: Lambdaの状態変化におけるデプロイエラー
Serverless Next.js Component
を用いてデプロイしようとすると、エラーが発生するようになりました。使用していたのはnpmで引っ張ってきた公式が提供するcomponentです。
app:
component: "./node_modules/@sls-next/serverless-component"
"@sls-next/serverless-component": "^1.19.0"
エラー内容
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を直接いじってみて様子を見ることにしました。
const defaultEdgeLambdaInput: LambdaInput = {
description:
inputs.description ||
+ "aws:states:opt-out",
- "Default Lambda@Edge for Next CloudFront distribution",
するとエラーが消えて無事にデプロイできました!
と思ったらここで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〜)
解決
npmでcomponentパッケージ管理していたのをやめて、常に最新のバージョンを参照できるようにします。まずはローカルの依存パッケージを削除します(削除しないとずっとnpmから引っ張ってきたものを参照するらしいです)。
% npm uninstall @sls-next/serverless-component --save-dev
あとは以下の修正をしてデプロイ!成功です👍
app:
+ component: "@sls-next/serverless-component"
- component: "./node_modules/@sls-next/serverless-component"
バージョン3.5.XからLmabdaの状態管理エラー対応修正がされているらしいので、3.5.X以降を指定します。バージョン指定をしなければ、常に最新バージョンを使用できます。
今後とも公式のリリースを追うことを誓います😇
Discussion