AWS CloudFormationの削除保護について備忘
先日に引き続きAWS CloudFormationネタでごんす。
AWSコンソールには迂闊者、粗忽者が「あ、操作間違えた」でインスタンスなどのリソースを消す操作をしても「ダメでーす。消せませーん」とやってくれる終了保護・削除保護なるものを備えている機能があります。
で、『これ一休。終了保護・削除保護なるものをクラウドフォーメーションのyamlに追加いたせ』と仰せつかりまして。
へえへえとばかりに着手しましたが――ひどいめにあいました。
「『cloudformation 削除保護』で検索して出てきたのを良しなにすればよかんべ」とやったところ。
DeletionPolicy 属性なるものがヒット。
DeletionPolicy 属性を使用すると、スタックが削除された際にリソースを保持し、場合によってはバックアップすることもできます。制御する各リソースに対して DeletionPolicy 属性を指定します。DeletionPolicy 属性が設定されていない場合、AWS CloudFormation ではデフォルトでリソースが削除されます。
という説明に「つまりDeletionPolicy: Retainって各リソースに入れてやれば削除保護が掛かるわけだな」、と……早合点。大事なことなのでもう一回言います。早合点。
リンク先を最後までちゃんと読むとしっかり書いてあるのですが、
Retain
CloudFormation は、スタックを削除する際に、リソースやコンテンツを削除せず保持します。この削除ポリシーは、あらゆるリソースタイプに追加することができます。CloudFormation がスタックを削除すると、スタックの状態は Delete_Complete になりますが、保管されたリソースはその後も存在し続けます。
『CloudFormationのスタックを削除する際、設定してあると削除対象にならない属性』でございまして……。
――はい、『リソースの終了保護・削除保護を追加する』とは別のものでございました。
DeletionPolicy: Retainを追加したyamlでCloudFormationを実行して、できあがったインスタンスの【終了保護:無効】の表示を見て、「WT〇!?」となったマヌケの話でございました。
……実際にインスタンスに終了保護をつける書き方
Type: AWS::EC2::Instance Properties: DisableApiTermination: true
インスタンスのストレージに終了保護をつける書き方。
『終了時に削除します』に対してのBooleanなので、falseにしないと保護されないという罠がある。
BlockDeviceMappings: - DeviceName: /dev/xvda Ebs: DeleteOnTermination: 'false'
RDSのデータベースに削除保護をつける書き方
DBCluster: Type: AWS::RDS::DBCluster Properties: DeletionProtection: true
RDSのインスタンスに削除保護をつける書き方、もAWSドキュメントで見つけてそっくりCloudFormationのyamlに書いたのですが――
事前に動作確認済みで削除保護を軒並みオンにした状態で実行したところ、
最後の方で「Type: AWS::RDS::DBInstanceでDeletionProtectionなんて使えませーん。バーカバーカ」となって、
CloudFormationが失敗からのロールバックを開始するも、
『削除・終了保護が有効になっているので消せない』
という、先んじて予想して回避すべく作業していた事態に陥らせてくれたので、ここには書きません。
さっき全部手で終了・削除保護を解除して消して直してようやくなんとかなりましたわ。
いぴかいえー。
そして『終了保護・削除保護の書き方を統一して』AWSの偉い人。
おしまい(゜々。)