💣

aws-nukeでクラウドを破壊しよう

2024/12/21に公開

terratestで残ったリソースを削除したい人向けかも。

aws-nuke概要

https://github.com/ekristen/aws-nuke
rebuy-de/aws-nuke(Public archive)のフォークプロジェクトです。
ドキュメントはここ
https://ekristen.github.io/aws-nuke/

  • awsリソースを削除するCLIで、デフォルトでdry-runに加え、configで保護対象のアカウントを設定可能
  • サポートしているリソースが多い
  • 今の所ちゃんとメンテされてる
  • --no-dry-runを付けないと削除は実行されない
  • awsアカウントIDにエイリアスが必要

ユースケース

例えば、terratest採用していてDestroyでこけた時にリソースが残ってしまいます。
それを自動で削除したい時とかに使えると思っています。

terratestの開発元であるgruntworkは、テスト内で確実に削除するのではなく残ってしまったリソースを定期削除しています。
https://terratest.gruntwork.io/docs/testing-best-practices/cleanup/

gruntworkはcloud-nukeというツールを使っていますが、サポートしているリソースが少ないです。

config作る時にやったこと

# 削除は実行せず、削除候補と除外対象を出す
aws-nuke nuke --no-alias-check --no-prompt --config config.yaml
# 削除候補のみ見たい
aws-nuke nuke --no-alias-check --no-prompt --config config.yaml |grep 'would remove'

除外リソースの選定

基本的に全リソースを削除する方向でしたが、叩けないAPIがあるとタイムアウトまで待たされるのであらかじめ除外しました。
以下はAdministratorAccessポリシーで見れなかったリソースです。

resource-types:
  excludes:
    - BedrockEvaluationJob
    - BedrockModelCustomizationJob
    - CloudSearchDomain
    - CodeStarProject
    - ElasticTranscoderPreset
    - ElasticTranscoderPipeline
    - FMSNotificationChannel
    - MachineLearningBranchPrediction
    - MachineLearningDataSource
    - MachineLearningEvaluation
    - MachineLearningMLModel
    - OpsWorksApp
    - OpsWorksCMServer
    - OpsWorksCMServerState
    - OpsWorksCMBackup
    - OpsWorksLayer
    - OpsWorksUserProfile
    - OpsWorksInstance
    - OSCollection
    - RoboMakerRobotApplication
    - RoboMakerSimulationJob
    - RoboMakerSimulationApplication
    - RekognitionProject
    - RekognitionDataset
    - RedshiftServerlessNamespace
    - RedshiftServerlessWorkgroup
    - RedshiftServerlessSnapshot
    - ServiceCatalogTagOption
    - ServiceCatalogTagOptionPortfolioAttachment
    - TranscribeLanguageModel

実行ロールの除外

全削除を期待しているので、自分自身のIAMロールも消してしまいます。
こんな感じで特定のリソースにフィルタをかけれます。

# イメージ
accounts:
  012345: 
    filters:
      IAMOpenIDConnectProvider:
        - "hoge"
      IAMRole:
        - "hoge"
      IAMRolePolicy:
        - "hoge"
      IAMRolePolicyAttachment:
        - "hoge"
最終的なconfig
blocklist:
- 12345 # EDIT ME
accounts:
 012345: # EDIT ME
   filters:
     IAMOpenIDConnectProvider:
       - "hoge" # EDIT ME
     IAMRole:
       - "hoge" # EDIT ME
     IAMRolePolicy:
       - "hoge" # EDIT ME
     IAMRolePolicyAttachment:
       - "hoge" # EDIT ME
regions:
- all
resource-types:
 excludes:
   - BedrockEvaluationJob
   - BedrockModelCustomizationJob
   - CloudSearchDomain
   - CodeStarProject
   - ElasticTranscoderPreset
   - ElasticTranscoderPipeline
   - FMSNotificationChannel
   - MachineLearningBranchPrediction
   - MachineLearningDataSource
   - MachineLearningEvaluation
   - MachineLearningMLModel
   - OpsWorksApp
   - OpsWorksCMServer
   - OpsWorksCMServerState
   - OpsWorksCMBackup
   - OpsWorksLayer
   - OpsWorksUserProfile
   - OpsWorksInstance
   - OSCollection
   - RoboMakerRobotApplication
   - RoboMakerSimulationJob
   - RoboMakerSimulationApplication
   - RekognitionProject
   - RekognitionDataset
   - RedshiftServerlessNamespace
   - RedshiftServerlessWorkgroup
   - RedshiftServerlessSnapshot
   - ServiceCatalogTagOption
   - ServiceCatalogTagOptionPortfolioAttachment
   - TranscribeLanguageModel

注意点

  • terratest専用のアカウントがあると、aws-nukeのconfigを育てる必要がないです
  • cloud-nukeを使うなら確認はあるものの、デフォルトで削除する挙動

Discussion