aws-nukeで削除保護されたリソース(EC2,RDS,CFnスタック)も削除する方法

2023.01.10

この記事は公開されてから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でコンテナを分けています。

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が削除保護が有効化されていることを確認します。 DisableApiTerminationtrueになっているため、削除保護は有効化されています。

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)でした。

あわせて読みたい記事