🐈

✍️ CDK のアセットバケットを消してしまったときの応急処置メモ

に公開

なんか間違ってバケットを消してしまった(涙)。

何が起きているのか(ざっくり)

  • CDK は内部で S3 の「アセットバケット」を使う
  • Lambda の zip や Docker イメージなどを一時的にここへ置く
  • このバケットが消えると cdk deploy / CloudFormation が即死

つまり、

バケットを同じ名前で作り直せば、とりあえず動く

という話です。

応急処置の方針

やることは 3 つだけ。

  1. バケットを「同じ名前・同じリージョン」で作り直す
  2. バージョニングを有効化する
  3. パブリックアクセスをブロックする

中身(過去のアセット)は戻りませんが、次の deploy で再アップロードされるので問題ありません。

1. バケットを手動で作成する

まずはバケット作成。
名前を間違えると意味がないので要注意です。

aws s3api create-bucket \
  --bucket <BucketName> \
  --region <Region> \
  --create-bucket-configuration LocationConstraint=<Region>

よくある名前はこんな感じです。

cdk-hnb659fds-assets-123456789012-ap-northeast-1

hnb659fdsはデフォルトのqualifierです

2. バージョニングを有効化

CDK のアセットバケットは バージョニング前提です。

aws s3api put-bucket-versioning \
  --bucket <BucketName> \
  --versioning-configuration Status=Enabled

「とりあえず動かす」でも、ここは必須です。

3. パブリックアクセスをブロック

アセットバケットは外に公開される前提ではありません。
素直に全部ブロックします。

aws s3api put-public-access-block \
  --bucket <BucketName> \
  --public-access-block-configuration \
  BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

ここまでやったら

  • cdk deploy をもう一度実行
  • CloudFormation が普通に進む
  • パイプラインも復活

これで一旦は OK です。

ただし、これは「応急処置」

正直に言うと、これは根本解決ではありません。

次に考えたいのは例えばこんな対策です。

  • CDK Bootstrap スタックを消せないようにする
  • SCP / IAM で S3 の削除を制限する
  • アセットバケットを明示的に管理する
  • パイプライン用アカウントと分離する

このあたりをやっておくと、そもそも事故が起きにくくなります。

まとめ

  • CDK のアセットバケットを消すと即障害

  • 同じ名前・同じリージョンで作り直せば復旧可能

  • 必須設定は以下の 3 点

    • バケット作成
    • バージョニング有効化
    • パブリックアクセスブロック
  • ただし恒久対策は別途考える

「CDK あるある事故」の 1 つなので、どこかにメモしておくと安心です。

Discussion