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:
buckets:
- 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が若干楽になるかもしれませんので、気が向いたら使ってやってください。