CloudFormationで削除保護をつけたEC2の作成と削除

AWS CloudFormation

ご機嫌いかがでしょうか、豊崎です。

今回はCloudFormationでEC2にTermination Protection(削除保護)をつけて構築する方法と、削除する方法について書きたいと思います。

Termination Protectionとは

EC2を誤操作による削除(terminate)から守ってくれる機能です。

EC2ダッシュボードの以下赤枠から設定できます。

スクリーンショット_2017-04-06_20_02_35_1

CloudFormationで書いてみる

Termination Protection(削除保護)の書き方は非常に簡単です。 EC2のリソースタイプのDisableApiTerminationプロパティをtrueにするだけです。

###
AWSTemplateFormatVersion: 2010-09-09

Description: TEST EC2 Termination Protection

Resources:
  MyEC2:
    Type: "AWS::EC2::Instance"
    Properties:
      AvailabilityZone: ap-northeast-1a
      DisableApiTermination: true
      ### ここでTerminationProtection(削除保護)を指定しています。
      EbsOptimized: false
      ImageId: ami-859bbfe2
      InstanceType: t2.micro
      KeyName: test-key
      SecurityGroupIds:
        - sg-XXXXXXXX
      SubnetId: subnet-XXXXXXXX

それではCreateStackして作成されたEC2をみてみましょう。 確かに「削除保護」がTrueになっています。

EC2_Management_Console_2

削除してみる

その前に

先ほど作成したCloudFormationStackをDeleteStackしてみたいのですが TerminationProtection(削除保護)が有効になっているのでこのままでは当然削除できません。

このように怒られます。

CloudFormation_マネジメントコンソール

The instance 'i-XXXXXXXXXXXXXXXXX' may not be terminated. Modify its 'disableApiTermination' instance attribute and try again.

ではどうしたらいいのでしょうか?

エラーメッセージにもある通り、DeleteStackする前に、DisableApiTerminationプロパティのパラメータをtrueからfalseに変更してUpdateStackします。 TerminationProtection(削除保護)が無効になったことを確認して、DeleteStackを行いましょう。

UpdateStack

それでは以下テンプレートでUpdateStackをします。 DisableApiTerminationをTrueからfalseに変更しています。

###
AWSTemplateFormatVersion: 2010-09-09

Description: TEST EC2 Termination Protection

Resources:
  MyEC2:
    Type: "AWS::EC2::Instance"
    Properties:
      AvailabilityZone: ap-northeast-1a
      DisableApiTermination: false
      ### ここでを無効を指定しています。
      EbsOptimized: false
      ImageId: ami-859bbfe2
      InstanceType: t2.micro
      KeyName: test-key
      SecurityGroupIds:
        - sg-XXXXXXXX
      SubnetId: subnet-XXXXXXXX

この変更ではEC2の置換は発生しません。

スタックの更新

TerminationProtection(削除保護)がfalseになりました。

EC2_Management_Console_1_1

DeleteStack

その後、DeleteStackを行いましょう。 無事対象のEC2が削除されました。

EC2_Management_Console

さいごに

TerminationProtection(削除保護)はAPIからのTerminateを無効にするオプションであることがわかりました。 保護している対象は保護を解除してからでないと削除できません。AWSマネジメントコンソールでもCloudFormationでもAWSLCIであってもそれは一緒です。 本番環境下など、削除されてはいけないEC2に対してしっかり設定を行いましょう。

参考URL

http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html

https://forums.aws.amazon.com/thread.jspa?threadID=96808