🐈
✍️ CDK のアセットバケットを消してしまったときの応急処置メモ
なんか間違ってバケットを消してしまった(涙)。
何が起きているのか(ざっくり)
- CDK は内部で S3 の「アセットバケット」を使う
- Lambda の zip や Docker イメージなどを一時的にここへ置く
- このバケットが消えると
cdk deploy/ CloudFormation が即死
つまり、
バケットを同じ名前で作り直せば、とりあえず動く
という話です。
応急処置の方針
やることは 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