稼働中の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に混ぜてしまってもよかったかも…。
