はじめに

弊社と契約をしていただいているお客様がAWSアカウントを解約する時には、お客様にて全てのAWSリソースを削除していただいています。
AWSリソースを1つ1つ削除するのは大変かと思いこの記事を書きました。 手動でポチポチ削除していくのは骨が折れますし、依存関係(VPCが消せない、ENIが残っている等)でハマることも多いです。

そこで今回は、AWSリソースを一括削除できるツール aws-nuke を使って、アカウントを綺麗サッパリ更地にする手順を参考までにまとめています。 今回は、AWS CloudShell 上で実行します。

aws-nuke とは

aws-nuke は、AWSアカウント内のリソースを全削除するためのOSSツールです。 リソース間の依存関係を考慮しながら削除を行ってくれるため、手動削除でありがちな「このSecurity Group、どこかで使われていて消せない…」といったストレスから解放されます。

https://aws-nuke.ekristen.dev/

⚠️ 注意事項

  • 強力な削除:本記事の手順はリソースを強力に削除します。誤って必要なデータ(S3のバックアップやログなど)を削除した場合の復旧は不可能となります。必要なデータは必ずバックアップをした上で自己責任でお願いします。
  • 網羅性について:本記事は一般的な構成を想定しています。AWSには200以上のサービスがあり、特殊な構成やサードパーティ製のサブスクリプション(Marketplace製品やQuickSight等)は、本ツールの対象外、または削除できない場合があります。
  • 最終確認:ツール実行後も、必ずご自身の責任において「リソースが残っていないか」の最終確認をお願いいたします。

前提条件

  • 管理者権限を持つIAMユーザーでマネジメントコンソールにログインできること
  • 対象のアカウント内のリソースが全て消えても問題ないこと
  • AWS CloudShell が利用可能であること

実践手順

ここからは実際にCloudShellを使って削除を行う手順を解説します。

0. 事前準備

0-1.【推奨】S3に大量のデータがある場合

aws-nuke はS3バケットを削除する際、中身のオブジェクトも自動で削除してくれますが、データ量がTB単位であったり、ファイル数が数百万ある場合、ツールの実行に数時間〜数十時間かかり、途中でエラーになる可能性があります。

そのため、S3を多く利用していたアカウントでは、aws-nuke を実行する前日までに、以下のライフサイクルポリシーを設定してバケットを空にしておくことを強く推奨します。

設定内容: バケット内の現行・非現行バージョンを「1日で有効期限切れ」にするライフサイクルルールを作成する。

※データ量が少ない場合はこの手順をスキップして、そのままツールで削除して構いません。

0-2. 組織(Organization)連携・共有リソースの解除(該当する場合のみ)

AWS Organizations(組織)のメンバーアカウントである場合、管理者アカウントによって一元管理されているサービスや、他アカウントから共有されているリソースが存在します。

これらは、たとえAdministrator権限であってもメンバーアカウント側からは削除できない仕様になっているものが多く、そのまま aws-nuke を実行すると「権限不足(AccessDenied)」や「依存関係違反(DependencyViolation)」といったエラーが発生します。
スムーズに削除を行うために、以下のサービスを利用している場合は手動で解除・退出を行ってください。

① セキュリティサービスの連携解除
管理者アカウントと紐付いている場合、自身のコンソールから「関連付けの解除」を行う必要があります。

  • Amazon GuardDuty: [コンソール] > 設定 > 管理アカウント > [関連付けの解除]
  • AWS Security Hub: [コンソール] > 設定 > 全般 > 管理者アカウント > [関連付けの解除]

※ボタンがグレーアウトしている場合 組織の設定により、メンバー側での操作が制限されています。 組織の管理者に連絡し、「管理者アカウント側から、このメンバーアカウントの削除(または関連付け解除)」を依頼してください。管理者へ依頼する際は、以下の公式ドキュメントを共有するとスムーズです。

② 共有リソース (RAM / Transit Gateway) を終了
他アカウントから共有されているリソース(Transit Gateway や VPC Subnet など)は、削除ではなく「共有の終了」が必要です。

AWS Resource Access Manager (RAM):

  1. コンソールで [自分と共有] > [リソース共有] を選択
  2. 対象のリソース共有(Transit Gateway等が含まれるもの)にチェック
  3. [リソース共有の退出 (Leave)] をクリック

1. アカウントエイリアスの設定(必須)

