稼働中のCloudFrontを削除する場合、まずCloudFrontの閉鎖が必要である。
これをlamdbaとかで行う場合は、この閉鎖のための待機が必要なため、代わりにStep Functionsを使い閉鎖を待ってから削除するような方法で実装した。
Step Functionsの中身
以下各ステップの説明である。
CloudfrontDeleteGetConfig
閉鎖するにはIF-MatchようにETagが必要なためGetConfigを行う。
arn:aws:states:::aws-sdk:cloudfront:getDistributionConfig
を実行すればlambdaもいらずStep Functionsから直接取得できる。
CloudfrontDeleteModifyConfig
閉鎖のためにはDistributionConfig
のEnabled
をfalseにしないといけない。
そのためには前のstepで取得したDistributionConfig
の値とEnabledをfalseにしたものをマージすることが必要である。
ここでStep Fucntionには組み込み関数というものがあり、パラメータの操作ができる。
ここでStates.JsonMerge
という関数があるのでこれを使う…ことができない!
awsのリファレンスにある通り、現在このJsonMerge
は deep mergeに対応していないのである!
(「3 番目の引数はのブール値です。falseこのブーリアン値は、ディープマージモードが有効かどうかを決定します。」とあるのでいつかは対応しそうだが…。)
もちろんすべてのDistributionConfig
の値を羅列してもいいのだが保守性が最悪なのでここだけはlambdaにした。このlambdaの中身はDistributionConfig
のjsonを受け取ってEnabled
をfalseにするだけである。
CloudfrontDeleteStop
先ほど変更したDistributionConfig
の値を用いてarn:aws:states:::aws-sdk:cloudfront:updateDistribution
を実行する。
ここでしばらく時間がかかることになる…。
CloudfrontDeleteWaiter
待つ。とりあえず5分=300秒待機した。
CloudfrontDeleteDelete
実際に削除する部分。Stopで取得したEtag
とかを使い、arn:aws:states:::aws-sdk:cloudfront:deleteDistribution
で削除する。
ただ閉鎖が完了してないときのために、最大10回分の再挑戦を仕込んである。
この再挑戦は"ErrorEquals":["CloudFront.DistributionNotDisabledException"],
で判定する。
Backoffrateとか利用して時間がかかってもしっかり削除されるようにしている。
感想
lambdaを使わずともStep Functionsでawsのリソースを直接触れるのは良かったが、
パラメータの取り回しの不自由さが気になった。
JsonMerge
はさっさとdeep copy対応してほしい…。
lambdaを使っているならGetConfig
とUpdateConfig
もlambdaに混ぜてしまってもよかったかも…。