AWS CDKで、cdk deployしたらエラー「NoSuchBucket: The specified bucket does not exist」

先日、S3に不要なバケットがたまっていたため、バケットを全削除をするスクリプトを作成・実行しました。

その後、AWS CDK + Pythonで、 cdk deploy したところ、

 ❌  <your_backet_name> failed: NoSuchBucket: The specified bucket does not exist
The specified bucket does not exist

とエラーになり、AWS CDKを使ったデプロイができなくなりました。

 
この時の対応でしばらく悩んだため、メモを残します。

 

目次

 

環境

 

調査と対応

前述の通りバケットを全削除してしまったため、必要なバケット <your_backet_name> が無いせいかと考えました。

そこで、手動でエラーが出ている名称のバケットを作成したものの、エラーは変わりませんでした。

これにより、他にも消してはマズいバケットを消してしまったのかなと考えました。

 

CloudFormationのスタックを見たところ、 CDKToolkit という気になるスタックがありました。

スタックの説明には

The CDK Toolkit Stack. It was created by `cdk bootstrap` and manages resources necessary for managing your Cloud Applications with AWS CDK.

とありました。

Getting Startedページに書かれていないため忘れていましたが、AWS CDKでデプロイする前に、 cdk bootstrap をやっていたことを思い出しました。
Getting Started With the AWS CDK - AWS Cloud Development Kit (AWS CDK)

 

そこで、改めて cdk bootstrap したところ、エラーが変わりました。

$ cdk bootstrap
 ⏳  Bootstrapping environment aws://<account>/<region>...
CDKToolkit: creating CloudFormation changeset...
 0/2 | 8:22:48 PM | UPDATE_IN_PROGRESS   | AWS::S3::Bucket | StagingBucket 
0/2 Currently in progress: StagingBucket
 1/2 | 8:24:34 PM | UPDATE_FAILED        | AWS::S3::Bucket | StagingBucket The specified bucket does not exist (Service: Amazon S3; Status Code: 404; Error Code: NoSuchBucket; Request ID: xxx; S3 Extended Request ID: xxx)
 1/2 | 8:24:34 PM | UPDATE_ROLLBACK_IN_P | AWS::CloudFormation::Stack | CDKToolkit The following resource(s) failed to update: [StagingBucket]. 
 ❌  Environment aws://<account>>/<region> failed bootstrapping: Error: The stack named CDKToolkit is in a failed state: UPDATE_ROLLBACK_COMPLETE
The stack named CDKToolkit is in a failed state: UPDATE_ROLLBACK_COMPLETE

 

ただ、新規で cdk bootstrap を行ったつもりが、ログには UPDATE_IN_PROGRESS と出ていました。

そのため、もしかしたら、スタック CDKToolkit が存在しているせいかもしれないと考えました。

スタック CDKToolkit について、AWSドキュメントの記載は以下です。

Bootstrapping your AWS Environment
Before you can use the AWS CDK you must bootstrap your AWS environment to create the infrastructure that the AWS CDK CLI needs to deploy your AWS CDK app. Currently the bootstrap command creates only an Amazon S3 bucket.

You incur any charges for what the AWS CDK stores in the bucket. Because the AWS CDK does not remove any objects from the bucket, the bucket can accumulate objects as you use the AWS CDK. You can get rid of the bucket by deleting the CDKToolkit stack from your account.

https://docs.aws.amazon.com/cdk/latest/guide/tools.html

 

そこで、スタック CDKToolkit を削除した後、 cdk bootstrap を行ったところ、成功しました。

$ cdk bootstrap
 ⏳  Bootstrapping environment aws://<account>/<region>...
CDKToolkit: creating CloudFormation changeset...
 0/2 | 8:31:37 PM | CREATE_IN_PROGRESS   | AWS::S3::Bucket | StagingBucket 
 0/2 | 8:31:39 PM | CREATE_IN_PROGRESS   | AWS::S3::Bucket | StagingBucket Resource creation Initiated
 1/2 | 8:32:01 PM | CREATE_COMPLETE      | AWS::S3::Bucket | StagingBucket 
 2/2 | 8:32:03 PM | CREATE_COMPLETE      | AWS::CloudFormation::Stack | CDKToolkit 
 ✅  Environment aws://<account>/<region> bootstrapped.

 

次に、 cdk deploy してみたところ、デプロイが成功しました。

$ cdk deploy
<your_stack>: deploying...
<your_stack>: creating CloudFormation changeset...
 0/3 | 8:33:12 PM | CREATE_IN_PROGRESS   | AWS::IAM::User     | xxx (xxx) 
 0/3 | 8:33:12 PM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata 
 0/3 | 8:33:13 PM | CREATE_IN_PROGRESS   | AWS::IAM::User     | xxx (xxx) Resource creation Initiated
 0/3 | 8:33:14 PM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata Resource creation Initiated
 1/3 | 8:33:14 PM | CREATE_COMPLETE      | AWS::CDK::Metadata | CDKMetadata 

 ✅  <your_stack>

 

これより、AWS CDKを使っている場合は、S3のバケット CDKToolkit を削除してはいけないことが分かりました。