ServerlessFramework

serverlessでdeployしたときのエラー対応メモ

aws lambdaの名前をserverless.ymlで変更した際にdeployに失敗し起きたエラー

serverless.yml
functions:
  test: 
    handler: main.test
    name: ${self:provider.stage}-test



functions:
  test2: 
    handler: main.test
    name: ${self:provider.stage}-test


$ sls deploy -v

実行

  Serverless Error ---------------------------------------

  An error occurred: TestLogGroup - /aws/lambda/development-test already exists in stack arn:aws:cloudformation:${region}:${account_id}:stack/aws-nodejs-development/xxxxxxx.

そして始まる削除祭り

もうあるっていってるので一度消してみよう。と消す。
serverless.ymlを再度deployすれば大丈夫でしょう。と謎の自信。

lambda削除。

そしてcloud watchのスタック削除へ

cloudwatchのlog削除。

よし、cloud formationも念のためスタック削除。。。としたら
削除に失敗。
。・゚・(゚`ω´゚)・゚・。 しんどい
DELETE_FAILED

おおっと、と思い。
公式documentのトラブルシューティングにすがる。

うーん、この状態で再度デプロイしたらどうなるのか興味が沸いて、まあ、失敗するだろうと思いつつも

$ sls deploy -v

実行。
以下エラーで失敗。(予想通りだ!ドヤア

Stack:arn:aws:cloudformation:${region}:${account_id}:stack/aws-nodejs-development/xxxxxxx. is in DELETE_FAILED state and can not be updated.

公式ドキュメントにすがる。

よし。と
公式documentのトラブルシューティングに戻ってくる。

削除保護つけてると失敗しますよ。という文言が。。。
(このときはドキュメントをちゃんと理解できていなかったのですが、ここでいってる削除保護というのは、cloud formationのスタックにつける削除保護のことだったのだと思います。

serverless.yml
resources:
  Resources:
    TestDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      DeletionPolicy: Retain

そういえば削除保護 DeletionPolicy: Retainつけてた。面倒なことになったなあと落ち込む。(´・ω・`)

コンソールに失敗した理由全てが書いてあった。

コンソールに戻ってどこで失敗したか見てみよう。話はそれからだ、とcloud formationのページにいってどこでfailしてるか確認。
すると、

- iamロール
- s3 bucket

この2つが失敗してるらしい。

状況の理由を確認すると、
iamは、アタッチしてるpolicy全部デタッチしてね。
s3はobject空にしないと削除できないよ〜

とわかりやすく書いてある。
ok!とやってみる。

再度スタックの削除に挑戦。
すると、
- iamロール
- s3 bucket
これらのresourceを保護する?
チェックされたresourceは消さないよ〜
とポップアップが丁寧に出たので、もちろんけさないで!とチェックして実行したら無事消せました!

わーいヽ(○´∀`○)ノ

再度デプロイに挑戦。

再度デプロイすると、

$ sls deploy -v

An error occurred: IamRoleLambdaExecution - TestRole already exists.

IAMのroleもうあるんだけど、って怒られる。
では、と消す。

ついに、デプロイに成功できた。

日々勉強だなあ。頑張ろう。