aws-nuke はアカウントエイリアス(別名)が設定されていないと実行できない仕様になっています。 まだ設定していない場合は、IAMダッシュボードから設定しておきます。

  1. IAMコンソールのダッシュボードを開く
  2. 右側の「AWS アカウント」欄にある「作成」をクリック
  3. 任意のエイリアスを入力(例: cloudpack-20251126
    ※このエイリアス名は実行時に必要になるので控えておいてください。

2. CloudShellの起動とaws-nukeのインストール

コンソール右上のアイコンから CloudShell を起動します。 立ち上がったら、以下のコマンドを実行して aws-nuke のバイナリをダウンロード・配置します。
ここでは ekristen/aws-nuke (更新が活発なフォーク版) の最新版を自動的に取得してインストールします。

# 最新のバージョンタグを取得 (CloudShellにはjqが入っているのでそのまま使えます)
NUKE_VERSION=curl -s https://api.github.com/repos/ekristen/aws-nuke/releases/latest | jq -r '.tag_name'

# 最新版をダウンロード
wget https://github.com/ekristen/aws-nuke/releases/download/$NUKE_VERSION/aws-nuke-$NUKE_VERSION-linux-amd64.tar.gz

# 解凍
tar -zxvf aws-nuke-$NUKE_VERSION-linux-amd64.tar.gz

これで準備完了です。

3. 設定ファイル(config.yml)の作成

ここが最重要ステップです。 config.yml というファイルを作成し、削除対象のアカウントや除外設定(ホワイトリスト)を記述します。
vi config.yml で以下の内容を作成します。
123456789012(アカウントID)my-user(自分のユーザー名)はご自身の環境に合わせて書き換えてください。

regions:
  - ap-northeast-1
  - global
  # 必要に応じて他のリージョンも追記してください

account-blocklist:
  - "999999999999"

# 時間がかかるリソースやエラーになりがちな不要サービスを除外
resource-types:
  excludes:
    - S3Object # S3バケットの中身を1つずつ消すと時間がかかるため除外
    # 以下、APIエラーが出やすい非推奨サービス等の除外
    - ServiceCatalogTagOption
    - ServiceCatalogTagOptionPortfolioAttachment
    - RoboMakerDeploymentJob
    - RoboMakerFleet
    - RoboMakerRobot
    - OpsWorksApp
    - OpsWorksInstance
    - CodeStarProject
    - Cloud9Environment

accounts:
  "123456789012": # ★削除対象のAWSアカウントID
    filters:
      # 自身のユーザー名を記載
      IAMUser:
        - "my-user"
      # ポリシーの紐付け(これが消えると権限消失!)
      IAMUserPolicyAttachment:
        - "my-user -> AdministratorAccess"
      # インラインポリシーがある場合
      IAMUserPolicy:
        - "my-user -> MyInlinePolicy"
      # MFAデバイス
      IAMVirtualMFADevice:
        - "arn:aws:iam::123456789012:mfa/my-user"

# 削除保護(Deletion Protection)が有効なリソースも強制的に削除する設定
settings:
  EC2Image:
    IncludeDisabled: true
    IncludeDeprecated: true
    DisableDeregistrationProtection: true
  EC2Instance:
    DisableStopProtection: true
    DisableDeletionProtection: true
  RDSInstance:
    DisableDeletionProtection: true
  CloudFormationStack:
    DisableDeletionProtection: true
  DynamoDBTable:
    DisableDeletionProtection: true

4. ドライラン(Dry Run)で確認

設定ファイルができたら、いきなり削除せずドライランを実行することをおすすめします。 これにより、何が削除され、何が除外されるかを確認できます。

./aws-nuke -c ./config.yml

実行すると大量のログが流れます。 ログの末尾が以下のように表示されていればOKです。

Scan complete: 601 total, 124 nukeable, 477 filtered. The above resources would be deleted with the supplied configuration. Provide --no-dry-run to actually destroy resources.

チェックポイント: ログの中に、自分のIAMユーザー名が含まれていないか確認してください。もし含まれていたら config.yml の記述が間違っています。

5. 削除実行

問題なければ、--no-dry-run オプションを付けて実行します。

./aws-nuke -c ./config.yml --no-dry-run
  1. アカウントエイリアスの入力: 手順1で設定したエイリアスを入力します。(実行すると、2回入力を求められます。)
Do you really want to nuke the account with the ID アカウントID and the alias 'cloudpack-20251126'?
Do you want to continue? Enter account alias to continue.
> cloudpack-20251126

あとは自動的に削除が進みます。 依存関係で削除エラーが出ても、aws-nukeが自動的にリトライして外側のリソースから順に消してくれます。

6. リソースチェック

以下の記事のタグエディタでリソースを一覧チェックできます。 課金対象のリソースが残っている場合は、手動で削除をしてください。
わたしたちの強い味方〜タグエディタ〜

まとめ

これでAWSアカウント内はほぼ更地になります。 CloudShellを使えば手元の環境構築も不要ですし、なにより高速に実行できるのでおすすめです。

最後に、本ツールですべてのリソースが完全に削除されることを保証するものではありません。 解約申請を行う前に、必ずお客様ご自身で確認していただき、意図しないリソースや課金が残っていないことをご確認ください。

また、リソース削除方法で不明な点がございましたらcloudpackサポートへお問い合わせください。