😇

CDKで"一部残して作り直し"したいんだけど(import)

2021/04/05に公開

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を作るやで」

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