
aws-nukeで削除保護されたリソース(EC2,RDS,CFnスタック)も削除する方法
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
「aws-nukeで削除保護されたEC2やRDSインスタンス・Cloudformationスタックも削除したい」
aws-nukeを使っていると、削除保護されているリソースもまとめて削除したいことがあるかと思います。
aws-nukeではデフォルトでは、削除保護されたリソースは削除が失敗します。 削除保護のリソースを削除する設定を有効化することで、削除保護されたリソースもまとめて消すことが可能です。
結論から書くと、configファイルに以下の記述を追加するだけです。
feature-flags:
  disable-deletion-protection:
    RDSInstance: true
    EC2Instance: true
    CloudformationStack: true
rebuy-de/aws-nuke Feature Flags
やってみた
削除保護を有効化したEC2を対象に、aws-nukeで削除を試してみます。
まずは、aws-nukeをの実行環境を整えます。
今回はdockerを使って、aws-nukeを実行します。
実行用にdocker-compose.ymlを用意します。
dry-runとrunでコンテナを分けています。
version: "3"
services:
  aws-nuke-dry-run:
    image: rebuy/aws-nuke:latest
    entrypoint: /usr/local/bin/aws-nuke --config /home/aws-nuke/config.yml --force --quiet
    volumes:
      - ./nuke-config.yml:/home/aws-nuke/config.yml
      - ~/.aws:/home/aws-nuke/.aws
    environment:
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_SESSION_TOKEN
  aws-nuke-run:
    image: rebuy/aws-nuke:latest
    entrypoint: /usr/local/bin/aws-nuke --config /home/aws-nuke/config.yml --force --quiet --no-dry-run
    volumes:
      - ./nuke-config.yml:/home/aws-nuke/config.yml
      - ~/.aws:/home/aws-nuke/.aws
    environment:
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_SESSION_TOKEN
aws-nuke用のconfigファイルを用意します。 EC2インスタンスのみを削除するように作成しました。
accountsの部分は、自分のAWSアカウントIDに書き換えてください。
regions:
  - ap-northeast-1
  - global
account-blocklist:
  - "000000000000" # dummy
resource-types:
  targets:
    - EC2Instance
accounts:
  "11111111111": # 自分のアカウントIDに書き換える
ファイルを用意できたら、以下のような状態になっているはずです。
% ls -1 docker-compose.yml nuke-config.yml
AWS認証情報を設定して、dry-run実行時にEC2がaws-nukeの対象になっていることを確認します。
# 認証情報の設定 % export AWS_ACCESS_KEY_ID=<アクセスキー> % export AWS_SECRET_ACCESS_KEY=<シークレットアクセスキー> % export AWS_SESSION_TOKEN=<セッショントークン> # dry-runの実行 % docker compose run aws-nuke-dry-run # 省略 ap-northeast-1 - EC2Instance - i-XXXXXXXX - [Identifier: "i-XXXXXXXX", ImageIdentifier: "ami-XXXXXXX", InstanceState: "stopped", InstanceType: "t3.micro", LaunchTime: "2023-01-06T05:56:35Z"] - would remove Scan complete: 1 total, 1 nukeable, 0 filtered.
最後に対象のEC2が削除保護が有効化されていることを確認します。
DisableApiTerminationがtrueになっているため、削除保護は有効化されています。
aws ec2 describe-instance-attribute --attribute disableApiTermination  --instance-id i-XXXXXXX
{
    "DisableApiTermination": {
        "Value": true
    },
    "InstanceId": "i-XXXXXXX"
}
ここまで確認できたら事前準備は完了です。
削除保護無視の無効化時(デフォルト)
aws-nukeのconfigで削除保護無視の設定が入っていない状態で、削除を実行してみます。
% docker compose run aws-nuke-run
ERRO[0043] OperationNotPermitted: The instance 'i-XXXXXXX may not be terminated. Modify its 'disableApiTermination' instance attribute and try again.
        status code: 400, request id: XXXXXXXXXX
Error: failed
削除保護が有効化になっているため、削除できない旨のエラーメッセージが出ました。
削除保護無視の有効化時
では削除保護無視の設定を有効化して、実行してみます。
以下の様にnuke-config.ymlに該当の設定を追加します。
regions:
  - ap-northeast-1
  - global
account-blocklist:
  - "000000000000" # dummy
resource-types:
  targets:
    - EC2Instance
accounts:
  "201472471660":
feature-flags:
  disable-deletion-protection:
    EC2Instance: true
上記のconfig修正後に、実行してみるとfinishiedになり削除に成功しました。
% docker compose run aws-nuke-run # 省略 ap-northeast-1 - EC2Instance - i-XXXXXXXX - [Identifier: "i-XXXXXXXX", ImageIdentifier: "ami-XXXXXXX", InstanceState: "stopped", InstanceType: "t3.micro", LaunchTime: "2023-01-06T05:56:35Z"] - would remove Removal requested: 0 waiting, 0 failed, 0 skipped, 1 finished
補足: RDSとCloudFormationスタックの削除保護の無視
今回はEC2インスタンスの削除を検証しましたが、RDSインスタンスやCloudFormationスタックについても同様です。
configに設定を追加すれば、削除保護を無視して削除することが可能です。
feature-flags:
  disable-deletion-protection:
    EC2Instance: true
    RDSInstance: true
    CloudformationStack: true
おわりに
aws-nukeで削除保護されたリソースを削除する方法でした。
削除保護が有効化されたリソースに対して以下の挙動になります。
- デフォルトでは削除保護されたリソースは削除されない
- aws-nukeのconfigで削除保護リソースの削除を有効化することで、リソースの削除が可能
他にもaws-nukeに関する記事を書いていますので、良かったら読んでみてください。
以上、AWS事業本部の佐藤(@chari7311)でした。











