警告
此 aws-nuke 存储库不再得到积极维护。我们建议用户切换到该项目在 ekristen/aws-nuke 上积极维护的分支。我们感谢在该项目整个生命周期中获得的所有支持和贡献。我们相信,该分支将继续提供您期望从 aws-nuke 获得的功能和支持。请注意,此弃用意味着我们将不会解决问题、接受拉取请求或从此存储库发布未来版本。感谢您的理解和支持。
从 AWS 账户中删除所有资源。
开发状态aws-nuke很稳定,但很可能并未涵盖所有 AWS 资源。鼓励添加缺少的资源并创建 Pull 请求或创建问题。
请注意, aws-nuke是一种破坏性很强的工具,因此在使用它时必须非常小心。否则您可能会删除生产数据。
我们强烈建议您不要在任何 AWS 账户上运行此应用程序,因为您无法承担失去所有资源的后果。
为了减少事故的爆炸半径,有一些安全预防措施:
--no-dry-run
才能实际删除资源。prod
。该字符串是硬编码的,建议将其添加到每个实际生产帐户(例如mycompany-production-ecr
)。如果您有任何改进安全程序的想法,请随意创建问题。
一旦足够的更改汇集在一起并经过一段时间的测试,我们通常会发布一个新版本。
您可以在发布页面上找到 Linux、macOS 和 Windows 二进制文件,但我们还在 quay.io/rebuy/aws-nuke 和 docker.io/rebuy/aws-nuke 上提供容器化版本。两者均可用于多种架构(amd64、arm64 和 armv7)。
首先,您需要为aws-nuke创建一个配置文件。这是一个最小的:
regions :
- eu-west-1
- global
account-blocklist :
- " 999999999999 " # production
accounts :
" 000000000000 " : {} # aws-nuke-example
通过此配置,我们可以运行aws-nuke :
$ aws-nuke -c config/nuke-config.yml --profile aws-nuke-example
aws-nuke version v1.0.39.gc2f318f - Fri Jul 28 16:26:41 CEST 2017 - c2f318f37b7d2dec0e646da3d4d05ab5296d5bce
Do you really want to nuke the account with the ID 000000000000 and the alias 'aws-nuke-example'?
Do you want to continue? Enter account alias to continue.
> aws-nuke-example
eu-west-1 - EC2DHCPOption - 'dopt-bf2ec3d8' - would remove
eu-west-1 - EC2Instance - 'i-01b489457a60298dd' - would remove
eu-west-1 - EC2KeyPair - 'test' - would remove
eu-west-1 - EC2NetworkACL - 'acl-6482a303' - cannot delete default VPC
eu-west-1 - EC2RouteTable - 'rtb-ffe91e99' - would remove
eu-west-1 - EC2SecurityGroup - 'sg-220e945a' - cannot delete group 'default'
eu-west-1 - EC2SecurityGroup - 'sg-f20f958a' - would remove
eu-west-1 - EC2Subnet - 'subnet-154d844e' - would remove
eu-west-1 - EC2Volume - 'vol-0ddfb15461a00c3e2' - would remove
eu-west-1 - EC2VPC - 'vpc-c6159fa1' - would remove
eu-west-1 - IAMUserAccessKey - 'my-user -> ABCDEFGHIJKLMNOPQRST' - would remove
eu-west-1 - IAMUserPolicyAttachment - 'my-user -> AdministratorAccess' - [UserName: "my-user", PolicyArn: "arn:aws:iam::aws:policy/AdministratorAccess", PolicyName: "AdministratorAccess"] - would remove
eu-west-1 - IAMUser - 'my-user' - would remove
Scan complete: 13 total, 11 nukeable, 2 filtered.
Would delete these resources. Provide --no-dry-run to actually destroy resources.
正如我们所看到的, aws-nuke仅列出所有找到的资源并退出。这是因为缺少--no-dry-run
标志。它还想删除管理员。我们不想这样做,因为我们使用此用户来访问我们的帐户。因此我们必须扩展配置,使其忽略该用户:
regions :
- eu-west-1
account-blocklist :
- " 999999999999 " # production
accounts :
" 000000000000 " : # aws-nuke-example
filters :
IAMUser :
- " my-user "
IAMUserPolicyAttachment :
- " my-user -> AdministratorAccess "
IAMUserAccessKey :
- " my-user -> ABCDEFGHIJKLMNOPQRST "
$ aws-nuke -c config/nuke-config.yml --profile aws-nuke-example --no-dry-run
aws-nuke version v1.0.39.gc2f318f - Fri Jul 28 16:26:41 CEST 2017 - c2f318f37b7d2dec0e646da3d4d05ab5296d5bce
Do you really want to nuke the account with the ID 000000000000 and the alias 'aws-nuke-example'?
Do you want to continue? Enter account alias to continue.
> aws-nuke-example
eu-west-1 - EC2DHCPOption - 'dopt-bf2ec3d8' - would remove
eu-west-1 - EC2Instance - 'i-01b489457a60298dd' - would remove
eu-west-1 - EC2KeyPair - 'test' - would remove
eu-west-1 - EC2NetworkACL - 'acl-6482a303' - cannot delete default VPC
eu-west-1 - EC2RouteTable - 'rtb-ffe91e99' - would remove
eu-west-1 - EC2SecurityGroup - 'sg-220e945a' - cannot delete group 'default'
eu-west-1 - EC2SecurityGroup - 'sg-f20f958a' - would remove
eu-west-1 - EC2Subnet - 'subnet-154d844e' - would remove
eu-west-1 - EC2Volume - 'vol-0ddfb15461a00c3e2' - would remove
eu-west-1 - EC2VPC - 'vpc-c6159fa1' - would remove
eu-west-1 - IAMUserAccessKey - 'my-user -> ABCDEFGHIJKLMNOPQRST' - filtered by config
eu-west-1 - IAMUserPolicyAttachment - 'my-user -> AdministratorAccess' - [UserName: "my-user", PolicyArn: "arn:aws:iam::aws:policy/AdministratorAccess", PolicyName: "AdministratorAccess"] - would remove
eu-west-1 - IAMUser - 'my-user' - filtered by config
Scan complete: 13 total, 8 nukeable, 5 filtered.
Do you really want to nuke these resources on the account with the ID 000000000000 and the alias 'aws-nuke-example'?
Do you want to continue? Enter account alias to continue.
> aws-nuke-example
eu-west-1 - EC2DHCPOption - 'dopt-bf2ec3d8' - failed
eu-west-1 - EC2Instance - 'i-01b489457a60298dd' - triggered remove
eu-west-1 - EC2KeyPair - 'test' - triggered remove
eu-west-1 - EC2RouteTable - 'rtb-ffe91e99' - failed
eu-west-1 - EC2SecurityGroup - 'sg-f20f958a' - failed
eu-west-1 - EC2Subnet - 'subnet-154d844e' - failed
eu-west-1 - EC2Volume - 'vol-0ddfb15461a00c3e2' - failed
eu-west-1 - EC2VPC - 'vpc-c6159fa1' - failed
eu-west-1 - S3Object - 's3://rebuy-terraform-state-138758637120/run-terraform.lock' - triggered remove
Removal requested: 2 waiting, 6 failed, 5 skipped, 0 finished
eu-west-1 - EC2DHCPOption - 'dopt-bf2ec3d8' - failed
eu-west-1 - EC2Instance - 'i-01b489457a60298dd' - waiting
eu-west-1 - EC2KeyPair - 'test' - removed
eu-west-1 - EC2RouteTable - 'rtb-ffe91e99' - failed
eu-west-1 - EC2SecurityGroup - 'sg-f20f958a' - failed
eu-west-1 - EC2Subnet - 'subnet-154d844e' - failed
eu-west-1 - EC2Volume - 'vol-0ddfb15461a00c3e2' - failed
eu-west-1 - EC2VPC - 'vpc-c6159fa1' - failed
Removal requested: 1 waiting, 6 failed, 5 skipped, 1 finished
--- truncating long output ---
正如您所看到的, aws-nuke现在尝试删除所有未过滤的资源,而不关心它们之间的依赖关系。这会导致 API 错误,可以忽略。如果这些错误持续出现,则会在aws-nuke运行结束时显示。
aws-nuke会重试删除所有资源,直到删除所有指定的资源或直到只剩下有错误的资源。
有两种方法可以验证aws-nuke 。有静态凭证和配置文件。后一个可以在共享凭证文件(即~/.aws/credentials
)或共享配置文件(即~/.aws/config
)中配置。
要使用静态凭据,需要命令行标志--access-key-id
和--secret-access-key
。仅临时会话需要标志--session-token
。
要使用共享配置文件,需要命令行标志--profile
。配置文件必须使用共享凭据文件中的静态凭据或具有代入角色的共享配置文件中定义。
可以将 aws-nuke 配置为针对非默认 AWS 端点运行。它可用于指向本地端点(例如 S3 设备或 Stratoscale 集群)的集成测试。
要将 aws-nuke 配置为使用自定义终端节点,请添加配置指令,如以下示例所示:
regions :
- demo10
# inspired by https://www.terraform.io/docs/providers/aws/guides/custom-service-endpoints.html
endpoints :
- region : demo10
tls_insecure_skip_verify : true
services :
- service : ec2
url : https://10.16.145.115/api/v2/aws/ec2
- service : s3
url : https://10.16.145.115:1060
- service : rds
url : https://10.16.145.115/api/v2/aws/rds
- service : elbv2
url : https://10.16.145.115/api/v2/aws/elbv2
- service : efs
url : https://10.16.145.115/api/v2/aws/efs
- service : emr
url : https://10.16.145.115/api/v2/aws/emr
- service : autoscaling
url : https://10.16.145.115/api/v2/aws/autoscaling
- service : cloudwatch
url : https://10.16.145.115/api/v2/aws/cloudwatch
- service : sns
url : https://10.16.145.115/api/v2/aws/sns
- service : iam
url : https://10.16.145.115/api/v2/aws/iam
- service : acm
url : https://10.16.145.115/api/v2/aws/acm
account-blocklist :
- " account-id-of-custom-region-prod " # production
accounts :
" account-id-of-custom-region-demo10 " :
然后可以按如下方式使用:
$ aws-nuke -c config/my.yaml --access-key-id --secret-access-key --default-region demo10
aws-nuke version v2.11.0.2.gf0ad3ac.dirty - Tue Nov 26 19:15:12 IST 2019 - f0ad3aca55eb66b93b88ce2375f8ad06a7ca856f
Do you really want to nuke the account with the ID account-id-of-custom-region-demo10 and the alias 'account-id-of-custom-region-demo10'?
Do you want to continue? Enter account alias to continue.
> account-id-of-custom-region-demo10
demo10 - EC2Volume - vol-099aa1bb08454fd5bc3499897f175fd8 - [tag:Name: "volume_of_5559b38e-0a56-4078-9a6f-eb446c21cadf"] - would remove
demo10 - EC2Volume - vol-11e9b09c71924354bcb4ee77e547e7db - [tag:Name: "volume_of_e4f8c806-0235-4578-8c08-dce45d4c2952"] - would remove
demo10 - EC2Volume - vol-1a10cb3f3119451997422c435abf4275 - [tag:Name: "volume-dd2e4c4a"] - would remove
demo10 - EC2Volume - vol-1a2e649df1ef449686ef8771a078bb4e - [tag:Name: "web-server-5"] - would remove
demo10 - EC2Volume - vol-481d09bbeb334ec481c12beee6f3012e - [tag:Name: "volume_of_15b606ce-9dcd-4573-b7b1-4329bc236726"] - would remove
demo10 - EC2Volume - vol-48f6bd2bebb945848b029c80b0f2de02 - [tag:Name: "Data volume for 555e9f8a"] - would remove
demo10 - EC2Volume - vol-49f0762d84f0439da805d11b6abc1fee - [tag:Name: "Data volume for acb7f3a5"] - would remove
demo10 - EC2Volume - vol-4c34656f823542b2837ac4eaff64762b - [tag:Name: "wpdb"] - would remove
demo10 - EC2Volume - vol-875f091078134fee8d1fe3b1156a4fce - [tag:Name: "volume-f1a7c95f"] - would remove
demo10 - EC2Volume - vol-8776a0d5bd4e4aefadfa8038425edb20 - [tag:Name: "web-server-6"] - would remove
demo10 - EC2Volume - vol-8ed468bfab0b42c3bc617479b8f33600 - [tag:Name: "web-server-3"] - would remove
demo10 - EC2Volume - vol-94e0370b6ab54f03822095d74b7934b2 - [tag:Name: "web-server-2"] - would remove
demo10 - EC2Volume - vol-9ece34dfa7f64dd583ab903a1273340c - [tag:Name: "volume-4ccafc2e"] - would remove
demo10 - EC2Volume - vol-a3fb3e8800c94452aff2fcec7f06c26b - [tag:Name: "web-server-0"] - would remove
demo10 - EC2Volume - vol-a53954e17cb749a283d030f26bbaf200 - [tag:Name: "volume-5484e330"] - would remove
demo10 - EC2Volume - vol-a7afe64f4d0f4965a6703cc0cfab2ba4 - [tag:Name: "Data volume for f1a7c95f"] - would remove
demo10 - EC2Volume - vol-d0bc3f2c887f4072a9fda0b8915d94c1 - [tag:Name: "physical_volume_of_39c29f53-eac4-4f02-9781-90512cc7c563"] - would remove
demo10 - EC2Volume - vol-d1f066d8dac54ae59d087d7e9947e8a9 - [tag:Name: "Data volume for 4ccafc2e"] - would remove
demo10 - EC2Volume - vol-d9adb3f084cd4d588baa08690349b1f9 - [tag:Name: "volume_of_84854c9b-98aa-4f5b-926a-38b3398c3ad2"] - would remove
demo10 - EC2Volume - vol-db42e471b19f42b7835442545214bc1a - [tag:Name: "lb-tf-lb-20191126090616258000000002"] - would remove
demo10 - EC2Volume - vol-db80932fb47243efa67c9dd34223c647 - [tag:Name: "web-server-5"] - would remove
demo10 - EC2Volume - vol-dbea1d1083654d30a43366807a125aed - [tag:Name: "volume-555e9f8a"] - would remove
--- truncating long output ---
aws-nuke删除了大量资源,并且在任何版本中都可能会添加更多资源。最终,所有资源都应该被删除。您可能想要限制要删除的资源。有多种方法可以配置此功能。
一种方法是过滤器,这已经提到过。这需要知道每个资源的标识符。还可以通过两种方法防止整个资源类型(例如S3Bucket
)被删除。
--target
标志将核攻击限制为指定的资源类型。--exclude
标志可防止对指定资源类型进行核武器攻击。还可以在配置文件中配置资源类型,如以下示例所示:
---
regions:
- "eu-west-1"
account-blocklist:
- 1234567890
resource-types:
# only nuke these three resources
targets:
- S3Object
- S3Bucket
- IAMRole
accounts:
555133742: {}
---
regions:
- "eu-west-1"
account-blocklist:
- 1234567890
resource-types:
# don't nuke IAM users
excludes:
- IAMUser
accounts:
555133742: {}
如果在多个位置指定目标(例如 CLI 和特定于帐户),则必须在所有位置指定资源类型。换句话说,每个配置都会限制之前的配置。
如果使用排除,则不会删除其所有资源类型。
提示:您可以使用以下命令查看所有可用的资源类型:
aws-nuke resource-types
此功能尚未发布,可能是
v2.18
的一部分。
aws-nuke支持通过 AWS Cloud Control API 删除资源。执行aws-nuke时,它将通过云控制自动删除一组手动管理的资源。
仅云控制支持的资源的子集将被自动删除,因为可能存在已实现的资源,并且添加它们也会绕过用户配置中的现有过滤器,因为云控制具有另一个命名方案和一组不同的属性。此外,还有一些需要特殊处理的云控制资源,而aws-nuke尚不支持这些资源。
即使自动支持的云控制资源的子集有限,您也可以配置aws-nuke以使其尝试任何其他资源。通过命令行标志或通过配置文件。
对于配置文件,您必须将资源添加到resource-types.cloud-control
列表中:
resource-types :
cloud-control :
- AWS::EC2::TransitGateway
- AWS::EC2::VPC
如果您想使用命令行,则必须为要添加的每个资源添加--cloud-control
标志:
aws-nuke
-c nuke-config.yaml
--cloud-control AWS::EC2::TransitGateway
--cloud-control AWS::EC2::VPC
注意:有些资源受 Cloud Control 支持,并且已由aws-nuke原生实现。如果您配置对这些资源使用 Cloud Control,它将不会执行该资源的本机实现的代码。例如,使用--cloud-control AWS::EC2::VPC
时,它将不会使用EC2VPC
资源。
有一些功能是相当自以为是的。为了让这些功能适用于所有人, aws-nuke提供了手动启用这些功能的标志。这些可以在配置的根级别进行配置,如下所示:
---
feature-flags :
disable-deletion-protection :
RDSInstance : true
EC2Instance : true
CloudformationStack : true
force-delete-lightsail-addons : true
过滤这一点对于不删除当前用户或对于像 S3 Bucket 这样具有全局共享命名空间并且可能难以重新创建的资源来说很重要。目前过滤是基于资源标识符的。该标识符将作为aws-nuke的第一步打印(例如,对于 EC2 实例为i-01b489457a60298dd
)。
注意:即使使用过滤器,您也不应该在任何 AWS 账户上运行 aws-nuke,因为您无法承担丢失所有资源的后果。过滤器配置很容易出错。此外,由于 aws-nuke 处于持续开发阶段,因此无论我们如何仔细审查新代码,总是有可能引入新的错误。
过滤器是特定于帐户的配置的一部分,并按资源类型分组。这是删除除admin
用户及其访问权限和两个访问密钥之外的所有资源的配置示例:
---
regions :
- global
- eu-west-1
account-blocklist :
- 1234567890
accounts :
0987654321 :
filters :
IAMUser :
- " admin "
IAMUserPolicyAttachment :
- " admin -> AdministratorAccess "
IAMUserAccessKey :
- " admin -> AKSDAFRETERSDF "
- " admin -> AFGDSGRTEWSFEY "
资源标识符与列表中任何过滤器完全匹配的任何资源都将被跳过。这些将在aws-nuke运行时标记为“按配置过滤”。
某些资源支持通过属性进行过滤。当资源支持这些属性时,它们将在输出中列出,如下例所示:
global - IAMUserPolicyAttachment - 'admin -> AdministratorAccess' - [RoleName: "admin", PolicyArn: "arn:aws:iam::aws:policy/AdministratorAccess", PolicyName: "AdministratorAccess"] - would remove
要使用属性,需要指定具有properties
和value
对象,而不是纯字符串。
这些类型可用于简化配置。例如,可以保护单个用户的所有访问密钥:
IAMUserAccessKey :
- property : UserName
value : " admin "
除了完全匹配之外,还有其他比较类型:
exact
– 标识符必须与给定字符串完全匹配。这是默认设置。contains
– 标识符必须包含给定的字符串。glob
– 标识符必须与给定的 glob 模式匹配。这意味着该字符串可能包含通配符,例如*
和?
。请注意,通配符是为文件路径设计的,因此通配符与目录分隔符 ( /
) 不匹配。有关 glob 模式的详细信息可以在库文档中找到。regex
– 标识符必须与给定的正则表达式匹配。有关语法的详细信息可以在库文档中找到。dateOlderThan
- 标识符被解析为时间戳。添加偏移量后(在value
字段中指定),生成的时间戳必须在当前时间之后。有关偏移语法的详细信息可以在库文档中找到。支持的日期格式为纪元时间、 2006-01-02
、 2006/01/02
、 2006-01-02T15:04:05Z
、 2006-01-02T15:04:05.999999999Z07:00
和2006-01-02T15:04:05Z07:00
。要使用非默认比较类型,需要指定具有type
和value
对象,而不是纯字符串。
这些类型可用于简化配置。例如,可以使用glob
保护单个用户的所有访问密钥:
IAMUserAccessKey :
- type : glob
value : " admin -> * "
也可以一起使用过滤器属性和过滤器类型。例如,要保护特定 TLD 的所有托管区域:
Route53HostedZone :
- property : Name
type : glob
value : " *.rebuy.cloud. "
任何过滤器结果都可以使用invert: true
反转,例如:
CloudFormationStack :
- property : Name
value : " foo "
invert : true
在这种情况下,除名为“foo”的 CloudFormationStack之外的任何CloudFormationStack 都将被过滤。请注意, aws-nuke在内部获取每个资源并对其应用每个过滤器。如果过滤器匹配,则将节点标记为已过滤。
某些过滤器在多个帐户中可能是相同的。如果使用像 Terraform 这样的配置工具或者 IAM 资源遵循相同的模式,这种情况尤其可能发生。
对于这种情况, aws-nuke支持可应用于多个账户的过滤器预设。配置可能如下所示:
---
regions :
- " global "
- " eu-west-1 "
account-blocklist :
- 1234567890
accounts :
555421337 :
presets :
- " common "
555133742 :
presets :
- " common "
- " terraform "
555134237 :
presets :
- " common "
- " terraform "
filters :
EC2KeyPair :
- " notebook "
presets :
terraform :
filters :
S3Bucket :
- type : glob
value : " my-statebucket-* "
DynamoDBTable :
- " terraform-lock "
common :
filters :
IAMRole :
- " OrganizationAccountAccessRole "
brew install aws-nuke
最简单的安装方法是从 GitHub 下载最新版本。
下载并解压$ wget -c https://github.com/rebuy-de/aws-nuke/releases/download/v2.25.0/aws-nuke-v2.25.0-linux-amd64.tar.gz -O - | tar -xz -C $HOME/bin
运行$ aws-nuke-v2.25.0-linux-amd64
要从源代码编译aws-nuke,您需要一个有效的 Golang 开发环境。源必须克隆到$GOPATH/src/github.com/rebuy-de/aws-nuke
。
您还需要安装 golint 和 GNU Make。
然后,您只需运行make build
将二进制文件编译到项目目录中或make install
go install aws-nuke到$GOPATH/bin
中。使用make xc
您可以为其他平台交叉编译aws-nuke 。
您可以使用如下命令通过 Docker 运行aws-nuke :
$ docker run
--rm -it
-v /full-path/to/nuke-config.yml:/home/aws-nuke/config.yml
-v /home/user/.aws:/home/aws-nuke/.aws
quay.io/rebuy/aws-nuke:v2.25.0
--profile default
--config /home/aws-nuke/config.yml
为了使其正常工作,您需要调整 AWS 配置和aws-nuke配置的路径。
您还需要指定正确的 AWS 配置文件。您可以使用--access-key-id
和--secret-access-key
标志,而不是挂载 AWS 目录。
确保您在图像标签中使用最新版本。或者,您可以使用main
来获取最新的开发版本,但请注意,这很可能随时中断。
要对aws-nuke进行单元测试,某些测试需要 gomock 才能运行。这将通过go generate ./...
运行,但通过make test
自动运行。要运行单元测试:
make test
请随意为任何错误报告或功能请求创建 GitHub 问题。请使用我们的邮件列表来提问:[email protected]。您还可以在邮件列表存档中搜索是否有人已经遇到相同的问题:https://groups.google.com/d/forum/aws-nuke
您可以通过分叉此存储库、进行更改并针对我们的存储库创建拉取请求来为aws-nuke做出贡献。如果您不确定如何解决问题或对贡献有其他疑问,请创建 GitHub 问题。