CDKで"一部残して作り直し"したいんだけど(import)
CDKで構成したスタックにトラブルがあり、一部を作り直したくなる事があります。
例えば、以下のような事をして、作り直しが発生しました。
かなしいできごと
ワイ「あー、VPCのcidr間違えた...cidr変更して作り直すか」
ワイ「んー、Elasticache(Redis)とRDSのサブネットグループが、違うcidrで違うVPCにあるとか言うてるな...」
The new Subnets are not in the same Vpc as the existing subnet group
ワイ「うーん、"UPDATE_ROLLBACK_FAILED"のステータスになったな...コンソールでロールバックしろと書いてあるから、管理画面からロールバックするか」
ワイ「ロールバックはできたぞ、もう一度同じことをやってもNGだと思うから、試しにSubnetgroupとRedis/RDSを手動で消してみるか」
DBInstance smxockdf7per4z was not found during DescribeDBInstances
ワイ「むむむ」
ワイ「また"UPDATE_ROLLBACK_FAILED"になったな...」
虚無
ワイ「ネットで色々調べたら、<ロールバックしてやり直すか消すかの二択や>って書いとるな」
ワイ「でも、このstackで作ったHostedZoneのNS、もう顧客に報告してるんやで」
ワイ「このHostedZoneだけは死守せなあかんのや...」
ワイ「ぼすけてー」
最終的にうまく行った手順
Stackの削除
※ここの内容は状況によると思われます。今回守りたかったのはHostedZone
ワイ「まず、確実にHostedZoneが削除されない状態でスタックをdestroyするか...」
ワイ「removalPolicyとかautoDeleteObjectsを設定していなければセーフなはずやけど、HostedZoneの場合、レコードを作っておけば削除できないから、手動で適当なレコードを追加しておこう。」
cdk destroy NantokaStack
DELETE_FAILED
ワイ「よしよし、順調にDELTEにFAILしたな...」って、結局普通にFAILするんかい(あたりまえ)
ワイ「管理画面で削除するか、スタックの削除後に残すチェックボックスにチェックをいれて、ポチポチポチー」
ワイ「なんや、まだエラーになるんか」
ワイ「ふむふむ、さっき手動で削除したRDSが邪魔をしているということやな」
ワイ「こいつらはもう存在しないリソースやけど、敢えて削除後に残すことにするか...成仏してくれ...」
ワイ「(この理屈やとRedisも邪魔するはずやのに、なんでRedisは大丈夫なんや...?まあええか)」
よし、これでStackは消えたぞ。
Stackの再作成
ワイ「よーし、id類が変わらないように注意してStackを再作成するぞー」
ワイ「もちろん、HostedZoneを作るところだけはコメントアウトやな」
cdk deploy NantokaStack
(正常終了)
ワイ「よしよし、CDKは天才やな」
ワイ「このdeployでcdk.out
フォルダにCloudFormantion用のテンプレートができとるんやな」
NantokaStack.template.json
ワイ「よしよし、これや。これをコピーするぞ。」
ワイ「コピーしたら、コメントアウトしたHostedZoneを元に戻してcdk diff
しとくやで」
ワイ「cdk diff
でもtemplate.jsonが作られるんやな」
ワイ「コピーしたやつに、cdk diff
で追加されたHostedZoneの部分だけをコピーして魔改造したNantokaStack.template.jsonを作るやで」
"HostedZoneAAAABBBB": {
"Type": "AWS::Route53::HostedZone",
"Properties": {
"Name": "example.com."
},
"Metadata": {
"aws:cdk:path": "NantokaStack/HostedZone/Resource"
},
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete"
},
※抜粋
ワイ「管理画面を開いて、Stackのリソースのインポートのところから、このNantokaStack.tempalte.jsonをアップロードするやで」
ワイ「idをきかれるから、Zone IDを入力...と」
ワイ「ひえっ!インポートが始まったやで!」
※成功手順はここでおしまいです。
成功するまでの失敗パターンのメモ
- インポートするリソースが無いと管理画面で怒られる
- CDKが吐き出したコピー時のテンプレートをそのままインポートした場合(あたりまえ)
- CDKMetadataが編集されていると管理画面で怒られる
- CDKが吐き出した新しい方のテンプレートをそのままインポートした場合
- DeletionPolicyが無いと管理画面で怒られる
- DeletionPolicyを追加する
- Route53::RecordSetはインポートできないと怒られる
- DNSレコードはインポートしてから再作成することにする(つまりインポート対象から除外する)
学んだこと
- なんかイマイチな状態になっても、手動で削除すると一層イマイチになるので、手動で削除しない
- 頑張ればインポートできる
Discussion