aws-nukeで削除保護されたリソース(EC2,RDS,CFnスタック)も削除する方法
「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)でした。