この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンニチハ、千葉です。
CDKの検証で、スタック環境を作成、削除をしていたのですが、cdk destroy
を実行しても作成したS3バケットが残ってました。なぜだろう?と思い調査をはじめました。
背景
GitHubのイシューを見つけました。
- S3のデフォルトは削除ポリシーが
Retain
(つまりCFnスタックを削除されてもバケットが残る) - この動作は、
cdk destroy
を実行した場合に、失敗することがあるため。理由としては、S3バケットが空でないとバケットが削除できない - CloudWatchロググループも
Retain
となっている
今後、デフォルト値がアップデートされる可能性がありますが、現状はRetain
となっています。
デフォルトの挙動確認
デフォルトの動作確認です。通常通りS3を作成してみます。コードは以下です。
from aws_cdk import (
aws_s3 as s3,
core
)
class CdkMultiSampleStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
# The code that defines your stack goes here
bucket = s3.Bucket(self,
"cdk-s3-multi-sample")
このコードからCloudFormationテンプレートを出力します。cdk synth
を実行して出力されたjsonを確認しました。
{
"Resources": {
"cdks3multisample47C6CE34": {
"Type": "AWS::S3::Bucket",
"UpdateReplacePolicy": "Retain",
"DeletionPolicy": "Retain",
"Metadata": {
"aws:cdk:path": "Stack-dev-tokyo/cdk-s3-multi-sample/Resource"
}
}
}
出力されるCloudFormationテンプレートにデフォルトでRetain
が付与されていますね。つまり、cdk destroy
をやってもCDKで作成したS3バケットが削除されない状況でした。
削除されるように設定を変更する
removal_policy = core.RemovalPolicy.DESTROY
を入れることで、削除されるように変更できました。
from aws_cdk import (
aws_s3 as s3,
core
)
class CdkMultiSampleStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
# The code that defines your stack goes here
bucket = s3.Bucket(self,
"cdk-s3-multi-sample",
removal_policy = core.RemovalPolicy.DESTROY)
cdk synth
を実行してみました。
{
"Resources": {
"cdks3multisample47C6CE34": {
"Type": "AWS::S3::Bucket",
"UpdateReplacePolicy": "Delete",
"UpdateReplacePolicy": "Delete",
"Metadata": {
"aws:cdk:path": "Stack-dev-tokyo/cdk-s3-multi-sample/Resource"
}
}
}
}
UpdateReplacePolicy
、UpdateReplacePolicy
がDelete
となってますね。これで、destroy時にS3バケットも削除されるようになりました。(ただし、事前にバケットの中を空にしておく必要があります)
最後に
ちょっと紛らわしい動作で混乱しました。もしハマった方がいたら参考になると嬉しいです。
参考
- https://github.com/aws/aws-cdk/issues/2601
- https://docs.aws.amazon.com/cdk/api/latest/docs/aws-s3-deployment-readme.html