CodeBuildを使ってLambdaに対して自動デプロイしていたのだが、Layer部分で急にエラーが出るようになったので調べてみた。
TL;DR
- CodeBuild だけでなく、コンソールからの AWS CLI でも起きる
- update-function-configuration を利用しなければ影響はない
- Lambda関数の説明に「aws:states:opt-out」を追加すれば、取り敢えずは今まで通り動く
- 2021/12/1 以降は上記説明を付けても無理そうなので、検討必要
Error Log
An error occurred (ResourceConflictException) when calling the UpdateFunctionConfiguration operation: The operation cannot be performed at this time. An update is in progress for resource: [ARN]
ResourceConflictException
さて、エラーログに例外が明記されていますので調べました。
しかし、上記で検索すると以下の解決策が出てきますが、これでは解決できません。
リソースが既に存在しているか、別のオペレーションが進行中です。
ということで、もう少し調べてみました。
update-function-configuration
Layerの設定を行うコマンドなのだが、これを利用するときだけエラーが発生した。
使っているレイヤーに問題があるのかどうか考えたり、レイヤーの上書きが問題の可能性も考えたが、Layerを消すコマンド(「update-function-configuration」コマンドで空リストを指定するだけ)を使ってもエラーが起きたことから、「update-function-configuration」コマンド自体に問題があると想定して、コメントアウトするとエラーが出なくなったことから確信へと変わった。
the state of AWS Lambda functions
あまり気にしていなかった(知らなかった)だけなのだが、どうやら Lambda には状態というものが存在するようです。
調査中なので割愛しますが、アップデートする際に「LastUpdateStatus」という状態があり、これが「InProgress」になっているとアップデート(上書き)出来ないようになっており、このタイミングで「update-function-configuration」をかけて失敗したものと思っています。
実際にエラーログにも「InProgress」と書かれていました。
何で急にこうなったのかはちゃんと調べます。。
解決策
取り敢えずは、Lambda 関数の説明文に「aws:states:opt-out」と書けば、従来通りに動いてくれました。
「opt-out」なのでデフォルトでは「ON」になっているんですね。。
最後に
常に情報をアップデートすることと、常に勉強しなくては、、と思いました。