AWS CloudFormation でスタック削除時に DELETE IN PROGRESS でブロッキングする件
AWS CloudFormation でスタックを削除しようとすると、DELETE IN PROGRESS 状態が 10 分続き、先に進まないという現象が起きた。普段なら 1 分くらいで終わるのに。
前提
「事前に別のテンプレ base_environment.yaml でつくっておいた環境に、インスタンスを一つ追加する」テンプレ injection.yaml を実行する。
injection.yaml は、以下のように 指定したサブネットに対して EC2 インスタンスをつくる 感じ。
injection.yaml:
Parameters: KeyPairName: Description: keypair name Type: AWS::EC2::KeyPair::KeyName AmiId: Description: ami id (RHEL-8.0.0_HVM-20190618-x86_64-1-Hourly2-GP2) Default: ami-09f31cc5d5eecca1a Type: String TargetSubnetId: Description: subnet id Default: subnet-xxxxxxxxxxxxxxxxx Type: String Resources: Instance1: Type: AWS::EC2::Instance Properties: KeyName: !Ref KeyPairName ImageId: !Ref AmiId AvailabilityZone: "ap-northeast-1a" InstanceType: "t3.medium" SourceDestCheck: false NetworkInterfaces: - NetworkInterfaceId: !Ref NetworkInterface1 DeviceIndex: 0 Tags: - Key: Name Value: test-stakiran-instance NetworkInterface1: Type: AWS::EC2::NetworkInterface Properties: PrivateIpAddress: 10.0.10.1 SubnetId: !Ref TargetSubnetId # ★ここが肝。 Tags: - Key: Name Value: test-stakiran-networkinterface
やったこと
- 1: base_environment.yaml でスタック作成する
- 2: injection.yaml でスタック作成する
- 1 でつくったサブネットの id を使う
- 3: injection.yaml で作成したスタックを削除する
ここでブロッキングが発生する。普段 1~2 分で終わる削除が、10分経っても DELETE COMPLETE にならない。
リソースタブを見ると、
Subnet1 subnet-XXXXXXXXXXXXXXXXX AWS::EC2::Subnet DELETE_IN_PROGRESS
こんな感じで injection.yaml が依存しているサブネット の削除が in progress のままになっている。
対処方法
Ans: base_environment.yaml のスタックも削除する。
AWS の仕様なんだろうが、削除時の挙動はたぶんこんな感じになってる。
- 削除対象のリソース XXX が他(のスタックでつくったリソース)から利用されている場合、XXX は消さない
- 内部的にはインターバルで削除試行を試す
- でも試行の結果はいちいち管理コンソール上には出さない
つまり 「他のスタックでつくったリソース」を消すまで delete in progress のままになってしまう。
この件に関する資料や根拠はある?
Ans: 軽く調べたけど見当たらない。
まず AWS CloudFormation のトラブルシューティング - AWS CloudFormation この辺には書いてなさそう。
唯一、AWS Developer Forums: Attempting to delete stack - stuck at ... にて「50分後に内部エラーで失敗するよ」というコメントはあったが、信ぴょう性は不明。
After 50 minutes it returned delete failed due to "Internal Failure". Attempted delete again, still hanging the same status of delete in progress - user initiated.
おわりに
まあ base_environment.yaml から消すってのは普通はしないだろうけど、今回興味本位でやってみたらこうなったので記事にしとく。
個人的には以下が欲しいなぁ。
- いつタイムアウトするか(or しないならしないでも良いが)に関する仕様を記した AWS 公式ドキュメント
- タイムアウト値を変える or 指定する手段(テンプレート中から指定できたら便利そうだが)
後者は待機条件?っての使ったらできそうな気がするけども。