Destroy AWS resources: Cloud-Nuke or AWS-Nuke?
So you’re working on a development account, and Terraform is stuck in a cycle, not allowing you to easily destroy the remaining resources? Enter the world of nuke CLIs !
cloud-nuke
At the time of writing, I used version v0.1.16
From Gruntwork, written in Go, will not destroy as many objects as aws-nuke; has been around since May 2017
If you’re using ~/.aws/credentials
, choose (wisely!) the account alias (myenv-dev
in my case) in there and then:
AWS_PROFILE=myenv-dev ~/Downloads/cloud-nuke_darwin_amd64 aws
But actually, you’ll probably want to narrow the scope down to a single region; so you’d have to specify it in the command line:
AWS_PROFILE=myenv-dev ~/Downloads/cloud-nuke_darwin_amd64 aws --region=eu-west-1
If you call it with the list argument, aws --list-resource-types
you’ll get a list of what resources are supported for deletion:
ami asg ebs ec2 ecsserv eip ekscluster elb elbv2 lc rds snap
aws-nuke
At the time of writing, I used version v2.14.0
From rebuy.de, written in Ruby, will destroy many objects, if not all, supports filters, requires a config file; has been around since June 2016.
You’ll need to provide a config file; a minimal one can be something like this nuke.yml
file
regions: - eu-west-1 - global # for resources not bound to a specific region, such as Route53 zones for example account-blacklist: - "111222333444" # production accounts: "999888777666": {} # aws-nuke-example
If you’re using ~/.aws/credentials
, choose (wisely!) the account alias (myenv-dev
in my case) in there and then:
AWS_PROFILE=myenv-dev ~/Downloads/aws-nuke-v2.14.0-darwin-amd64 --config nuke.yml
If you call it with the list argument, resource-types
, you’ll get a list of what resources are supported for deletion:
ACMCertificate ACMPCACertificateAuthority ACMPCACertificateAuthorityState APIGatewayAPIKey APIGatewayClientCertificate APIGatewayDomainName APIGatewayRestAPI APIGatewayUsagePlan APIGatewayVpcLink AWSBackupPlan AWSBackupRecoveryPoint AWSBackupSelection AWSBackupVault AppStreamDirectoryConfig AppStreamFleet AppStreamFleetState AppStreamImage AppStreamImageBuilder AppStreamImageBuilderWaiter AppStreamStack AppStreamStackFleetAttachment AutoScalingGroup AutoScalingPlansScalingPlan BatchComputeEnvironment BatchComputeEnvironmentState BatchJobQueue BatchJobQueueState Cloud9Environment CloudDirectoryDirectory CloudDirectorySchema CloudFormationStack CloudFrontDistribution CloudFrontDistributionDeployment CloudHSMV2Cluster CloudHSMV2ClusterHSM CloudSearchDomain CloudTrailTrail CloudWatchAlarm CloudWatchDashboard CloudWatchEventsRule CloudWatchEventsTarget CloudWatchLogsDestination CloudWatchLogsLogGroup CodeBuildProject CodeCommitRepository CodeDeployApplication CodePipelinePipeline CodeStarProject CognitoIdentityPool CognitoUserPool CognitoUserPoolDomain ConfigServiceConfigRule ConfigServiceConfigurationRecorder ConfigServiceDeliveryChannel DAXCluster DAXParameterGroup DAXSubnetGroup DataPipelinePipeline DatabaseMigrationServiceCertificate DatabaseMigrationServiceEndpoint DatabaseMigrationServiceEventSubscription DatabaseMigrationServiceReplicationInstance DatabaseMigrationServiceReplicationTask DatabaseMigrationServiceSubnetGroup DeviceFarmProject DirectoryServiceDirectory DynamoDBTable DynamoDBTableItem EC2Address EC2ClientVpnEndpoint EC2ClientVpnEndpointAttachment EC2CustomerGateway EC2DHCPOption EC2Image EC2Instance EC2InternetGateway EC2InternetGatewayAttachment EC2KeyPair EC2LaunchTemplate EC2NATGateway EC2NetworkACL EC2NetworkInterface EC2PlacementGroup EC2RouteTable EC2SecurityGroup EC2Snapshot EC2SpotFleetRequest EC2Subnet EC2TGW EC2TGWAttachment EC2VPC EC2VPCEndpoint EC2VPCEndpointServiceConfiguration EC2VPCPeeringConnection EC2VPNConnection EC2VPNGateway EC2VPNGatewayAttachment EC2Volume ECRRepository ECSCluster ECSClusterInstance ECSService ECSTaskDefinition EFSFileSystem EFSMountTarget EKSCluster ELB ELBv2 ELBv2TargetGroup EMRCluster EMRSecurityConfiguration ESDomain ElasticBeanstalkApplication ElasticBeanstalkEnvironment ElasticTranscoderPipeline ElasticacheCacheCluster ElasticacheReplicationGroup ElasticacheSubnetGroup FSxBackup FSxFileSystem FirehoseDeliveryStream GlueClassifier GlueConnection GlueCrawler GlueDatabase GlueDevEndpoint GlueJob GlueTrigger IAMGroup IAMGroupPolicy IAMGroupPolicyAttachment IAMInstanceProfile IAMInstanceProfileRole IAMLoginProfile IAMOpenIDConnectProvider IAMPolicy IAMRole IAMRolePolicy IAMRolePolicyAttachment IAMSAMLProvider IAMServerCertificate IAMServiceSpecificCredential IAMUser IAMUserAccessKey IAMUserGroupAttachment IAMUserPolicy IAMUserPolicyAttachment IAMVirtualMFADevice IoTAuthorizer IoTCACertificate IoTCertificate IoTJob IoTOTAUpdate IoTPolicy IoTRoleAlias IoTStream IoTThing IoTThingGroup IoTThingType IoTThingTypeState IoTTopicRule KMSAlias KMSKey KinesisAnalyticsApplication KinesisStream KinesisVideoProject LambdaEventSourceMapping LambdaFunction LaunchConfiguration LifecycleHook LightsailDisk LightsailDomain LightsailInstance LightsailKeyPair LightsailLoadBalancer LightsailStaticIP MQBroker MSKCluster MachineLearningBranchPrediction MachineLearningDataSource MachineLearningEvaluation MachineLearningMLModel MediaConvertJobTemplate MediaConvertPreset MediaConvertQueue MediaLiveChannel MediaLiveInput MediaLiveInputSecurityGroup MediaPackageChannel MediaPackageOriginEndpoint MediaStoreContainer MediaStoreDataItems MediaTailorConfiguration MobileProject NeptuneCluster NeptuneInstance NetpuneSnapshot OpsWorksApp OpsWorksCMBackup OpsWorksCMServer OpsWorksCMServerState OpsWorksInstance OpsWorksLayer OpsWorksUserProfile RDSDBCluster RDSDBClusterParameterGroup RDSDBParameterGroup RDSDBSubnetGroup RDSInstance RDSSnapshot RedshiftCluster RedshiftParameterGroup RedshiftSnapshot RedshiftSubnetGroup RekognitionCollection ResourceGroupGroup RoboMakerDeploymentJob RoboMakerFleet RoboMakerRobot RoboMakerRobotApplication RoboMakerSimulationApplication RoboMakerSimulationJob Route53HostedZone Route53ResourceRecordSet S3Bucket S3MultipartUpload S3Object SESConfigurationSet SESIdentity SESReceiptFilter SESReceiptRuleSet SESTemplate SFNStateMachine SNSEndpoint SNSPlatformApplication SNSSubscription SNSTopic SQSQueue SSMActivation SSMAssociation SSMDocument SSMMaintenanceWindow SSMParameter SSMPatchBaseline SSMResourceDataSync SageMakerEndpoint SageMakerEndpointConfig SageMakerModel SageMakerNotebookInstance SageMakerNotebookInstanceState SecretsManagerSecret ServiceCatalogConstraintPortfolioAttachment ServiceCatalogPortfolio ServiceCatalogPortfolioProductAttachment ServiceCatalogPortfolioShareAttachment ServiceCatalogPrincipalPortfolioAttachment ServiceCatalogProduct ServiceCatalogProvisionedProduct ServiceCatalogTagOption ServiceCatalogTagOptionPortfolioAttachment ServiceDiscoveryInstance ServiceDiscoveryNamespace ServiceDiscoveryService SimpleDBDomain StorageGatewayFileShare StorageGatewayGateway StorageGatewayTape StorageGatewayVolume WAFRegionalByteMatchSet WAFRegionalByteMatchSetIP WAFRegionalIPSet WAFRegionalIPSetIP WAFRegionalRateBasedRule WAFRegionalRateBasedRulePredicate WAFRegionalRegexMatchSet WAFRegionalRegexMatchTuple WAFRegionalRegexPatternSet WAFRegionalRegexPatternString WAFRegionalRule WAFRegionalRulePredicate WAFRegionalWebACL WAFRegionalWebACLRuleAttachment WAFRule WAFWebACL WAFWebACLRuleAttachment WorkLinkFleet WorkSpacesWorkspace
Conclusion
Well, if you need to delete everything
and be able to filter some resources out, then I guess aws-nuke
is the way to go!
Published on Java Code Geeks with permission by Anthony Dahanne, partner at our JCG program. See the original article here: Destroy AWS resources: Cloud-Nuke or AWS-Nuke? Opinions expressed by Java Code Geeks contributors are their own. |
It is nearly 3 years since this was written. It would be very much worthwhile to have an updated version.