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 指定する手段(テンプレート中から指定できたら便利そうだが)

後者は待機条件?っての使ったらできそうな気がするけども。