AWS CDKでBootstrapを実行したときに failed bootstrapping: Error: The stack named <名前>-CDKToolkit failed creation, it may need to be manually deleted from the AWS console: ROLLBACK_COMPLETE
のエラーに遭遇した時の対処法をメモしておきます。
コンソールのエラーメッセージだけでは、何が原因かわからなかったのでCloudFormation
でエラーの詳細が出ていないか確認しました。
Export with name CdkBootstrap-hnb659fds-FileAssetKeyArn is already exported by stack <名前>-CDKToolkit. Rollback requested by user.
エラーから考えるに「既に作ってるよとだから作れません」と。
しかし、僕は作った覚えはありませんし、CloudFormationも確認しましたがこのCDKを作った形跡はありませんでした。一体なにが原因のなのか? しかも前はこのやり方でBootstrapに成功していました。
結論から言うと原因は前に作ったCDKが原因でした
このエラーが発生する前は普通にBootstrapに成功していて、同じリージョン内でこのエラーが発生したとなるとそうなるよなと思いそうなものですが。違うCDKでスタック名も違うのにと思って、あれやこれや時間を無駄に過ごしてしまいました、、、
で、詳細はというと。
CDKはデフォルトでBootstrapやdeployをする場合はqualifier
というランダムな数字がリソース内部で使われています。デフォルトはhnb659fds
です。
これが肝です!!!
–qualifierは、ブートストラップスタックのすべてのリソースの名前に追加される文字列です。修飾子を使用すると、を使用して同じ環境で複数のブートストラップスタックをプロビジョニングするときに、リソース名の衝突を回避できます–toolkit-stack-name。デフォルトはですhnb659fds (この値には意味がありません)。 修飾子を変更するには、CDK アプリが変更された値をスタックシンセサイザーに渡す必要もあります。詳細については、「スタック・シンセサイザー」を参照してください。
CDKの--show-template
オプションを実行しテンプレートを確認してみます。
cdk bootstrap --show-template > bootstrap-template.yaml --profile dev --context stage=development
実際にテンプレート確認するとありました。
# bootstrap-template.yaml
FileAssetKeyArn:
Description: The ARN of the KMS key used to encrypt the asset bucket (deprecated)
Value:
Fn::If:
- CreateNewKey
- Fn::Sub: ${FileAssetsBucketEncryptionKey.Arn}
- Fn::Sub: ${FileAssetsBucketKmsKeyId}
Export:
Name:
Fn::Sub: CdkBootstrap-${Qualifier}-FileAssetKeyArn
CDKのスタック名を変更してもQualifier
はそのままだとデフォルトのhnb659fds
が使われるのでエラーになるということでした。なので、エラーの解消法してはBootstrap時にQualifier
を指定してやる必要があります。こんな感じでね。
cdk bootstrap --profile dev --context stage=development --qualifier rf4849gas
単純なエラーですがスタック名も違うし、まさか、と思うようなエラーでした。CDKのエラーメッセージは不親切なのでお気つけて。ちなみこのQualifier
の面倒なエラーはこれで終わりません。それはまた次回。