「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でコンテナを分けています。
docker-compose.yml
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
に該当の設定を追加します。
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に設定を追加すれば、削除保護を無視して削除することが可能です。
nuke-config.yml
feature-flags:
disable-deletion-protection:
EC2Instance: true
RDSInstance: true
CloudformationStack: true
おわりに
aws-nukeで削除保護されたリソースを削除する方法でした。
削除保護が有効化されたリソースに対して以下の挙動になります。
- デフォルトでは削除保護されたリソースは削除されない
- aws-nukeのconfigで削除保護リソースの削除を有効化することで、リソースの削除が可能
他にもaws-nukeに関する記事を書いていますので、良かったら読んでみてください。
以上、AWS事業本部の佐藤(@chari7311)でした。