Serverless Frameworkでremoveの前にS3 Bucketの中身を空にするpluginを作った

about

Serverless Frameworkは便利ですね。
LambdaだけじゃなくてAWSリソースも一元管理できますし。
sls removeで一括削除もできる、マジ便利です。

ただ、sls removeは現実的によくありそうなシチュエーションで失敗してしまいます。
そのシチュエーションに陥ると、手動でstack削除を行い、それとは別に原因のリソースを取り除く必要があります。
地味に面倒です。

ということで、失敗を起こさないようにするために作ったのが今回のpluginです。

現象

sls removeに失敗する理由は単純、CloudFormationで作成したS3 Bucketが空ではないから。

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

  An error occurred while provisioning your stack: dataBucket - The bucket you tried to delete is not empty.

裏を返せば、Bucketが空なら削除できるので、removeされる前に自動で空にできれば問題なくsls removeできる。

plugin serverless-s3-remover

そういうことで作成したのがこの serverles-s3-remover です。
sls removeを実行すると、CloudFormationのStack削除よりも先に起動し、指定したS3 Bucketの中身を削除します。

使い方

1. インストール

$ npm install serverless-s3-remover 

プロジェクトフォルダにインストールするだけ。
多分--saveオプションを付けるのが正解な気もする。
serverless同様に-gオプションでグローバルインストールしてもいいと思う(これは試してないけど)。

2. serverless.yml に追記

custom:
  bucket-name: my-bucket-3
  remover:
    bucket:
      - my-bucket-1
      - my-bucket-2
      - ${self:custom.bucket-name}

bucketの下に配列で空にするS3 Bucketの名前を入力する。
CloudFormationでBucketを作成することを考えると、serverless.ymlの変数を使った方が安全だと思う。

3. 実行

$ sls remove

これだけでCloudFormationのStack削除より先にBucketの中身を空にしてくれる。

手動でBucketの中身を空にしたいときは次のコマンドでやれる。

$ sls s3remove

課題

現時点では削除するだけなので、別Bucketに避難させる機能とかあるといいのかもしれない(多分これは実装しない)。
あとは手動削除時も配列で指定したBucket全てを空にするので、オプションを付けて指定できるようにしたほうがいいのかもしれない(要望があれば実装するかも)。

とりあえず思いつく課題はこんなものですが、もし他にあればコメントなりissueなりで教えていただけると、モチベーションによっては、実装するかもしれません。

ということで、serverlessでS3 Bucketを作成した人は使うとremoveが若干楽になるかもしれませんので、気が向いたら使ってやってください。