From ee06e2ccf68d169f0ee7c70f203146d649ee08e7 Mon Sep 17 00:00:00 2001 From: Sean Stoops Date: Mon, 24 Apr 2023 16:48:07 -0700 Subject: [PATCH 001/135] Added an ECSTasks module to handle standalone fargate tasks which are not auto-removed by the deletion of an ECS Service. --- resources/ecs-tasks.go | 109 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 resources/ecs-tasks.go diff --git a/resources/ecs-tasks.go b/resources/ecs-tasks.go new file mode 100644 index 00000000..a1b9d93b --- /dev/null +++ b/resources/ecs-tasks.go @@ -0,0 +1,109 @@ +package resources + +import ( + "fmt" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/ecs" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type ECSTask struct { + svc *ecs.ECS + taskARN *string + clusterARN *string +} + +func init() { + register("ECSTask", ListECSTasks) +} + +func ListECSTasks(sess *session.Session) ([]Resource, error) { + svc := ecs.New(sess) + resources := []Resource{} + clusters := []*string{} + + clusterParams := &ecs.ListClustersInput{ + MaxResults: aws.Int64(100), + } + + // Discover all clusters + for { + output, err := svc.ListClusters(clusterParams) + if err != nil { + return nil, err + } + + for _, clusterArn := range output.ClusterArns { + clusters = append(clusters, clusterArn) + } + + if output.NextToken == nil { + break + } + + clusterParams.NextToken = output.NextToken + } + + // Discover all running tasks from all clusters + for _, clusterArn := range clusters { + taskParams := &ecs.ListTasksInput{ + Cluster: clusterArn, + MaxResults: aws.Int64(10), + DesiredStatus: aws.String("RUNNING"), + } + output, err := svc.ListTasks(taskParams) + if err != nil { + return nil, err + } + + for _, taskArn := range output.TaskArns { + resources = append(resources, &ECSTask{ + svc: svc, + taskARN: taskArn, + clusterARN: clusterArn, + }) + } + + if output.NextToken == nil { + continue + } + + taskParams.NextToken = output.NextToken + } + + return resources, nil +} + +func (t *ECSTask) Filter() error { + return nil +} + +func (t *ECSTask) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("TaskARN", t.taskARN) + properties.Set("ClusterARN", t.clusterARN) + + return properties +} + +func (t *ECSTask) Remove() error { + // When StopTask is called on a task, the equivalent of docker stop is issued to the + // containers running in the task. This results in a SIGTERM value and a default + // 30-second timeout, after which the SIGKILL value is sent and the containers are + // forcibly stopped. If the container handles the SIGTERM value gracefully and exits + // within 30 seconds from receiving it, no SIGKILL value is sent. + + _, err := t.svc.StopTask(&ecs.StopTaskInput{ + Cluster: t.clusterARN, + Task: t.taskARN, + Reason: aws.String("Task stopped via AWS Nuke"), + }) + + return err +} + +func (t *ECSTask) String() string { + return fmt.Sprintf("%s -> %s", *t.taskARN, *t.clusterARN) +} From cd1cb3a66c8cf8af7822e0507215412b22b34230 Mon Sep 17 00:00:00 2001 From: Sean Stoops Date: Tue, 28 Mar 2023 15:20:44 -0700 Subject: [PATCH 002/135] Consolidating the GitHub workflows down to only what we need to perform O'Reilly releases. --- .github/workflows/ci.yaml | 54 -------------------------- .github/workflows/release.yaml | 71 ---------------------------------- 2 files changed, 125 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6d3a80cb..d9dd2153 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,57 +28,3 @@ jobs: - name: Build Project run: | make - - docker_build: - runs-on: ubuntu-22.04 - name: Docker Build - if: github.event_name != 'pull_request' || (github.event.pull_request.head.repo.full_name == 'rebuy-de/aws-nuke' && github.event.pull_request.user.login != 'dependabot[bot]') - - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Generate image tags - shell: bash - run: | - if [ "${GITHUB_EVENT_NAME}" == "pull_request" ]; then - BRANCH="$(echo ${GITHUB_HEAD_REF} | tr '/' '_')" - echo "tags=quay.io/rebuy/aws-nuke:${BRANCH},docker.io/rebuy/aws-nuke:${BRANCH}" >> $GITHUB_OUTPUT - else - echo "tags=quay.io/rebuy/aws-nuke:main,docker.io/rebuy/aws-nuke:main,\ - quay.io/rebuy/aws-nuke:latest,docker.io/rebuy/aws-nuke:latest" >> $GITHUB_OUTPUT - fi - id: generate_tags - - - name: Set up QEMU - id: qemu - uses: docker/setup-qemu-action@v2 - with: - platforms: arm64 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - with: - install: true - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Login to Quay.io - uses: docker/login-action@v2 - with: - registry: quay.io - username: ${{ secrets.QUAY_USERNAME }} - password: ${{ secrets.QUAY_PASSWORD }} - - - name: Build and push - uses: docker/build-push-action@v3 - with: - context: . - push: true - tags: ${{ steps.generate_tags.outputs.tags }} - platforms: linux/amd64,linux/arm64 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e9831a42..72d84be4 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -3,33 +3,8 @@ name: Publish release artifacts on: release: types: [created] -permissions: - contents: write - pull-requests: write jobs: - update_readme: - name: Update Readme - runs-on: ubuntu-22.04 - steps: - - name: Checkout code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ref: main - - name: Update versions in readme - run: | - sed -r -i "s/aws-nuke:v[0-9]+\.[0-9]+\.[0-9]+/aws-nuke:${{ github.ref_name }}/" README.md - sed -r -i "s/aws-nuke-v[0-9]+\.[0-9]+\.[0-9]+/aws-nuke-${{ github.ref_name }}/" README.md - sed -r -i "s/\/v[0-9]+\.[0-9]+\.[0-9]+\//\/${{ github.ref_name }}\//" README.md - - uses: peter-evans/create-pull-request@v5 - name: Create Pull Request - with: - title: Update readme for ${{ github.ref_name }} release - commit-message: Update readme for ${{ github.ref_name }} release - body: Updating version references in the readme to ${{ github.ref_name }} - branch: update-readme-${{ github.ref_name }} - delete-branch: true release: name: Publish binaries @@ -56,49 +31,3 @@ jobs: tag: ${{ github.ref }} overwrite: true file_glob: true - - docker_build: - runs-on: ubuntu-22.04 - name: Docker Build - - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Generate image tags - shell: bash - run: echo "tags=quay.io/rebuy/aws-nuke:${GITHUB_REF#refs/tags/},docker.io/rebuy/aws-nuke:${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - id: generate_tags - - - name: Set up QEMU - id: qemu - uses: docker/setup-qemu-action@v2 - with: - platforms: arm64 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - with: - install: true - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Login to Quay.io - uses: docker/login-action@v2 - with: - registry: quay.io - username: ${{ secrets.QUAY_USERNAME }} - password: ${{ secrets.QUAY_PASSWORD }} - - - name: Build and push - uses: docker/build-push-action@v3 - with: - context: . - push: true - tags: ${{ steps.generate_tags.outputs.tags }} - platforms: linux/amd64,linux/arm64 From 067c6ba2f4e1477a17a509fb07be5d9c00c9b75b Mon Sep 17 00:00:00 2001 From: Sean Stoops Date: Tue, 28 Mar 2023 15:22:14 -0700 Subject: [PATCH 003/135] Switching CI action over to `oreilly-main` branch --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d9dd2153..609a73d5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,7 +2,7 @@ name: Golang CI on: push: - branches: [main] + branches: [oreilly-main] pull_request: types: [opened, reopened, synchronize] schedule: From 548938f8105c04c5b0ab4dd1c36bb7a52f81917d Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 13 Apr 2023 17:12:16 -0500 Subject: [PATCH 004/135] CL-540 | Lower concurrent resource list requests temporarily (for cloudcontrol) (#1) * Bump github.com/aws/aws-sdk-go from 1.44.230 to 1.44.235 (#972) Bumps [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) from 1.44.230 to 1.44.235. - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.44.230...v1.44.235) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Decrement parallel list req semaphore weight/count from 16 to 2 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cmd/scan.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/scan.go b/cmd/scan.go index aa03f51e..1a63bcc4 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -12,7 +12,7 @@ import ( "golang.org/x/sync/semaphore" ) -const ScannerParallelQueries = 16 +const ScannerParallelQueries = 2 func Scan(region *Region, resourceTypes []string) <-chan *Item { s := &scanner{ From 37a2789b474312283f1cf3643560bbf3ab580b20 Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Wed, 26 Apr 2023 16:22:15 -0700 Subject: [PATCH 005/135] CL-522 | Add `SignerSigningJob` module to revoke signing jobs Signing jobs are viewable by the ListSigningJobs operation for two years after they are performed [1] As a precaution we are updating Signing jobs statuses to revoked. This indicates that the signature is no longer valid. [1] https://awscli.amazonaws.com/v2/documentation/api/latest/reference/signer/start-signing-job.html Signed-off-by: Gabriela S. Soria --- go.mod | 2 +- go.sum | 4 +- resources/signer.signingjobs.go | 66 +++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 resources/signer.signingjobs.go diff --git a/go.mod b/go.mod index ecb79d97..72646703 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.19 require ( - github.com/aws/aws-sdk-go v1.44.245 + github.com/aws/aws-sdk-go v1.44.251 github.com/fatih/color v1.15.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index 2d4aa636..4e16eed2 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.44.245 h1:KtY2s4q31/kn33AdV63R5t77mdxsI7rq3YT7Mgo805M= -github.com/aws/aws-sdk-go v1.44.245/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.251 h1:unCIT7a/BkYvJ/43D0Ts/0aRbWDMQM0SUzBtdsKPwCg= +github.com/aws/aws-sdk-go v1.44.251/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/resources/signer.signingjobs.go b/resources/signer.signingjobs.go new file mode 100644 index 00000000..7a4722e1 --- /dev/null +++ b/resources/signer.signingjobs.go @@ -0,0 +1,66 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/signer" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type SignerSigningJob struct { + svc *signer.Signer + jobId *string + reason string +} + +func init() { + register("SignerSigningJob", ListSignerSigningJobs) +} + +func ListSignerSigningJobs(sess *session.Session) ([]Resource, error) { + svc := signer.New(sess) + resources := []Resource{} + const reason string = "Ephemeral iam user" + + listJobsInput := &signer.ListSigningJobsInput{} + + err := svc.ListSigningJobsPages(listJobsInput, func(page *signer.ListSigningJobsOutput, lastPage bool) bool { + for _, job := range page.Jobs { + // Consider all non-revoked jobs on this page + if job.IsRevoked == nil || !*job.IsRevoked { + resources = append(resources, &SignerSigningJob{ + svc: svc, + jobId: job.JobId, + reason: reason, + }) + } + } + return true // continue iterating over pages + }) + if err != nil { + return nil, err + } + return resources, nil +} + +func (j *SignerSigningJob) Filter() error { + return nil +} + +func (j *SignerSigningJob) Remove() error { + // Signing jobs are viewable by the ListSigningJobs operation for two years after they are performed [1] + // As a precaution we are updating Signing jobs statuses to revoked. This indicates that the signature is no longer valid. + // [1] https://awscli.amazonaws.com/v2/documentation/api/latest/reference/signer/start-signing-job.html + revokeInput := &signer.RevokeSignatureInput{ + JobId: j.jobId, + Reason: aws.String(j.reason), + } + _, err := j.svc.RevokeSignature(revokeInput) + return err +} + +func (j *SignerSigningJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("JobId", j.jobId) + return properties +} From 51894cea476de4921af6f546f87b4f22ff0d2fc5 Mon Sep 17 00:00:00 2001 From: Sean Stoops Date: Thu, 27 Apr 2023 13:53:41 -0700 Subject: [PATCH 006/135] Removing deprecated String method. Eliminating a for-loop in the cluster query. --- resources/ecs-tasks.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/resources/ecs-tasks.go b/resources/ecs-tasks.go index a1b9d93b..c492bd2d 100644 --- a/resources/ecs-tasks.go +++ b/resources/ecs-tasks.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/ecs" @@ -35,9 +33,7 @@ func ListECSTasks(sess *session.Session) ([]Resource, error) { return nil, err } - for _, clusterArn := range output.ClusterArns { - clusters = append(clusters, clusterArn) - } + clusters = append(clusters, output.ClusterArns...) if output.NextToken == nil { break @@ -103,7 +99,3 @@ func (t *ECSTask) Remove() error { return err } - -func (t *ECSTask) String() string { - return fmt.Sprintf("%s -> %s", *t.taskARN, *t.clusterARN) -} From e8a0a9301152cf233caa271cb59b9d51e97f3b8f Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Fri, 28 Apr 2023 08:57:02 -0700 Subject: [PATCH 007/135] CL-522 | update revoking reason Signed-off-by: Gabriela S. Soria --- resources/signer.signingjobs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/signer.signingjobs.go b/resources/signer.signingjobs.go index 7a4722e1..8c817531 100644 --- a/resources/signer.signingjobs.go +++ b/resources/signer.signingjobs.go @@ -20,7 +20,7 @@ func init() { func ListSignerSigningJobs(sess *session.Session) ([]Resource, error) { svc := signer.New(sess) resources := []Resource{} - const reason string = "Ephemeral iam user" + const reason string = "Revoked by AWS Nuke" listJobsInput := &signer.ListSigningJobsInput{} From ac274c96a082f04bb78dda938af25a318b7a002b Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Fri, 28 Apr 2023 09:05:12 -0700 Subject: [PATCH 008/135] CL-522 | filter already revoked jobs in the `Filter` function Signed-off-by: Gabriela S. Soria --- resources/signer.signingjobs.go | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/resources/signer.signingjobs.go b/resources/signer.signingjobs.go index 8c817531..15e7dfba 100644 --- a/resources/signer.signingjobs.go +++ b/resources/signer.signingjobs.go @@ -1,6 +1,8 @@ package resources import ( + "fmt" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/signer" @@ -8,9 +10,10 @@ import ( ) type SignerSigningJob struct { - svc *signer.Signer - jobId *string - reason string + svc *signer.Signer + jobId *string + reason string + isRevoked *bool } func init() { @@ -26,14 +29,12 @@ func ListSignerSigningJobs(sess *session.Session) ([]Resource, error) { err := svc.ListSigningJobsPages(listJobsInput, func(page *signer.ListSigningJobsOutput, lastPage bool) bool { for _, job := range page.Jobs { - // Consider all non-revoked jobs on this page - if job.IsRevoked == nil || !*job.IsRevoked { - resources = append(resources, &SignerSigningJob{ - svc: svc, - jobId: job.JobId, - reason: reason, - }) - } + resources = append(resources, &SignerSigningJob{ + svc: svc, + jobId: job.JobId, + reason: reason, + isRevoked: job.IsRevoked, + }) } return true // continue iterating over pages }) @@ -44,6 +45,10 @@ func ListSignerSigningJobs(sess *session.Session) ([]Resource, error) { } func (j *SignerSigningJob) Filter() error { + // Consider all non-revoked jobs + if *j.isRevoked { + return fmt.Errorf("job already revoked") + } return nil } From 2fae9ccffd3e535b35e576f1dbe49611241d9455 Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Fri, 28 Apr 2023 12:38:40 -0700 Subject: [PATCH 009/135] CL-522 | include more job properties available for filters Signed-off-by: Gabriela S. Soria --- resources/signer.signingjobs.go | 38 ++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/resources/signer.signingjobs.go b/resources/signer.signingjobs.go index 15e7dfba..bc9f88c5 100644 --- a/resources/signer.signingjobs.go +++ b/resources/signer.signingjobs.go @@ -2,6 +2,7 @@ package resources import ( "fmt" + "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" @@ -10,10 +11,17 @@ import ( ) type SignerSigningJob struct { - svc *signer.Signer - jobId *string - reason string - isRevoked *bool + svc *signer.Signer + jobId *string + reason string + isRevoked *bool + createdAt time.Time + profileName *string + profileVersion *string + platformId *string + platformDisplayName *string + jobOwner *string + jobInvoker *string } func init() { @@ -30,10 +38,17 @@ func ListSignerSigningJobs(sess *session.Session) ([]Resource, error) { err := svc.ListSigningJobsPages(listJobsInput, func(page *signer.ListSigningJobsOutput, lastPage bool) bool { for _, job := range page.Jobs { resources = append(resources, &SignerSigningJob{ - svc: svc, - jobId: job.JobId, - reason: reason, - isRevoked: job.IsRevoked, + svc: svc, + jobId: job.JobId, + reason: reason, + isRevoked: job.IsRevoked, + createdAt: *job.CreatedAt, + profileName: job.ProfileName, + profileVersion: job.ProfileVersion, + platformId: job.PlatformId, + platformDisplayName: job.PlatformDisplayName, + jobOwner: job.JobOwner, + jobInvoker: job.JobInvoker, }) } return true // continue iterating over pages @@ -67,5 +82,12 @@ func (j *SignerSigningJob) Remove() error { func (j *SignerSigningJob) Properties() types.Properties { properties := types.NewProperties() properties.Set("JobId", j.jobId) + properties.Set("CreatedAt", j.createdAt.Format(time.RFC3339)) + properties.Set("ProfileName", j.profileName) + properties.Set("ProfileVersion", j.profileVersion) + properties.Set("PlatformId", j.platformId) + properties.Set("PlatformDisplayName", j.platformDisplayName) + properties.Set("JobOwner", j.jobOwner) + properties.Set("JobInvoker", j.jobInvoker) return properties } From 3ec2871e5ca7e0bbf3b4ed6cfef1c1570495e9ed Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Tue, 30 May 2023 15:04:16 -0700 Subject: [PATCH 010/135] return non zero code when there is a throttline exception --- cmd/nuke.go | 11 ++++++++--- cmd/scan.go | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/cmd/nuke.go b/cmd/nuke.go index fc6d958b..389db018 100644 --- a/cmd/nuke.go +++ b/cmd/nuke.go @@ -249,9 +249,14 @@ func (n *Nuke) HandleQueue() { n.HandleRemove(item) item.Print() case ItemStateFailed: - n.HandleRemove(item) - n.HandleWait(item, listCache) - item.Print() + // item.Resource will be nil if an exception was thrown while retrieving the resourceType's + // items (I.E resourceTypes lister()), however we still pass down the reason and state so we + // aren't ignoring these exceptions. + if item.Resource != nil { + n.HandleRemove(item) + n.HandleWait(item, listCache) + item.Print() + } case ItemStatePending: n.HandleWait(item, listCache) item.State = ItemStateWaiting diff --git a/cmd/scan.go b/cmd/scan.go index aa03f51e..2800494f 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -5,6 +5,7 @@ import ( "fmt" "runtime/debug" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/rebuy-de/aws-nuke/v2/pkg/awsutil" "github.com/rebuy-de/aws-nuke/v2/pkg/util" "github.com/rebuy-de/aws-nuke/v2/resources" @@ -72,6 +73,21 @@ func (s *scanner) list(region *Region, resourceType string) { return } + // check for this error "ThrottlingException: Rate exceeded" + // TODO: if there is a throttling exception call lister(sess) again 3 times with exponential backoff. + // or maybe try recursion and call s.list(region, resourceType) + awsErr, ok := err.(awserr.Error) + if ok && awsErr.Code() == "ThrottlingException" { + s.items <- &Item{ + Region: region, + Resource: nil, + State: ItemStateFailed, + Reason: err.Error(), + Type: resourceType, + } + return + } + dump := util.Indent(fmt.Sprintf("%v", err), " ") log.Errorf("Listing %s failed:\n%s", resourceType, dump) return From c8b74f29b38cab5c74786809311c453a22ef6bda Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Wed, 31 May 2023 15:46:26 -0700 Subject: [PATCH 011/135] add MaxRetry config for cloudControlApi. --- resources/cloudcontrol.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/cloudcontrol.go b/resources/cloudcontrol.go index fa56a6cd..6983ffd4 100644 --- a/resources/cloudcontrol.go +++ b/resources/cloudcontrol.go @@ -37,9 +37,11 @@ func init() { registerCloudControl("AWS::NetworkFirewall::RuleGroup") } +const CloudControlAPiMaxRetries = 5 + func NewListCloudControlResource(typeName string) func(*session.Session) ([]Resource, error) { return func(sess *session.Session) ([]Resource, error) { - svc := cloudcontrolapi.New(sess) + svc := cloudcontrolapi.New(sess, &aws.Config{MaxRetries: aws.Int(CloudControlAPiMaxRetries)}) params := &cloudcontrolapi.ListResourcesInput{ TypeName: aws.String(typeName), From 92873d97f44e7b268f69fead819eacb715223fce Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Wed, 31 May 2023 15:47:08 -0700 Subject: [PATCH 012/135] return non zero code for throttling exceptions even if no new resources are found --- cmd/nuke.go | 16 +++++++++++++--- cmd/scan.go | 5 ++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/cmd/nuke.go b/cmd/nuke.go index 389db018..7a184892 100644 --- a/cmd/nuke.go +++ b/cmd/nuke.go @@ -63,6 +63,16 @@ func (n *Nuke) Run() error { return err } + if n.items.Count(ItemStateFailed) > 0 && n.items.Count(ItemStateNew) == 0 { + for _, item := range n.items { + if item.State != ItemStateFailed { + continue + } + logrus.Error(fmt.Sprintf("%s. %s.", item.Type, item.Reason)) + } + return fmt.Errorf("failed") + } + if n.items.Count(ItemStateNew) == 0 { fmt.Println("No resource to delete.") return nil @@ -249,9 +259,9 @@ func (n *Nuke) HandleQueue() { n.HandleRemove(item) item.Print() case ItemStateFailed: - // item.Resource will be nil if an exception was thrown while retrieving the resourceType's - // items (I.E resourceTypes lister()), however we still pass down the reason and state so we - // aren't ignoring these exceptions. + // item.Resource will be nil if an exception was thrown while retrieving cloudControl + // resourceType's items (I.E resourceTypes lister()), however we still pass down the + // reason and state so we aren't ignoring these exceptions. if item.Resource != nil { n.HandleRemove(item) n.HandleWait(item, listCache) diff --git a/cmd/scan.go b/cmd/scan.go index 2800494f..815816ca 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -73,9 +73,6 @@ func (s *scanner) list(region *Region, resourceType string) { return } - // check for this error "ThrottlingException: Rate exceeded" - // TODO: if there is a throttling exception call lister(sess) again 3 times with exponential backoff. - // or maybe try recursion and call s.list(region, resourceType) awsErr, ok := err.(awserr.Error) if ok && awsErr.Code() == "ThrottlingException" { s.items <- &Item{ @@ -85,6 +82,8 @@ func (s *scanner) list(region *Region, resourceType string) { Reason: err.Error(), Type: resourceType, } + dump := util.Indent(fmt.Sprintf("%v", err), " ") + log.Errorf("Listing %s failed:\n%s", resourceType, dump) return } From 5ee09bd1c241ce70b6deb07910e42d2c9416824b Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Thu, 1 Jun 2023 11:02:39 -0700 Subject: [PATCH 013/135] change ScannerParallelQueries back to 2 --- cmd/scan.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/scan.go b/cmd/scan.go index 815816ca..79724444 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -13,7 +13,7 @@ import ( "golang.org/x/sync/semaphore" ) -const ScannerParallelQueries = 16 +const ScannerParallelQueries = 2 func Scan(region *Region, resourceTypes []string) <-chan *Item { s := &scanner{ From 2ebe1e67217cef0c64d52d122fa845677186b7c9 Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Thu, 1 Jun 2023 11:03:34 -0700 Subject: [PATCH 014/135] change ScannerParallelQueries back to the default 16 --- cmd/scan.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/scan.go b/cmd/scan.go index 79724444..815816ca 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -13,7 +13,7 @@ import ( "golang.org/x/sync/semaphore" ) -const ScannerParallelQueries = 2 +const ScannerParallelQueries = 16 func Scan(region *Region, resourceTypes []string) <-chan *Item { s := &scanner{ From 223168d758c8062289c4a55a3d1c64b14afeb4ab Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Tue, 30 May 2023 15:04:16 -0700 Subject: [PATCH 015/135] return non zero code when there is a throttline exception --- cmd/nuke.go | 11 ++++++++--- cmd/scan.go | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/cmd/nuke.go b/cmd/nuke.go index fc6d958b..389db018 100644 --- a/cmd/nuke.go +++ b/cmd/nuke.go @@ -249,9 +249,14 @@ func (n *Nuke) HandleQueue() { n.HandleRemove(item) item.Print() case ItemStateFailed: - n.HandleRemove(item) - n.HandleWait(item, listCache) - item.Print() + // item.Resource will be nil if an exception was thrown while retrieving the resourceType's + // items (I.E resourceTypes lister()), however we still pass down the reason and state so we + // aren't ignoring these exceptions. + if item.Resource != nil { + n.HandleRemove(item) + n.HandleWait(item, listCache) + item.Print() + } case ItemStatePending: n.HandleWait(item, listCache) item.State = ItemStateWaiting diff --git a/cmd/scan.go b/cmd/scan.go index 1a63bcc4..b290e0d6 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -5,6 +5,7 @@ import ( "fmt" "runtime/debug" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/rebuy-de/aws-nuke/v2/pkg/awsutil" "github.com/rebuy-de/aws-nuke/v2/pkg/util" "github.com/rebuy-de/aws-nuke/v2/resources" @@ -72,6 +73,21 @@ func (s *scanner) list(region *Region, resourceType string) { return } + // check for this error "ThrottlingException: Rate exceeded" + // TODO: if there is a throttling exception call lister(sess) again 3 times with exponential backoff. + // or maybe try recursion and call s.list(region, resourceType) + awsErr, ok := err.(awserr.Error) + if ok && awsErr.Code() == "ThrottlingException" { + s.items <- &Item{ + Region: region, + Resource: nil, + State: ItemStateFailed, + Reason: err.Error(), + Type: resourceType, + } + return + } + dump := util.Indent(fmt.Sprintf("%v", err), " ") log.Errorf("Listing %s failed:\n%s", resourceType, dump) return From 412e4d0746097fc663a6a7c66370f39d51ea005c Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Wed, 31 May 2023 15:46:26 -0700 Subject: [PATCH 016/135] add MaxRetry config for cloudControlApi. --- resources/cloudcontrol.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/cloudcontrol.go b/resources/cloudcontrol.go index fa56a6cd..6983ffd4 100644 --- a/resources/cloudcontrol.go +++ b/resources/cloudcontrol.go @@ -37,9 +37,11 @@ func init() { registerCloudControl("AWS::NetworkFirewall::RuleGroup") } +const CloudControlAPiMaxRetries = 5 + func NewListCloudControlResource(typeName string) func(*session.Session) ([]Resource, error) { return func(sess *session.Session) ([]Resource, error) { - svc := cloudcontrolapi.New(sess) + svc := cloudcontrolapi.New(sess, &aws.Config{MaxRetries: aws.Int(CloudControlAPiMaxRetries)}) params := &cloudcontrolapi.ListResourcesInput{ TypeName: aws.String(typeName), From 0315694c292ebc9a9b2a4e1dd9f8d2fb7c5d7863 Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Wed, 31 May 2023 15:47:08 -0700 Subject: [PATCH 017/135] return non zero code for throttling exceptions even if no new resources are found --- cmd/nuke.go | 16 +++++++++++++--- cmd/scan.go | 5 ++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/cmd/nuke.go b/cmd/nuke.go index 389db018..7a184892 100644 --- a/cmd/nuke.go +++ b/cmd/nuke.go @@ -63,6 +63,16 @@ func (n *Nuke) Run() error { return err } + if n.items.Count(ItemStateFailed) > 0 && n.items.Count(ItemStateNew) == 0 { + for _, item := range n.items { + if item.State != ItemStateFailed { + continue + } + logrus.Error(fmt.Sprintf("%s. %s.", item.Type, item.Reason)) + } + return fmt.Errorf("failed") + } + if n.items.Count(ItemStateNew) == 0 { fmt.Println("No resource to delete.") return nil @@ -249,9 +259,9 @@ func (n *Nuke) HandleQueue() { n.HandleRemove(item) item.Print() case ItemStateFailed: - // item.Resource will be nil if an exception was thrown while retrieving the resourceType's - // items (I.E resourceTypes lister()), however we still pass down the reason and state so we - // aren't ignoring these exceptions. + // item.Resource will be nil if an exception was thrown while retrieving cloudControl + // resourceType's items (I.E resourceTypes lister()), however we still pass down the + // reason and state so we aren't ignoring these exceptions. if item.Resource != nil { n.HandleRemove(item) n.HandleWait(item, listCache) diff --git a/cmd/scan.go b/cmd/scan.go index b290e0d6..79724444 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -73,9 +73,6 @@ func (s *scanner) list(region *Region, resourceType string) { return } - // check for this error "ThrottlingException: Rate exceeded" - // TODO: if there is a throttling exception call lister(sess) again 3 times with exponential backoff. - // or maybe try recursion and call s.list(region, resourceType) awsErr, ok := err.(awserr.Error) if ok && awsErr.Code() == "ThrottlingException" { s.items <- &Item{ @@ -85,6 +82,8 @@ func (s *scanner) list(region *Region, resourceType string) { Reason: err.Error(), Type: resourceType, } + dump := util.Indent(fmt.Sprintf("%v", err), " ") + log.Errorf("Listing %s failed:\n%s", resourceType, dump) return } From d3f357a1e50e89e309a9ee0a2b6fe92082751c17 Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Thu, 1 Jun 2023 11:03:34 -0700 Subject: [PATCH 018/135] change ScannerParallelQueries back to the default 16 --- cmd/scan.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/scan.go b/cmd/scan.go index 79724444..815816ca 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -13,7 +13,7 @@ import ( "golang.org/x/sync/semaphore" ) -const ScannerParallelQueries = 2 +const ScannerParallelQueries = 16 func Scan(region *Region, resourceTypes []string) <-chan *Item { s := &scanner{ From 3b4f84f1a2b85af1fd2cfdd1a4888f0563341e05 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 11 Jul 2023 13:36:27 -0500 Subject: [PATCH 019/135] Add Polly Lexicon support (#5) * Add Polly Lexicon support * Include additional Attributes on each Lexicon --- resources/polly-lexicons.go | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 resources/polly-lexicons.go diff --git a/resources/polly-lexicons.go b/resources/polly-lexicons.go new file mode 100644 index 00000000..63889ab8 --- /dev/null +++ b/resources/polly-lexicons.go @@ -0,0 +1,57 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/polly" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type PollyLexicon struct { + svc *polly.Polly + name *string + attributes *polly.LexiconAttributes +} + +func init() { + register("PollyLexicons", ListPollyLexicons) +} + +func ListPollyLexicons(sess *session.Session) ([]Resource, error) { + svc := polly.New(sess) + resources := []Resource{} + + listLexiconsInput := &polly.ListLexiconsInput{} + + listOutput, err := svc.ListLexicons(listLexiconsInput) + if err != nil { + return nil, err + } + for _, lexicon := range listOutput.Lexicons { + resources = append(resources, &PollyLexicon{ + svc: svc, + name: lexicon.Name, + attributes: lexicon.Attributes, + }) + } + return resources, nil +} + +func (lexicon *PollyLexicon) Remove() error { + deleteInput := &polly.DeleteLexiconInput{ + Name: lexicon.name, + } + _, err := lexicon.svc.DeleteLexicon(deleteInput) + return err +} + +func (lexicon *PollyLexicon) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", lexicon.name) + properties.Set("Alphabet", lexicon.attributes.Alphabet) + properties.Set("LanguageCode", lexicon.attributes.LanguageCode) + properties.Set("LastModified", lexicon.attributes.LastModified) + properties.Set("LexemesCount", lexicon.attributes.LexemesCount) + properties.Set("LexiconArn", lexicon.attributes.LexiconArn) + properties.Set("Size", lexicon.attributes.Size) + return properties +} From 67be0c0e8c1b19276e292dde1217b9afc1062fa5 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Wed, 12 Jul 2023 12:20:42 -0500 Subject: [PATCH 020/135] Adding Elasticache User and UserGroup Support Adding go modules for elasticache users and groups. Adding filtering for subnet groups to ignore the default elasticache subnet group. --- resources/elasticache-subnetgroups.go | 10 +++++ resources/elasticache-usergroups.go | 53 ++++++++++++++++++++++ resources/elasticache-users.go | 65 +++++++++++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 resources/elasticache-usergroups.go create mode 100644 resources/elasticache-users.go diff --git a/resources/elasticache-subnetgroups.go b/resources/elasticache-subnetgroups.go index 2e17689e..d4cbc418 100644 --- a/resources/elasticache-subnetgroups.go +++ b/resources/elasticache-subnetgroups.go @@ -1,6 +1,9 @@ package resources import ( + "fmt" + "strings" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/elasticache" @@ -35,6 +38,13 @@ func ListElasticacheSubnetGroups(sess *session.Session) ([]Resource, error) { return resources, nil } +func (i *ElasticacheSubnetGroup) Filter() error { + if strings.HasPrefix(*i.name, "default") { + return fmt.Errorf("Cannot delete default subnet group") + } + return nil +} + func (i *ElasticacheSubnetGroup) Remove() error { params := &elasticache.DeleteCacheSubnetGroupInput{ CacheSubnetGroupName: i.name, diff --git a/resources/elasticache-usergroups.go b/resources/elasticache-usergroups.go new file mode 100644 index 00000000..50208e2e --- /dev/null +++ b/resources/elasticache-usergroups.go @@ -0,0 +1,53 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/elasticache" +) + +type ElasticacheUserGroup struct { + svc *elasticache.ElastiCache + groupId *string +} + +func init() { + register("ElasticacheUserGroup", ListElasticacheUserGroups) +} + +func ListElasticacheUserGroups(sess *session.Session) ([]Resource, error) { + svc := elasticache.New(sess) + + params := &elasticache.DescribeUserGroupsInput{MaxRecords: aws.Int64(100)} + resp, err := svc.DescribeUserGroups(params) + if err != nil { + return nil, err + } + var resources []Resource + for _, userGroup := range resp.UserGroups { + resources = append(resources, &ElasticacheUserGroup{ + svc: svc, + groupId: userGroup.UserGroupId, + }) + + } + + return resources, nil +} + +func (i *ElasticacheUserGroup) Remove() error { + params := &elasticache.DeleteUserGroupInput{ + UserGroupId: i.groupId, + } + + _, err := i.svc.DeleteUserGroup(params) + if err != nil { + return err + } + + return nil +} + +func (i *ElasticacheUserGroup) String() string { + return *i.groupId +} diff --git a/resources/elasticache-users.go b/resources/elasticache-users.go new file mode 100644 index 00000000..ff8c864e --- /dev/null +++ b/resources/elasticache-users.go @@ -0,0 +1,65 @@ +package resources + +import ( + "fmt" + "strings" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/elasticache" +) + +type ElasticacheUser struct { + svc *elasticache.ElastiCache + userId *string + userName *string +} + +func init() { + register("ElasticacheUser", ListElasticacheUsers) +} + +func ListElasticacheUsers(sess *session.Session) ([]Resource, error) { + svc := elasticache.New(sess) + + params := &elasticache.DescribeUsersInput{MaxRecords: aws.Int64(100)} + resp, err := svc.DescribeUsers(params) + if err != nil { + return nil, err + } + var resources []Resource + for _, user := range resp.Users { + resources = append(resources, &ElasticacheUser{ + svc: svc, + userId: user.UserId, + userName: user.UserName, + }) + + } + + return resources, nil +} + +func (i *ElasticacheUser) Filter() error { + if strings.HasPrefix(*i.userName, "default") { + return fmt.Errorf("Cannot delete default user") + } + return nil +} + +func (i *ElasticacheUser) Remove() error { + params := &elasticache.DeleteUserInput{ + UserId: i.userId, + } + + _, err := i.svc.DeleteUser(params) + if err != nil { + return err + } + + return nil +} + +func (i *ElasticacheUser) String() string { + return *i.userId +} From 80c7bae82c873b05fd49696b3048ed595b563a1e Mon Sep 17 00:00:00 2001 From: Sherd White Date: Wed, 12 Jul 2023 16:57:02 -0500 Subject: [PATCH 021/135] Create opensearchservice-packages.go Adding working code for packages cleanup. --- resources/opensearchservice-packages.go | 64 +++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 resources/opensearchservice-packages.go diff --git a/resources/opensearchservice-packages.go b/resources/opensearchservice-packages.go new file mode 100644 index 00000000..a9e7b27e --- /dev/null +++ b/resources/opensearchservice-packages.go @@ -0,0 +1,64 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/opensearchservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type OSPackage struct { + svc *opensearchservice.OpenSearchService + domainName *string + packageID *string +} + +func init() { + register("OSPackage", ListOSPackages) +} + +func ListOSPackages(sess *session.Session) ([]Resource, error) { + svc := opensearchservice.New(sess) + + listResp, err := svc.DescribePackages(&opensearchservice.DescribePackagesInput{}) + if err != nil { + return nil, err + } + + resources := make([]Resource, 0) + + for _, pkg := range listResp.PackageDetailsList { + domainResp, err := svc.ListDomainsForPackage(&opensearchservice.ListDomainsForPackageInput{ + PackageID: pkg.PackageID, + }) + if err != nil { + return nil, err + } + + for _, domain := range domainResp.DomainPackageDetailsList { + resources = append(resources, &OSPackage{ + svc: svc, + domainName: domain.DomainName, + packageID: pkg.PackageID, + }) + } + } + + return resources, nil +} + +func (o *OSPackage) Remove() error { + _, err := o.svc.DeletePackage(&opensearchservice.DeletePackageInput{ + PackageID: o.packageID, + }) + + return err +} + +func (o *OSPackage) Properties() types.Properties { + properties := types.NewProperties() + return properties +} + +func (o *OSPackage) String() string { + return *o.packageID +} From b5c792ede3e078647dd9dae61ba3ad4bc7babe51 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Wed, 12 Jul 2023 16:59:37 -0500 Subject: [PATCH 022/135] Create opensearchservice-packages.go Adding support for opensearch packages. --- resources/opensearchservice-packages.go | 64 +++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 resources/opensearchservice-packages.go diff --git a/resources/opensearchservice-packages.go b/resources/opensearchservice-packages.go new file mode 100644 index 00000000..a9e7b27e --- /dev/null +++ b/resources/opensearchservice-packages.go @@ -0,0 +1,64 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/opensearchservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type OSPackage struct { + svc *opensearchservice.OpenSearchService + domainName *string + packageID *string +} + +func init() { + register("OSPackage", ListOSPackages) +} + +func ListOSPackages(sess *session.Session) ([]Resource, error) { + svc := opensearchservice.New(sess) + + listResp, err := svc.DescribePackages(&opensearchservice.DescribePackagesInput{}) + if err != nil { + return nil, err + } + + resources := make([]Resource, 0) + + for _, pkg := range listResp.PackageDetailsList { + domainResp, err := svc.ListDomainsForPackage(&opensearchservice.ListDomainsForPackageInput{ + PackageID: pkg.PackageID, + }) + if err != nil { + return nil, err + } + + for _, domain := range domainResp.DomainPackageDetailsList { + resources = append(resources, &OSPackage{ + svc: svc, + domainName: domain.DomainName, + packageID: pkg.PackageID, + }) + } + } + + return resources, nil +} + +func (o *OSPackage) Remove() error { + _, err := o.svc.DeletePackage(&opensearchservice.DeletePackageInput{ + PackageID: o.packageID, + }) + + return err +} + +func (o *OSPackage) Properties() types.Properties { + properties := types.NewProperties() + return properties +} + +func (o *OSPackage) String() string { + return *o.packageID +} From 449f4719a1c12dd5ab7c73b46eda2a17cd3b261f Mon Sep 17 00:00:00 2001 From: Sherd White Date: Wed, 12 Jul 2023 17:00:33 -0500 Subject: [PATCH 023/135] Delete opensearchservice-packages.go Moving opensearch changes to separate branch. --- resources/opensearchservice-packages.go | 64 ------------------------- 1 file changed, 64 deletions(-) delete mode 100644 resources/opensearchservice-packages.go diff --git a/resources/opensearchservice-packages.go b/resources/opensearchservice-packages.go deleted file mode 100644 index a9e7b27e..00000000 --- a/resources/opensearchservice-packages.go +++ /dev/null @@ -1,64 +0,0 @@ -package resources - -import ( - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/opensearchservice" - "github.com/rebuy-de/aws-nuke/v2/pkg/types" -) - -type OSPackage struct { - svc *opensearchservice.OpenSearchService - domainName *string - packageID *string -} - -func init() { - register("OSPackage", ListOSPackages) -} - -func ListOSPackages(sess *session.Session) ([]Resource, error) { - svc := opensearchservice.New(sess) - - listResp, err := svc.DescribePackages(&opensearchservice.DescribePackagesInput{}) - if err != nil { - return nil, err - } - - resources := make([]Resource, 0) - - for _, pkg := range listResp.PackageDetailsList { - domainResp, err := svc.ListDomainsForPackage(&opensearchservice.ListDomainsForPackageInput{ - PackageID: pkg.PackageID, - }) - if err != nil { - return nil, err - } - - for _, domain := range domainResp.DomainPackageDetailsList { - resources = append(resources, &OSPackage{ - svc: svc, - domainName: domain.DomainName, - packageID: pkg.PackageID, - }) - } - } - - return resources, nil -} - -func (o *OSPackage) Remove() error { - _, err := o.svc.DeletePackage(&opensearchservice.DeletePackageInput{ - PackageID: o.packageID, - }) - - return err -} - -func (o *OSPackage) Properties() types.Properties { - properties := types.NewProperties() - return properties -} - -func (o *OSPackage) String() string { - return *o.packageID -} From 55571a7dbc4ffb0341762f9e5680c34eba424003 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Wed, 12 Jul 2023 22:03:58 -0500 Subject: [PATCH 024/135] Update opensearchservice-packages.go Confirmed working cleanup of os packages. --- resources/opensearchservice-packages.go | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/resources/opensearchservice-packages.go b/resources/opensearchservice-packages.go index a9e7b27e..ca03e906 100644 --- a/resources/opensearchservice-packages.go +++ b/resources/opensearchservice-packages.go @@ -27,20 +27,10 @@ func ListOSPackages(sess *session.Session) ([]Resource, error) { resources := make([]Resource, 0) for _, pkg := range listResp.PackageDetailsList { - domainResp, err := svc.ListDomainsForPackage(&opensearchservice.ListDomainsForPackageInput{ - PackageID: pkg.PackageID, + resources = append(resources, &OSPackage{ + svc: svc, + packageID: pkg.PackageID, }) - if err != nil { - return nil, err - } - - for _, domain := range domainResp.DomainPackageDetailsList { - resources = append(resources, &OSPackage{ - svc: svc, - domainName: domain.DomainName, - packageID: pkg.PackageID, - }) - } } return resources, nil From 84fbd14186c982159071b8907aa799f81d183680 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Thu, 13 Jul 2023 11:59:27 -0500 Subject: [PATCH 025/135] Adding opensearch vpcendpoints functionality. Removing unused var from packages. --- resources/opensearchservice-packages.go | 5 +- resources/opensearchservice-vpcendpoints.go | 55 +++++++++++++++++++++ 2 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 resources/opensearchservice-vpcendpoints.go diff --git a/resources/opensearchservice-packages.go b/resources/opensearchservice-packages.go index ca03e906..a24ff03d 100644 --- a/resources/opensearchservice-packages.go +++ b/resources/opensearchservice-packages.go @@ -7,9 +7,8 @@ import ( ) type OSPackage struct { - svc *opensearchservice.OpenSearchService - domainName *string - packageID *string + svc *opensearchservice.OpenSearchService + packageID *string } func init() { diff --git a/resources/opensearchservice-vpcendpoints.go b/resources/opensearchservice-vpcendpoints.go new file mode 100644 index 00000000..8d89eed7 --- /dev/null +++ b/resources/opensearchservice-vpcendpoints.go @@ -0,0 +1,55 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/opensearchservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type OSVPCEndpoint struct { + svc *opensearchservice.OpenSearchService + vpcEndpointId *string +} + +func init() { + register("OSVPCEndpoint", ListOSVPCEndpoints) +} + +func ListOSVPCEndpoints(sess *session.Session) ([]Resource, error) { + svc := opensearchservice.New(sess) + + listResp, err := svc.DescribeVpcEndpoints(&opensearchservice.DescribeVpcEndpointsInput{ + VpcEndpointIds: []*string{}, + }) + if err != nil { + return nil, err + } + + resources := make([]Resource, 0) + + for _, vpcEndpoint := range listResp.VpcEndpoints { + resources = append(resources, &OSVPCEndpoint{ + svc: svc, + vpcEndpointId: vpcEndpoint.VpcEndpointId, + }) + } + + return resources, nil +} + +func (o *OSVPCEndpoint) Remove() error { + _, err := o.svc.DeleteVpcEndpoint(&opensearchservice.DeleteVpcEndpointInput{ + VpcEndpointId: o.vpcEndpointId, + }) + + return err +} + +func (o *OSVPCEndpoint) Properties() types.Properties { + properties := types.NewProperties() + return properties +} + +func (o *OSVPCEndpoint) String() string { + return *o.vpcEndpointId +} From 378ccab9cddd85c584498082090f01159e129b60 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Thu, 13 Jul 2023 13:35:03 -0500 Subject: [PATCH 026/135] Update opensearchservice-vpcendpoints.go Correctly retrieving VPC endpoint ids. --- resources/opensearchservice-vpcendpoints.go | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/resources/opensearchservice-vpcendpoints.go b/resources/opensearchservice-vpcendpoints.go index 8d89eed7..0a687990 100644 --- a/resources/opensearchservice-vpcendpoints.go +++ b/resources/opensearchservice-vpcendpoints.go @@ -18,8 +18,13 @@ func init() { func ListOSVPCEndpoints(sess *session.Session) ([]Resource, error) { svc := opensearchservice.New(sess) + vpcEndpointIds, err := getOpenSearchVpcEndpointIds(svc) + if err != nil { + return nil, err + } + listResp, err := svc.DescribeVpcEndpoints(&opensearchservice.DescribeVpcEndpointsInput{ - VpcEndpointIds: []*string{}, + VpcEndpointIds: vpcEndpointIds, }) if err != nil { return nil, err @@ -37,6 +42,21 @@ func ListOSVPCEndpoints(sess *session.Session) ([]Resource, error) { return resources, nil } +func getOpenSearchVpcEndpointIds(svc *opensearchservice.OpenSearchService) ([]*string, error) { + vpcEndpointIds := make([]*string, 0) + + listResp, err := svc.ListVpcEndpoints(&opensearchservice.ListVpcEndpointsInput{}) + if err != nil { + return nil, err + } + + for _, vpcEndpoint := range listResp.VpcEndpointSummaryList { + vpcEndpointIds = append(vpcEndpointIds, vpcEndpoint.VpcEndpointId) + } + + return vpcEndpointIds, nil +} + func (o *OSVPCEndpoint) Remove() error { _, err := o.svc.DeleteVpcEndpoint(&opensearchservice.DeleteVpcEndpointInput{ VpcEndpointId: o.vpcEndpointId, From ade341a6f8e0e44d939d68d3791ecc0d425f7e87 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Fri, 14 Jul 2023 11:48:05 -0500 Subject: [PATCH 027/135] Update opensearchservice-packages.go Setting property values. --- resources/opensearchservice-packages.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/resources/opensearchservice-packages.go b/resources/opensearchservice-packages.go index a24ff03d..cdac640c 100644 --- a/resources/opensearchservice-packages.go +++ b/resources/opensearchservice-packages.go @@ -1,14 +1,18 @@ package resources import ( + "time" + "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/opensearchservice" "github.com/rebuy-de/aws-nuke/v2/pkg/types" ) type OSPackage struct { - svc *opensearchservice.OpenSearchService - packageID *string + svc *opensearchservice.OpenSearchService + packageID *string + packageName *string + createdTime *time.Time } func init() { @@ -27,8 +31,10 @@ func ListOSPackages(sess *session.Session) ([]Resource, error) { for _, pkg := range listResp.PackageDetailsList { resources = append(resources, &OSPackage{ - svc: svc, - packageID: pkg.PackageID, + svc: svc, + packageID: pkg.PackageID, + packageName: pkg.PackageName, + createdTime: pkg.CreatedAt, }) } @@ -45,6 +51,9 @@ func (o *OSPackage) Remove() error { func (o *OSPackage) Properties() types.Properties { properties := types.NewProperties() + properties.Set("PackageID", o.packageID) + properties.Set("PackageName", o.packageName) + properties.Set("CreatedTime", o.createdTime.Format(time.RFC3339)) return properties } From 41e22d20213ec4c58e82f1ce9411f136856475f5 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Fri, 14 Jul 2023 12:04:45 -0500 Subject: [PATCH 028/135] Update opensearchservice-vpcendpoints.go Adding id to properties. --- resources/opensearchservice-vpcendpoints.go | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/opensearchservice-vpcendpoints.go b/resources/opensearchservice-vpcendpoints.go index 0a687990..7f757300 100644 --- a/resources/opensearchservice-vpcendpoints.go +++ b/resources/opensearchservice-vpcendpoints.go @@ -67,6 +67,7 @@ func (o *OSVPCEndpoint) Remove() error { func (o *OSVPCEndpoint) Properties() types.Properties { properties := types.NewProperties() + properties.Set("VpcEndpointId", o.vpcEndpointId) return properties } From 654211417f75bb6db2c009f3ec8387ae7093e871 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jul 2023 10:26:14 +0200 Subject: [PATCH 029/135] Bump github.com/aws/aws-sdk-go from 1.44.295 to 1.44.307 (#1052) Bumps [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) from 1.44.295 to 1.44.307. - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.44.295...v1.44.307) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e0b410cf..1034d340 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.19 require ( - github.com/aws/aws-sdk-go v1.44.295 + github.com/aws/aws-sdk-go v1.44.307 github.com/fatih/color v1.15.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index e679694a..7f3829b6 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.44.295 h1:SGjU1+MqttXfRiWHD6WU0DRhaanJgAFY+xIhEaugV8Y= -github.com/aws/aws-sdk-go v1.44.295/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.307 h1:2R0/EPgpZcFSUwZhYImq/srjaOrOfLv5MNRzrFyAM38= +github.com/aws/aws-sdk-go v1.44.307/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 6ebac139f05ab292265801b9a2c689c8d39b3ee8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Aug 2023 09:59:54 +0200 Subject: [PATCH 030/135] Bump github.com/aws/aws-sdk-go from 1.44.307 to 1.44.313 (#1061) Bumps [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) from 1.44.307 to 1.44.313. - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.44.307...v1.44.313) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1034d340..6d85b7fc 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.19 require ( - github.com/aws/aws-sdk-go v1.44.307 + github.com/aws/aws-sdk-go v1.44.313 github.com/fatih/color v1.15.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index 7f3829b6..27e14038 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.44.307 h1:2R0/EPgpZcFSUwZhYImq/srjaOrOfLv5MNRzrFyAM38= -github.com/aws/aws-sdk-go v1.44.307/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.313 h1:u6EuNQqgAmi09GEZ5g/XGHLF0XV31WcdU5rnHyIBHBc= +github.com/aws/aws-sdk-go v1.44.313/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 529f885845e2bdcf42df69adb8d5ded6d0abaffa Mon Sep 17 00:00:00 2001 From: Aleix Murtra Date: Wed, 2 Aug 2023 10:26:13 +0200 Subject: [PATCH 031/135] Support for TGW Attachment Peering resources (#996) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Support for removing TGW Attachment Peering resources, as only VPC attachments where supported before. Co-authored-by: Björn Häuser --- resources/ec2-tgw-attachments.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/resources/ec2-tgw-attachments.go b/resources/ec2-tgw-attachments.go index ca7dc369..84cae755 100644 --- a/resources/ec2-tgw-attachments.go +++ b/resources/ec2-tgw-attachments.go @@ -52,6 +52,21 @@ func (e *EC2TGWAttachment) Remove() error { // as part of TGW to delete VPN attachments. return fmt.Errorf("VPN attachment") } + + // Execute different API calls depending on the resource type. + if *e.tgwa.ResourceType == "peering" { + params := &ec2.DeleteTransitGatewayPeeringAttachmentInput{ + TransitGatewayAttachmentId: e.tgwa.TransitGatewayAttachmentId, + } + + _, err := e.svc.DeleteTransitGatewayPeeringAttachment(params) + if err != nil { + return err + } + + return nil + } + params := &ec2.DeleteTransitGatewayVpcAttachmentInput{ TransitGatewayAttachmentId: e.tgwa.TransitGatewayAttachmentId, } From 06a0dfe8c0c2cabb1cce80816141ae6d0720d29c Mon Sep 17 00:00:00 2001 From: ganhuang Date: Wed, 2 Aug 2023 16:31:39 +0800 Subject: [PATCH 032/135] Enable aws-cn by setting the default partition correctly (#1042) --- cmd/root.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/root.go b/cmd/root.go index 627722ac..c39b1949 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -69,6 +69,8 @@ func NewRootCommand() *cobra.Command { awsutil.DefaultAWSPartitionID = endpoints.AwsPartitionID case endpoints.UsGovEast1RegionID, endpoints.UsGovWest1RegionID: awsutil.DefaultAWSPartitionID = endpoints.AwsUsGovPartitionID + case endpoints.CnNorth1RegionID, endpoints.CnNorthwest1RegionID: + awsutil.DefaultAWSPartitionID = endpoints.AwsCnPartitionID default: if config.CustomEndpoints.GetRegion(defaultRegion) == nil { err = fmt.Errorf("The custom region '%s' must be specified in the configuration 'endpoints'", defaultRegion) From 93f09c373b6156613c7bd54804a341bc05fe17ef Mon Sep 17 00:00:00 2001 From: Jon Michaelchuck <5964742+jbmchuck@users.noreply.github.com> Date: Wed, 2 Aug 2023 04:32:49 -0400 Subject: [PATCH 033/135] kms-keys: Skip keys already in pending replica deletion state (#1046) * kms-keys: Skip keys already in pending replica deletion state Multi-region KMS keys enter state KeyStatePendingReplicaDeletion when deleted, they should be filtered out in the list operation. * Filter out PendingReplicaDeletion in the filter state rather than list state --- resources/kms-keys.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/kms-keys.go b/resources/kms-keys.go index cfb1193e..c7a67f68 100644 --- a/resources/kms-keys.go +++ b/resources/kms-keys.go @@ -86,6 +86,10 @@ func (e *KMSKey) Filter() error { return fmt.Errorf("is already in PendingDeletion state") } + if e.state == "PendingReplicaDeletion" { + return fmt.Errorf("is already in PendingReplicaDeletion state") + } + if e.manager != nil && *e.manager == kms.KeyManagerTypeAws { return fmt.Errorf("cannot delete AWS managed key") } From 8ecf7cccbe81026fc98de1cead78cb1a0560fee9 Mon Sep 17 00:00:00 2001 From: Guilherme Branco Date: Wed, 2 Aug 2023 05:39:19 -0300 Subject: [PATCH 034/135] feat: Adding tag properties to EC2DefaultSecurityGroupRule resource (#936) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Björn Häuser --- resources/ec2-default-security-group-rules.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/ec2-default-security-group-rules.go b/resources/ec2-default-security-group-rules.go index 71903cc0..c3fea3aa 100644 --- a/resources/ec2-default-security-group-rules.go +++ b/resources/ec2-default-security-group-rules.go @@ -12,6 +12,7 @@ type EC2DefaultSecurityGroupRule struct { id *string groupId *string isEgress *bool + tags []*ec2.Tag } func init() { @@ -62,6 +63,7 @@ func ListEC2SecurityGroupRules(sess *session.Session) ([]Resource, error) { id: rule.SecurityGroupRuleId, groupId: rule.GroupId, isEgress: rule.IsEgress, + tags: rule.Tags, }) } return !lastPage @@ -103,6 +105,9 @@ func (r *EC2DefaultSecurityGroupRule) Remove() error { func (r *EC2DefaultSecurityGroupRule) Properties() types.Properties { properties := types.NewProperties() + for _, tagValue := range r.tags { + properties.SetTag(tagValue.Key, tagValue.Value) + } properties.Set("SecurityGroupId", r.groupId) return properties } From 34899fbfabe26e2e627c8fa1d7cdcffb3e7b5b70 Mon Sep 17 00:00:00 2001 From: Vincent Boulineau <58430298+vboulineau@users.noreply.github.com> Date: Wed, 2 Aug 2023 10:46:56 +0200 Subject: [PATCH 035/135] Fix date format for ASG creationDate (#1014) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Björn Häuser --- pkg/config/filter.go | 7 ++++--- pkg/config/filter_test.go | 9 ++++++--- resources/autoscaling-groups.go | 5 +++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/pkg/config/filter.go b/pkg/config/filter.go index 61fcbef0..019ed8eb 100644 --- a/pkg/config/filter.go +++ b/pkg/config/filter.go @@ -84,11 +84,12 @@ func parseDate(input string) (time.Time, error) { return t, nil } - formats := []string{"2006-01-02", + formats := []string{ + "2006-01-02", "2006/01/02", "2006-01-02T15:04:05Z", - "2006-01-02 15:04:05.000 -0700 MST", // Date format used by AWS for CreateTime on ASGs - time.RFC3339Nano, // Format of t.MarshalText() and t.MarshalJSON() + "2006-01-02 15:04:05 -0700 MST", // Date format used by AWS for CreateTime on ASGs + time.RFC3339Nano, // Format of t.MarshalText() and t.MarshalJSON() time.RFC3339, } for _, f := range formats { diff --git a/pkg/config/filter_test.go b/pkg/config/filter_test.go index a26df88c..25f0d236 100644 --- a/pkg/config/filter_test.go +++ b/pkg/config/filter_test.go @@ -48,18 +48,22 @@ func TestUnmarshalFilter(t *testing.T) { }, { yaml: `{"type":"dateOlderThan","value":"0"}`, - match: []string{strconv.Itoa(int(future.Unix())), + match: []string{ + strconv.Itoa(int(future.Unix())), future.Format("2006-01-02"), future.Format("2006/01/02"), future.Format("2006-01-02T15:04:05Z"), + future.Format("2006-01-02 15:04:05.000 +0000 UTC"), future.Format(time.RFC3339Nano), future.Format(time.RFC3339), }, - mismatch: []string{"", + mismatch: []string{ + "", strconv.Itoa(int(past.Unix())), past.Format("2006-01-02"), past.Format("2006/01/02"), past.Format("2006-01-02T15:04:05Z"), + past.Format("2006-01-02 15:04:05.14 -0700 MST"), past.Format(time.RFC3339Nano), past.Format(time.RFC3339), }, @@ -98,5 +102,4 @@ func TestUnmarshalFilter(t *testing.T) { } }) } - } diff --git a/resources/autoscaling-groups.go b/resources/autoscaling-groups.go index 5f41ec7d..94aff114 100644 --- a/resources/autoscaling-groups.go +++ b/resources/autoscaling-groups.go @@ -1,6 +1,8 @@ package resources import ( + "time" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/autoscaling" @@ -27,7 +29,6 @@ func ListAutoscalingGroups(s *session.Session) ([]Resource, error) { } return !lastPage }) - if err != nil { return nil, err } @@ -65,7 +66,7 @@ func (asg *AutoScalingGroup) Properties() types.Properties { properties.SetTag(tag.Key, tag.Value) } - properties.Set("CreatedTime", asg.group.CreatedTime) + properties.Set("CreatedTime", asg.group.CreatedTime.Format(time.RFC3339)) properties.Set("Name", asg.group.AutoScalingGroupName) return properties From 47fc6c7c92ca92f3b418c3f9ea073e802213ff4e Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Wed, 2 Aug 2023 11:40:11 +0200 Subject: [PATCH 036/135] Add formatting check to GitHub Actions (#1063) * Add formatting check to GitHub Actions * Fix pre-existing formatting issues --- .github/workflows/ci.yaml | 7 ++ resources/batch-computeenvironments.go | 2 +- resources/batch-computeenvironmentstates.go | 4 +- resources/billing-costandusagereports.go | 10 +-- .../cloudfront-origin-access-identities.go | 76 +++++++++---------- resources/codestar-connections.go | 17 ++--- .../configservice-configurationrecorders.go | 2 +- resources/dax-subnetgroups.go | 2 +- resources/dynamodb-tables.go | 19 +++-- resources/ec2-vpn-connections.go | 8 +- resources/iam-policies.go | 2 +- resources/rds-clusters.go | 24 +++--- resources/rds-dbclusterparametergroups.go | 10 +-- resources/rds-subnets.go | 22 +++--- resources/redshift-subnetgroups.go | 2 +- resources/route53-resource-records.go | 2 +- .../wafregional-byte-match-set-tuples.go | 2 +- resources/wafregional-ip-set-ips.go | 2 +- .../wafregional-rate-based-rule-predicates.go | 2 +- resources/wafregional-regex-match-tuples.go | 2 +- resources/wafregional-regex-pattern-tuples.go | 2 +- resources/wafregional-rule-predicates.go | 2 +- tools/tools.go | 2 +- 23 files changed, 114 insertions(+), 109 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6d3a80cb..345cd2f9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,6 +22,13 @@ jobs: go install golang.org/x/lint/golint@latest - name: Checkout code uses: actions/checkout@v3 + - name: Check Formatting + run: | + if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then + echo "### Go formatting is off, please execute 'gofmt -w -s .' - see following diff: ###" + gofmt -s -d . + exit 1 + fi - name: Test Project run: | make test diff --git a/resources/batch-computeenvironments.go b/resources/batch-computeenvironments.go index b9908d3e..166574c2 100644 --- a/resources/batch-computeenvironments.go +++ b/resources/batch-computeenvironments.go @@ -31,7 +31,7 @@ func ListBatchComputeEnvironments(sess *session.Session) ([]Resource, error) { for _, computeEnvironment := range output.ComputeEnvironments { resources = append(resources, &BatchComputeEnvironment{ - svc: svc, + svc: svc, computeEnvironmentName: computeEnvironment.ComputeEnvironmentName, }) } diff --git a/resources/batch-computeenvironmentstates.go b/resources/batch-computeenvironmentstates.go index cf867b16..866092e7 100644 --- a/resources/batch-computeenvironmentstates.go +++ b/resources/batch-computeenvironmentstates.go @@ -35,9 +35,9 @@ func ListBatchComputeEnvironmentStates(sess *session.Session) ([]Resource, error for _, computeEnvironment := range output.ComputeEnvironments { resources = append(resources, &BatchComputeEnvironmentState{ - svc: svc, + svc: svc, computeEnvironmentName: computeEnvironment.ComputeEnvironmentName, - state: computeEnvironment.State, + state: computeEnvironment.State, }) } diff --git a/resources/billing-costandusagereports.go b/resources/billing-costandusagereports.go index b0148cbd..2a81fe26 100644 --- a/resources/billing-costandusagereports.go +++ b/resources/billing-costandusagereports.go @@ -39,11 +39,11 @@ func ListBillingCostandUsageReports(sess *session.Session) ([]Resource, error) { resources := []Resource{} for _, report := range reports { resources = append(resources, &BillingCostandUsageReport{ - svc: svc, - reportName: report.ReportName, - s3Bucket: report.S3Bucket, - s3Prefix: report.S3Prefix, - s3Region: report.S3Region, + svc: svc, + reportName: report.ReportName, + s3Bucket: report.S3Bucket, + s3Prefix: report.S3Prefix, + s3Region: report.S3Region, }) } diff --git a/resources/cloudfront-origin-access-identities.go b/resources/cloudfront-origin-access-identities.go index 375121f6..943886ad 100644 --- a/resources/cloudfront-origin-access-identities.go +++ b/resources/cloudfront-origin-access-identities.go @@ -1,58 +1,58 @@ package resources import ( - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/cloudfront" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/cloudfront" "github.com/rebuy-de/aws-nuke/v2/pkg/types" ) type CloudFrontOriginAccessIdentity struct { - svc *cloudfront.CloudFront - ID *string + svc *cloudfront.CloudFront + ID *string } func init() { - register("CloudFrontOriginAccessIdentity", ListCloudFrontOriginAccessIdentities) + register("CloudFrontOriginAccessIdentity", ListCloudFrontOriginAccessIdentities) } func ListCloudFrontOriginAccessIdentities(sess *session.Session) ([]Resource, error) { - svc := cloudfront.New(sess) - resources := []Resource{} - - for { - resp, err := svc.ListCloudFrontOriginAccessIdentities(nil) - if err != nil { - return nil, err - } - - for _, item := range resp.CloudFrontOriginAccessIdentityList.Items { - resources = append(resources,&CloudFrontOriginAccessIdentity{ - svc: svc, - ID: item.Id, - }) - } - return resources, nil - } + svc := cloudfront.New(sess) + resources := []Resource{} + + for { + resp, err := svc.ListCloudFrontOriginAccessIdentities(nil) + if err != nil { + return nil, err + } + + for _, item := range resp.CloudFrontOriginAccessIdentityList.Items { + resources = append(resources, &CloudFrontOriginAccessIdentity{ + svc: svc, + ID: item.Id, + }) + } + return resources, nil + } } func (f *CloudFrontOriginAccessIdentity) Remove() error { - resp, err := f.svc.GetCloudFrontOriginAccessIdentity(&cloudfront.GetCloudFrontOriginAccessIdentityInput{ - Id: f.ID, - }) - if err != nil { - return err - } - - _, err = f.svc.DeleteCloudFrontOriginAccessIdentity(&cloudfront.DeleteCloudFrontOriginAccessIdentityInput{ - Id: f.ID, - IfMatch: resp.ETag, - }) - - return err + resp, err := f.svc.GetCloudFrontOriginAccessIdentity(&cloudfront.GetCloudFrontOriginAccessIdentityInput{ + Id: f.ID, + }) + if err != nil { + return err + } + + _, err = f.svc.DeleteCloudFrontOriginAccessIdentity(&cloudfront.DeleteCloudFrontOriginAccessIdentityInput{ + Id: f.ID, + IfMatch: resp.ETag, + }) + + return err } func (f *CloudFrontOriginAccessIdentity) Properties() types.Properties { - properties := types.NewProperties() - properties.Set("ID", f.ID) - return properties + properties := types.NewProperties() + properties.Set("ID", f.ID) + return properties } diff --git a/resources/codestar-connections.go b/resources/codestar-connections.go index 1d49201c..b3d454d1 100644 --- a/resources/codestar-connections.go +++ b/resources/codestar-connections.go @@ -8,10 +8,10 @@ import ( ) type CodeStarConnection struct { - svc *codestarconnections.CodeStarConnections - connectionARN *string - connectionName *string - providerType *string + svc *codestarconnections.CodeStarConnections + connectionARN *string + connectionName *string + providerType *string } func init() { @@ -34,10 +34,10 @@ func ListCodeStarConnections(sess *session.Session) ([]Resource, error) { for _, connection := range output.Connections { resources = append(resources, &CodeStarConnection{ - svc: svc, - connectionARN: connection.ConnectionArn, - connectionName: connection.ConnectionName, - providerType: connection.ProviderType, + svc: svc, + connectionARN: connection.ConnectionArn, + connectionName: connection.ConnectionName, + providerType: connection.ProviderType, }) } @@ -68,7 +68,6 @@ func (f *CodeStarConnection) Properties() types.Properties { return properties } - func (f *CodeStarConnection) String() string { return *f.connectionName } diff --git a/resources/configservice-configurationrecorders.go b/resources/configservice-configurationrecorders.go index 669bbfe3..c0d95809 100644 --- a/resources/configservice-configurationrecorders.go +++ b/resources/configservice-configurationrecorders.go @@ -26,7 +26,7 @@ func ListConfigServiceConfigurationRecorders(sess *session.Session) ([]Resource, resources := make([]Resource, 0) for _, configurationRecorder := range resp.ConfigurationRecorders { resources = append(resources, &ConfigServiceConfigurationRecorder{ - svc: svc, + svc: svc, configurationRecorderName: configurationRecorder.Name, }) } diff --git a/resources/dax-subnetgroups.go b/resources/dax-subnetgroups.go index c451f6e8..81fc63c5 100644 --- a/resources/dax-subnetgroups.go +++ b/resources/dax-subnetgroups.go @@ -1,10 +1,10 @@ package resources import ( + "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/dax" - "fmt" ) type DAXSubnetGroup struct { diff --git a/resources/dynamodb-tables.go b/resources/dynamodb-tables.go index 04a57fa1..cb191e61 100644 --- a/resources/dynamodb-tables.go +++ b/resources/dynamodb-tables.go @@ -34,8 +34,8 @@ func ListDynamoDBTables(sess *session.Session) ([]Resource, error) { } resources = append(resources, &DynamoDBTable{ - svc: svc, - id: *tableName, + svc: svc, + id: *tableName, tags: tags, }) } @@ -65,7 +65,7 @@ func GetTableTags(svc *dynamodb.DynamoDB, tableName *string) ([]*dynamodb.Tag, e return make([]*dynamodb.Tag, 0), err } - tags, err := svc.ListTagsOfResource(&dynamodb.ListTagsOfResourceInput{ + tags, err := svc.ListTagsOfResource(&dynamodb.ListTagsOfResourceInput{ ResourceArn: result.Table.TableArn, }) @@ -77,17 +77,16 @@ func GetTableTags(svc *dynamodb.DynamoDB, tableName *string) ([]*dynamodb.Tag, e } func (i *DynamoDBTable) Properties() types.Properties { - properties := types.NewProperties() - properties.Set("Identifier", i.id) + properties := types.NewProperties() + properties.Set("Identifier", i.id) - for _, tag := range i.tags { - properties.SetTag(tag.Key, tag.Value) - } + for _, tag := range i.tags { + properties.SetTag(tag.Key, tag.Value) + } - return properties + return properties } - func (i *DynamoDBTable) String() string { return i.id } diff --git a/resources/ec2-vpn-connections.go b/resources/ec2-vpn-connections.go index be78228b..2ca1054b 100644 --- a/resources/ec2-vpn-connections.go +++ b/resources/ec2-vpn-connections.go @@ -9,8 +9,8 @@ import ( ) type EC2VPNConnection struct { - svc *ec2.EC2 - conn *ec2.VpnConnection + svc *ec2.EC2 + conn *ec2.VpnConnection } func init() { @@ -29,8 +29,8 @@ func ListEC2VPNConnections(sess *session.Session) ([]Resource, error) { resources := make([]Resource, 0) for _, out := range resp.VpnConnections { resources = append(resources, &EC2VPNConnection{ - svc: svc, - conn: out, + svc: svc, + conn: out, }) } diff --git a/resources/iam-policies.go b/resources/iam-policies.go index d4db7bec..ece41af3 100644 --- a/resources/iam-policies.go +++ b/resources/iam-policies.go @@ -1,11 +1,11 @@ package resources import ( - "github.com/sirupsen/logrus" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/iam" "github.com/rebuy-de/aws-nuke/v2/pkg/types" + "github.com/sirupsen/logrus" ) type IAMPolicy struct { diff --git a/resources/rds-clusters.go b/resources/rds-clusters.go index 88271251..686a7961 100644 --- a/resources/rds-clusters.go +++ b/resources/rds-clusters.go @@ -30,12 +30,12 @@ func ListRDSClusters(sess *session.Session) ([]Resource, error) { resources := make([]Resource, 0) for _, instance := range resp.DBClusters { tags, err := svc.ListTagsForResource(&rds.ListTagsForResourceInput{ - ResourceName: instance.DBClusterArn, - }) + ResourceName: instance.DBClusterArn, + }) - if err != nil { - continue - } + if err != nil { + continue + } resources = append(resources, &RDSDBCluster{ svc: svc, @@ -49,7 +49,7 @@ func ListRDSClusters(sess *session.Session) ([]Resource, error) { } func (i *RDSDBCluster) Remove() error { - if (i.deletionProtection) { + if i.deletionProtection { modifyParams := &rds.ModifyDBClusterInput{ DBClusterIdentifier: &i.id, DeletionProtection: aws.Bool(false), @@ -78,13 +78,13 @@ func (i *RDSDBCluster) String() string { } func (i *RDSDBCluster) Properties() types.Properties { - properties := types.NewProperties() - properties.Set("Identifier", i.id) + properties := types.NewProperties() + properties.Set("Identifier", i.id) properties.Set("Deletion Protection", i.deletionProtection) - for _, tag := range i.tags { - properties.SetTag(tag.Key, tag.Value) - } + for _, tag := range i.tags { + properties.SetTag(tag.Key, tag.Value) + } - return properties + return properties } diff --git a/resources/rds-dbclusterparametergroups.go b/resources/rds-dbclusterparametergroups.go index 9466d8c5..04a53af3 100644 --- a/resources/rds-dbclusterparametergroups.go +++ b/resources/rds-dbclusterparametergroups.go @@ -31,12 +31,12 @@ func ListRDSClusterParameterGroups(sess *session.Session) ([]Resource, error) { var resources []Resource for _, parametergroup := range resp.DBClusterParameterGroups { tags, err := svc.ListTagsForResource(&rds.ListTagsForResourceInput{ - ResourceName: parametergroup.DBClusterParameterGroupArn, - }) + ResourceName: parametergroup.DBClusterParameterGroupArn, + }) - if err != nil { - continue - } + if err != nil { + continue + } resources = append(resources, &RDSDBClusterParameterGroup{ svc: svc, diff --git a/resources/rds-subnets.go b/resources/rds-subnets.go index 17978a19..017a2c29 100644 --- a/resources/rds-subnets.go +++ b/resources/rds-subnets.go @@ -28,12 +28,12 @@ func ListRDSSubnetGroups(sess *session.Session) ([]Resource, error) { var resources []Resource for _, subnetGroup := range resp.DBSubnetGroups { tags, err := svc.ListTagsForResource(&rds.ListTagsForResourceInput{ - ResourceName: subnetGroup.DBSubnetGroupArn, - }) + ResourceName: subnetGroup.DBSubnetGroupArn, + }) - if err != nil { - continue - } + if err != nil { + continue + } resources = append(resources, &RDSDBSubnetGroup{ svc: svc, @@ -64,12 +64,12 @@ func (i *RDSDBSubnetGroup) String() string { } func (i *RDSDBSubnetGroup) Properties() types.Properties { - properties := types.NewProperties() - properties.Set("Name", i.name) + properties := types.NewProperties() + properties.Set("Name", i.name) - for _, tag := range i.tags { - properties.SetTag(tag.Key, tag.Value) - } + for _, tag := range i.tags { + properties.SetTag(tag.Key, tag.Value) + } - return properties + return properties } diff --git a/resources/redshift-subnetgroups.go b/resources/redshift-subnetgroups.go index a94600c1..767eb0f6 100644 --- a/resources/redshift-subnetgroups.go +++ b/resources/redshift-subnetgroups.go @@ -31,7 +31,7 @@ func ListRedshiftSubnetGroups(sess *session.Session) ([]Resource, error) { for _, subnetGroup := range output.ClusterSubnetGroups { resources = append(resources, &RedshiftSubnetGroup{ - svc: svc, + svc: svc, clusterSubnetGroupName: subnetGroup.ClusterSubnetGroupName, }) } diff --git a/resources/route53-resource-records.go b/resources/route53-resource-records.go index 35f3bc79..c21cfd3f 100644 --- a/resources/route53-resource-records.go +++ b/resources/route53-resource-records.go @@ -95,7 +95,7 @@ func (r *Route53ResourceRecordSet) Remove() error { HostedZoneId: r.hostedZoneId, ChangeBatch: &route53.ChangeBatch{ Changes: []*route53.Change{ - &route53.Change{ + { Action: aws.String("DELETE"), ResourceRecordSet: r.data, }, diff --git a/resources/wafregional-byte-match-set-tuples.go b/resources/wafregional-byte-match-set-tuples.go index ddf7966f..45ba6225 100644 --- a/resources/wafregional-byte-match-set-tuples.go +++ b/resources/wafregional-byte-match-set-tuples.go @@ -70,7 +70,7 @@ func (r *WAFRegionalByteMatchSetIP) Remove() error { ChangeToken: tokenOutput.ChangeToken, ByteMatchSetId: r.matchSetid, Updates: []*waf.ByteMatchSetUpdate{ - &waf.ByteMatchSetUpdate{ + { Action: aws.String("DELETE"), ByteMatchTuple: r.tuple, }, diff --git a/resources/wafregional-ip-set-ips.go b/resources/wafregional-ip-set-ips.go index 6ad754cc..875668a2 100644 --- a/resources/wafregional-ip-set-ips.go +++ b/resources/wafregional-ip-set-ips.go @@ -70,7 +70,7 @@ func (r *WAFRegionalIPSetIP) Remove() error { ChangeToken: tokenOutput.ChangeToken, IPSetId: r.ipSetid, Updates: []*waf.IPSetUpdate{ - &waf.IPSetUpdate{ + { Action: aws.String("DELETE"), IPSetDescriptor: r.descriptor, }, diff --git a/resources/wafregional-rate-based-rule-predicates.go b/resources/wafregional-rate-based-rule-predicates.go index 67319a56..630387d6 100644 --- a/resources/wafregional-rate-based-rule-predicates.go +++ b/resources/wafregional-rate-based-rule-predicates.go @@ -72,7 +72,7 @@ func (r *WAFRegionalRateBasedRulePredicate) Remove() error { RuleId: r.ruleID, RateLimit: r.rateLimit, Updates: []*waf.RuleUpdate{ - &waf.RuleUpdate{ + { Action: aws.String("DELETE"), Predicate: r.predicate, }, diff --git a/resources/wafregional-regex-match-tuples.go b/resources/wafregional-regex-match-tuples.go index f2a9ebaf..5095bfda 100644 --- a/resources/wafregional-regex-match-tuples.go +++ b/resources/wafregional-regex-match-tuples.go @@ -69,7 +69,7 @@ func (r *WAFRegionalRegexMatchTuple) Remove() error { ChangeToken: tokenOutput.ChangeToken, RegexMatchSetId: r.matchSetid, Updates: []*waf.RegexMatchSetUpdate{ - &waf.RegexMatchSetUpdate{ + { Action: aws.String("DELETE"), RegexMatchTuple: r.tuple, }, diff --git a/resources/wafregional-regex-pattern-tuples.go b/resources/wafregional-regex-pattern-tuples.go index 9c7d8dea..3a0c8422 100644 --- a/resources/wafregional-regex-pattern-tuples.go +++ b/resources/wafregional-regex-pattern-tuples.go @@ -69,7 +69,7 @@ func (r *WAFRegionalRegexPatternString) Remove() error { ChangeToken: tokenOutput.ChangeToken, RegexPatternSetId: r.patternSetid, Updates: []*waf.RegexPatternSetUpdate{ - &waf.RegexPatternSetUpdate{ + { Action: aws.String("DELETE"), RegexPatternString: r.patternString, }, diff --git a/resources/wafregional-rule-predicates.go b/resources/wafregional-rule-predicates.go index d7713c20..6c9a9adf 100644 --- a/resources/wafregional-rule-predicates.go +++ b/resources/wafregional-rule-predicates.go @@ -69,7 +69,7 @@ func (r *WAFRegionalRulePredicate) Remove() error { ChangeToken: tokenOutput.ChangeToken, RuleId: r.ruleID, Updates: []*waf.RuleUpdate{ - &waf.RuleUpdate{ + { Action: aws.String("DELETE"), Predicate: r.predicate, }, diff --git a/tools/tools.go b/tools/tools.go index 6f89b957..356e8982 100644 --- a/tools/tools.go +++ b/tools/tools.go @@ -1,4 +1,4 @@ -// +build tools +//go:build tools package main From 2bef99a0b0aa9cb4e405c260c180e71ffd6419c8 Mon Sep 17 00:00:00 2001 From: Taylor Barrella Date: Wed, 2 Aug 2023 06:39:21 -0700 Subject: [PATCH 037/135] appconfig: add support for five resources (#1055) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Taylor Barrella Co-authored-by: Björn Häuser --- resources/appconfig-applications.go | 53 ++++++++++++++ resources/appconfig-configurationprofiles.go | 70 ++++++++++++++++++ resources/appconfig-deploymentstrategies.go | 53 ++++++++++++++ resources/appconfig-environments.go | 70 ++++++++++++++++++ .../appconfig-hostedconfigurationversions.go | 72 +++++++++++++++++++ 5 files changed, 318 insertions(+) create mode 100644 resources/appconfig-applications.go create mode 100644 resources/appconfig-configurationprofiles.go create mode 100644 resources/appconfig-deploymentstrategies.go create mode 100644 resources/appconfig-environments.go create mode 100644 resources/appconfig-hostedconfigurationversions.go diff --git a/resources/appconfig-applications.go b/resources/appconfig-applications.go new file mode 100644 index 00000000..cb419dec --- /dev/null +++ b/resources/appconfig-applications.go @@ -0,0 +1,53 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/appconfig" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type AppConfigApplication struct { + svc *appconfig.AppConfig + id *string + name *string +} + +func init() { + register("AppConfigApplication", ListAppConfigApplications) +} + +func ListAppConfigApplications(sess *session.Session) ([]Resource, error) { + svc := appconfig.New(sess) + resources := []Resource{} + params := &appconfig.ListApplicationsInput{ + MaxResults: aws.Int64(100), + } + err := svc.ListApplicationsPages(params, func(page *appconfig.ListApplicationsOutput, lastPage bool) bool { + for _, item := range page.Items { + resources = append(resources, &AppConfigApplication{ + svc: svc, + id: item.Id, + name: item.Name, + }) + } + return true + }) + if err != nil { + return nil, err + } + return resources, nil +} + +func (f *AppConfigApplication) Remove() error { + _, err := f.svc.DeleteApplication(&appconfig.DeleteApplicationInput{ + ApplicationId: f.id, + }) + return err +} + +func (f *AppConfigApplication) Properties() types.Properties { + return types.NewProperties(). + Set("ID", f.id). + Set("Name", f.name) +} diff --git a/resources/appconfig-configurationprofiles.go b/resources/appconfig-configurationprofiles.go new file mode 100644 index 00000000..79efd01c --- /dev/null +++ b/resources/appconfig-configurationprofiles.go @@ -0,0 +1,70 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/appconfig" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" + "github.com/sirupsen/logrus" +) + +type AppConfigConfigurationProfile struct { + svc *appconfig.AppConfig + applicationId *string + id *string + name *string +} + +func init() { + register("AppConfigConfigurationProfile", ListAppConfigConfigurationProfiles) +} + +func ListAppConfigConfigurationProfiles(sess *session.Session) ([]Resource, error) { + svc := appconfig.New(sess) + resources := []Resource{} + applications, err := ListAppConfigApplications(sess) + if err != nil { + return nil, err + } + for _, applicationResource := range applications { + application, ok := applicationResource.(*AppConfigApplication) + if !ok { + logrus.Errorf("Unable to cast AppConfigApplication.") + continue + } + params := &appconfig.ListConfigurationProfilesInput{ + ApplicationId: application.id, + MaxResults: aws.Int64(100), + } + err := svc.ListConfigurationProfilesPages(params, func(page *appconfig.ListConfigurationProfilesOutput, lastPage bool) bool { + for _, item := range page.Items { + resources = append(resources, &AppConfigConfigurationProfile{ + svc: svc, + applicationId: application.id, + id: item.Id, + name: item.Name, + }) + } + return true + }) + if err != nil { + return nil, err + } + } + return resources, nil +} + +func (f *AppConfigConfigurationProfile) Remove() error { + _, err := f.svc.DeleteConfigurationProfile(&appconfig.DeleteConfigurationProfileInput{ + ApplicationId: f.applicationId, + ConfigurationProfileId: f.id, + }) + return err +} + +func (f *AppConfigConfigurationProfile) Properties() types.Properties { + return types.NewProperties(). + Set("ApplicationID", f.applicationId). + Set("ID", f.id). + Set("Name", f.name) +} diff --git a/resources/appconfig-deploymentstrategies.go b/resources/appconfig-deploymentstrategies.go new file mode 100644 index 00000000..670cb09d --- /dev/null +++ b/resources/appconfig-deploymentstrategies.go @@ -0,0 +1,53 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/appconfig" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type AppConfigDeploymentStrategy struct { + svc *appconfig.AppConfig + id *string + name *string +} + +func init() { + register("AppConfigDeploymentStrategy", ListAppConfigDeploymentStrategies) +} + +func ListAppConfigDeploymentStrategies(sess *session.Session) ([]Resource, error) { + svc := appconfig.New(sess) + resources := []Resource{} + params := &appconfig.ListDeploymentStrategiesInput{ + MaxResults: aws.Int64(100), + } + err := svc.ListDeploymentStrategiesPages(params, func(page *appconfig.ListDeploymentStrategiesOutput, lastPage bool) bool { + for _, item := range page.Items { + resources = append(resources, &AppConfigDeploymentStrategy{ + svc: svc, + id: item.Id, + name: item.Name, + }) + } + return true + }) + if err != nil { + return nil, err + } + return resources, nil +} + +func (f *AppConfigDeploymentStrategy) Remove() error { + _, err := f.svc.DeleteDeploymentStrategy(&appconfig.DeleteDeploymentStrategyInput{ + DeploymentStrategyId: f.id, + }) + return err +} + +func (f *AppConfigDeploymentStrategy) Properties() types.Properties { + return types.NewProperties(). + Set("ID", f.id). + Set("Name", f.name) +} diff --git a/resources/appconfig-environments.go b/resources/appconfig-environments.go new file mode 100644 index 00000000..d12015a7 --- /dev/null +++ b/resources/appconfig-environments.go @@ -0,0 +1,70 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/appconfig" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" + "github.com/sirupsen/logrus" +) + +type AppConfigEnvironment struct { + svc *appconfig.AppConfig + applicationId *string + id *string + name *string +} + +func init() { + register("AppConfigEnvironment", ListAppConfigEnvironments) +} + +func ListAppConfigEnvironments(sess *session.Session) ([]Resource, error) { + svc := appconfig.New(sess) + resources := []Resource{} + applications, err := ListAppConfigApplications(sess) + if err != nil { + return nil, err + } + for _, applicationResource := range applications { + application, ok := applicationResource.(*AppConfigApplication) + if !ok { + logrus.Errorf("Unable to cast AppConfigApplication.") + continue + } + params := &appconfig.ListEnvironmentsInput{ + ApplicationId: application.id, + MaxResults: aws.Int64(100), + } + err := svc.ListEnvironmentsPages(params, func(page *appconfig.ListEnvironmentsOutput, lastPage bool) bool { + for _, item := range page.Items { + resources = append(resources, &AppConfigEnvironment{ + svc: svc, + applicationId: application.id, + id: item.Id, + name: item.Name, + }) + } + return true + }) + if err != nil { + return nil, err + } + } + return resources, nil +} + +func (f *AppConfigEnvironment) Remove() error { + _, err := f.svc.DeleteEnvironment(&appconfig.DeleteEnvironmentInput{ + ApplicationId: f.applicationId, + EnvironmentId: f.id, + }) + return err +} + +func (f *AppConfigEnvironment) Properties() types.Properties { + return types.NewProperties(). + Set("ApplicationID", f.applicationId). + Set("ID", f.id). + Set("Name", f.name) +} diff --git a/resources/appconfig-hostedconfigurationversions.go b/resources/appconfig-hostedconfigurationversions.go new file mode 100644 index 00000000..6fff16c1 --- /dev/null +++ b/resources/appconfig-hostedconfigurationversions.go @@ -0,0 +1,72 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/appconfig" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" + "github.com/sirupsen/logrus" +) + +type AppConfigHostedConfigurationVersion struct { + svc *appconfig.AppConfig + applicationId *string + configurationProfileId *string + versionNumber *int64 +} + +func init() { + register("AppConfigHostedConfigurationVersion", ListAppConfigHostedConfigurationVersions) +} + +func ListAppConfigHostedConfigurationVersions(sess *session.Session) ([]Resource, error) { + svc := appconfig.New(sess) + resources := []Resource{} + configurationProfiles, err := ListAppConfigConfigurationProfiles(sess) + if err != nil { + return nil, err + } + for _, configurationProfileResource := range configurationProfiles { + configurationProfile, ok := configurationProfileResource.(*AppConfigConfigurationProfile) + if !ok { + logrus.Errorf("Unable to cast AppConfigConfigurationProfile.") + continue + } + params := &appconfig.ListHostedConfigurationVersionsInput{ + ApplicationId: configurationProfile.applicationId, + ConfigurationProfileId: configurationProfile.id, + MaxResults: aws.Int64(100), + } + err := svc.ListHostedConfigurationVersionsPages(params, func(page *appconfig.ListHostedConfigurationVersionsOutput, lastPage bool) bool { + for _, item := range page.Items { + resources = append(resources, &AppConfigHostedConfigurationVersion{ + svc: svc, + applicationId: configurationProfile.applicationId, + configurationProfileId: configurationProfile.id, + versionNumber: item.VersionNumber, + }) + } + return true + }) + if err != nil { + return nil, err + } + } + return resources, nil +} + +func (f *AppConfigHostedConfigurationVersion) Remove() error { + _, err := f.svc.DeleteHostedConfigurationVersion(&appconfig.DeleteHostedConfigurationVersionInput{ + ApplicationId: f.applicationId, + ConfigurationProfileId: f.configurationProfileId, + VersionNumber: f.versionNumber, + }) + return err +} + +func (f *AppConfigHostedConfigurationVersion) Properties() types.Properties { + return types.NewProperties(). + Set("ApplicationID", f.applicationId). + Set("ConfigurationProfileID", f.configurationProfileId). + Set("VersionNumber", f.versionNumber) +} From 90ad6c49bb11f108b733518834c171bac0f40338 Mon Sep 17 00:00:00 2001 From: Taylor Barrella Date: Wed, 2 Aug 2023 07:59:33 -0700 Subject: [PATCH 038/135] ecs: list all services, not just 10 (#1056) Signed-off-by: Taylor Barrella --- resources/ecs-services.go | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/resources/ecs-services.go b/resources/ecs-services.go index d5a3792e..d53a669d 100644 --- a/resources/ecs-services.go +++ b/resources/ecs-services.go @@ -52,24 +52,19 @@ func ListECSServices(sess *session.Session) ([]Resource, error) { Cluster: clusterArn, MaxResults: aws.Int64(10), } - output, err := svc.ListServices(serviceParams) + err := svc.ListServicesPages(serviceParams, func(page *ecs.ListServicesOutput, lastPage bool) bool { + for _, serviceArn := range page.ServiceArns { + resources = append(resources, &ECSService{ + svc: svc, + serviceARN: serviceArn, + clusterARN: clusterArn, + }) + } + return true + }) if err != nil { return nil, err } - - for _, serviceArn := range output.ServiceArns { - resources = append(resources, &ECSService{ - svc: svc, - serviceARN: serviceArn, - clusterARN: clusterArn, - }) - } - - if output.NextToken == nil { - continue - } - - serviceParams.NextToken = output.NextToken } return resources, nil From d01537a990b42510428c16da422fe55d2fe92102 Mon Sep 17 00:00:00 2001 From: Mike Schouw <49021968+MikeSchouw@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:33:54 +0200 Subject: [PATCH 039/135] Adding CloudFrontOriginRequestPolicy resources. (#1051) * Adding CloudFrontOriginRequestPolicy resources. --------- Co-authored-by: Philipp Trulson --- resources/cloudfront-origin-request-policy.go | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 resources/cloudfront-origin-request-policy.go diff --git a/resources/cloudfront-origin-request-policy.go b/resources/cloudfront-origin-request-policy.go new file mode 100644 index 00000000..13e24718 --- /dev/null +++ b/resources/cloudfront-origin-request-policy.go @@ -0,0 +1,68 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/cloudfront" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CloudFrontOriginRequestPolicy struct { + svc *cloudfront.CloudFront + ID *string +} + +func init() { + register("CloudFrontOriginRequestPolicy", ListCloudFrontOriginRequestPolicies) +} + +func ListCloudFrontOriginRequestPolicies(sess *session.Session) ([]Resource, error) { + svc := cloudfront.New(sess) + resources := []Resource{} + params := &cloudfront.ListOriginRequestPoliciesInput{} + + for { + resp, err := svc.ListOriginRequestPolicies(params) + if err != nil { + return nil, err + } + + for _, item := range resp.OriginRequestPolicyList.Items { + if *item.Type == "custom" { + resources = append(resources, &CloudFrontOriginRequestPolicy{ + svc: svc, + ID: item.OriginRequestPolicy.Id, + }) + } + } + + if resp.OriginRequestPolicyList.NextMarker == nil { + break + } + + params.Marker = resp.OriginRequestPolicyList.NextMarker + } + + return resources, nil +} + +func (f *CloudFrontOriginRequestPolicy) Remove() error { + resp, err := f.svc.GetOriginRequestPolicy(&cloudfront.GetOriginRequestPolicyInput{ + Id: f.ID, + }) + if err != nil { + return err + } + + _, err = f.svc.DeleteOriginRequestPolicy(&cloudfront.DeleteOriginRequestPolicyInput{ + Id: f.ID, + IfMatch: resp.ETag, + }) + + return err +} + +func (f *CloudFrontOriginRequestPolicy) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("ID", f.ID) + return properties +} From 4d7b18b5c2e5e09031fa0e2c6a6bbc678f74ebef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 10:31:16 +0200 Subject: [PATCH 040/135] Bump github.com/aws/aws-sdk-go from 1.44.313 to 1.44.318 (#1066) Bumps [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) from 1.44.313 to 1.44.318. - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.44.313...v1.44.318) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6d85b7fc..17cdefb2 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.19 require ( - github.com/aws/aws-sdk-go v1.44.313 + github.com/aws/aws-sdk-go v1.44.318 github.com/fatih/color v1.15.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index 27e14038..4a34ed1b 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.44.313 h1:u6EuNQqgAmi09GEZ5g/XGHLF0XV31WcdU5rnHyIBHBc= -github.com/aws/aws-sdk-go v1.44.313/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.318 h1:Yl66rpbQHFUbxe9JBKLcvOvRivhVgP6+zH0b9KzARX8= +github.com/aws/aws-sdk-go v1.44.318/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 42a68a37cb36e064f2f2a865d3f79e0b99d5af3e Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Tue, 15 Aug 2023 13:16:49 +0200 Subject: [PATCH 041/135] Group Golang dependabot updates (#1070) > This is an automatically generated PR. @rebuy-de/ FYI --- .github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 31c447e7..91d476ed 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,3 +9,7 @@ updates: day: "tuesday" time: "10:00" timezone: "Europe/Berlin" + groups: + golang: + patterns: + - "*" From df499d5c0243c8d537741ff2b2d6e98e7f163fb8 Mon Sep 17 00:00:00 2001 From: leighpascoe <88387687+leighpascoe@users.noreply.github.com> Date: Tue, 15 Aug 2023 07:22:00 -0400 Subject: [PATCH 042/135] Filter main route tables (#953) * Filter main route table * use `Filter` instead of custom method --- resources/ec2-route-tables.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/ec2-route-tables.go b/resources/ec2-route-tables.go index e8313c36..175e7a5c 100644 --- a/resources/ec2-route-tables.go +++ b/resources/ec2-route-tables.go @@ -1,6 +1,8 @@ package resources import ( + "fmt" + "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/ec2" "github.com/rebuy-de/aws-nuke/v2/pkg/types" @@ -41,6 +43,16 @@ func ListEC2RouteTables(sess *session.Session) ([]Resource, error) { return resources, nil } +func (i *EC2RouteTable) Filter() error { + + for _, association := range i.routeTable.Associations { + if *association.Main { + return fmt.Errorf("Main RouteTables cannot be deleted") + } + } + return nil +} + func (e *EC2RouteTable) Remove() error { params := &ec2.DeleteRouteTableInput{ RouteTableId: e.routeTable.RouteTableId, From 955a8f438918b33105f116c0bd3dc55feb5a6e1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 13:33:16 +0200 Subject: [PATCH 043/135] Bump the golang group with 1 update (#1071) Bumps the golang group with 1 update: [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go). - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.44.318...v1.44.323) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-patch dependency-group: golang ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 17cdefb2..369133b8 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.19 require ( - github.com/aws/aws-sdk-go v1.44.318 + github.com/aws/aws-sdk-go v1.44.323 github.com/fatih/color v1.15.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index 4a34ed1b..f560e1ea 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.44.318 h1:Yl66rpbQHFUbxe9JBKLcvOvRivhVgP6+zH0b9KzARX8= -github.com/aws/aws-sdk-go v1.44.318/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.323 h1:97/dn93DWrN1VfhAWQ2tV+xuE6oO/LO9rSsEsuC4PLU= +github.com/aws/aws-sdk-go v1.44.323/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 96d3e609aa23f709dbf563b97b462bc099ec6f9c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 15:39:20 +0200 Subject: [PATCH 044/135] Update readme for v2.24.0 release (#1072) Co-authored-by: der-eismann --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b7b122aa..ef78135e 100644 --- a/README.md +++ b/README.md @@ -612,10 +612,10 @@ The easiest way of installing it, is to download the latest #### Example for Linux Intel/AMD Download and extract -`$ wget -c https://github.com/rebuy-de/aws-nuke/releases/download/v2.23.0/aws-nuke-v2.23.0-linux-amd64.tar.gz -O - | tar -xz -C $HOME/bin` +`$ wget -c https://github.com/rebuy-de/aws-nuke/releases/download/v2.24.0/aws-nuke-v2.24.0-linux-amd64.tar.gz -O - | tar -xz -C $HOME/bin` Run -`$ aws-nuke-v2.23.0-linux-amd64` +`$ aws-nuke-v2.24.0-linux-amd64` ### Compile from Source @@ -639,7 +639,7 @@ $ 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.23.0 \ + quay.io/rebuy/aws-nuke:v2.24.0 \ --profile default \ --config /home/aws-nuke/config.yml ``` From b873fb3ccde645d1a759289fa85eec329ec49b73 Mon Sep 17 00:00:00 2001 From: Taylor Barrella Date: Wed, 16 Aug 2023 00:48:10 -0700 Subject: [PATCH 045/135] app config: fix max results 100 -> 50 (#1075) --- resources/appconfig-applications.go | 2 +- resources/appconfig-configurationprofiles.go | 2 +- resources/appconfig-deploymentstrategies.go | 2 +- resources/appconfig-environments.go | 2 +- resources/appconfig-hostedconfigurationversions.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/appconfig-applications.go b/resources/appconfig-applications.go index cb419dec..832e49b5 100644 --- a/resources/appconfig-applications.go +++ b/resources/appconfig-applications.go @@ -21,7 +21,7 @@ func ListAppConfigApplications(sess *session.Session) ([]Resource, error) { svc := appconfig.New(sess) resources := []Resource{} params := &appconfig.ListApplicationsInput{ - MaxResults: aws.Int64(100), + MaxResults: aws.Int64(50), } err := svc.ListApplicationsPages(params, func(page *appconfig.ListApplicationsOutput, lastPage bool) bool { for _, item := range page.Items { diff --git a/resources/appconfig-configurationprofiles.go b/resources/appconfig-configurationprofiles.go index 79efd01c..ef7b9b0d 100644 --- a/resources/appconfig-configurationprofiles.go +++ b/resources/appconfig-configurationprofiles.go @@ -34,7 +34,7 @@ func ListAppConfigConfigurationProfiles(sess *session.Session) ([]Resource, erro } params := &appconfig.ListConfigurationProfilesInput{ ApplicationId: application.id, - MaxResults: aws.Int64(100), + MaxResults: aws.Int64(50), } err := svc.ListConfigurationProfilesPages(params, func(page *appconfig.ListConfigurationProfilesOutput, lastPage bool) bool { for _, item := range page.Items { diff --git a/resources/appconfig-deploymentstrategies.go b/resources/appconfig-deploymentstrategies.go index 670cb09d..c88d103e 100644 --- a/resources/appconfig-deploymentstrategies.go +++ b/resources/appconfig-deploymentstrategies.go @@ -21,7 +21,7 @@ func ListAppConfigDeploymentStrategies(sess *session.Session) ([]Resource, error svc := appconfig.New(sess) resources := []Resource{} params := &appconfig.ListDeploymentStrategiesInput{ - MaxResults: aws.Int64(100), + MaxResults: aws.Int64(50), } err := svc.ListDeploymentStrategiesPages(params, func(page *appconfig.ListDeploymentStrategiesOutput, lastPage bool) bool { for _, item := range page.Items { diff --git a/resources/appconfig-environments.go b/resources/appconfig-environments.go index d12015a7..093f6704 100644 --- a/resources/appconfig-environments.go +++ b/resources/appconfig-environments.go @@ -34,7 +34,7 @@ func ListAppConfigEnvironments(sess *session.Session) ([]Resource, error) { } params := &appconfig.ListEnvironmentsInput{ ApplicationId: application.id, - MaxResults: aws.Int64(100), + MaxResults: aws.Int64(50), } err := svc.ListEnvironmentsPages(params, func(page *appconfig.ListEnvironmentsOutput, lastPage bool) bool { for _, item := range page.Items { diff --git a/resources/appconfig-hostedconfigurationversions.go b/resources/appconfig-hostedconfigurationversions.go index 6fff16c1..e3fe4d4b 100644 --- a/resources/appconfig-hostedconfigurationversions.go +++ b/resources/appconfig-hostedconfigurationversions.go @@ -35,7 +35,7 @@ func ListAppConfigHostedConfigurationVersions(sess *session.Session) ([]Resource params := &appconfig.ListHostedConfigurationVersionsInput{ ApplicationId: configurationProfile.applicationId, ConfigurationProfileId: configurationProfile.id, - MaxResults: aws.Int64(100), + MaxResults: aws.Int64(50), } err := svc.ListHostedConfigurationVersionsPages(params, func(page *appconfig.ListHostedConfigurationVersionsOutput, lastPage bool) bool { for _, item := range page.Items { From f4030b9761f2a875870f2b7f67f347c5bf97b329 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 16 Aug 2023 09:50:03 +0200 Subject: [PATCH 046/135] Update readme for v2.24.1 release (#1076) Co-authored-by: der-eismann --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ef78135e..8395671e 100644 --- a/README.md +++ b/README.md @@ -612,10 +612,10 @@ The easiest way of installing it, is to download the latest #### Example for Linux Intel/AMD Download and extract -`$ wget -c https://github.com/rebuy-de/aws-nuke/releases/download/v2.24.0/aws-nuke-v2.24.0-linux-amd64.tar.gz -O - | tar -xz -C $HOME/bin` +`$ wget -c https://github.com/rebuy-de/aws-nuke/releases/download/v2.24.1/aws-nuke-v2.24.1-linux-amd64.tar.gz -O - | tar -xz -C $HOME/bin` Run -`$ aws-nuke-v2.24.0-linux-amd64` +`$ aws-nuke-v2.24.1-linux-amd64` ### Compile from Source @@ -639,7 +639,7 @@ $ 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.24.0 \ + quay.io/rebuy/aws-nuke:v2.24.1 \ --profile default \ --config /home/aws-nuke/config.yml ``` From b044caf3e9c04aed7fb49d36e4e7a4a425a7ad68 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Thu, 17 Aug 2023 09:17:29 -0500 Subject: [PATCH 047/135] Updating detection filters. Adding `Completed` to the job status types that are ignored upon cleanup. --- resources/comprehend_entities_detection_job.go | 6 +++--- resources/comprehend_sentiment_detection_job.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/comprehend_entities_detection_job.go b/resources/comprehend_entities_detection_job.go index 3ae80484..8baecc7a 100644 --- a/resources/comprehend_entities_detection_job.go +++ b/resources/comprehend_entities_detection_job.go @@ -22,9 +22,9 @@ func ListComprehendEntitiesDetectionJobs(sess *session.Session) ([]Resource, err return nil, err } for _, entitiesDetectionJob := range resp.EntitiesDetectionJobPropertiesList { - if *entitiesDetectionJob.JobStatus == "STOPPED" || - *entitiesDetectionJob.JobStatus == "FAILED" { - // if the job has already been stopped, do not try to delete it again + switch *entitiesDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again continue } resources = append(resources, &ComprehendEntitiesDetectionJob{ diff --git a/resources/comprehend_sentiment_detection_job.go b/resources/comprehend_sentiment_detection_job.go index eddd2041..835e8233 100644 --- a/resources/comprehend_sentiment_detection_job.go +++ b/resources/comprehend_sentiment_detection_job.go @@ -22,9 +22,9 @@ func ListComprehendSentimentDetectionJobs(sess *session.Session) ([]Resource, er return nil, err } for _, sentimentDetectionJob := range resp.SentimentDetectionJobPropertiesList { - if *sentimentDetectionJob.JobStatus == "STOPPED" || - *sentimentDetectionJob.JobStatus == "FAILED" { - // if the job has already been stopped, do not try to delete it again + switch *sentimentDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again continue } resources = append(resources, &ComprehendSentimentDetectionJob{ From 3472f9d900891166787a5b31adf13dcd54bce58c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 10:56:09 +0200 Subject: [PATCH 048/135] Bump the golang group with 2 updates (#1080) Bumps the golang group with 2 updates: [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) and [github.com/google/uuid](https://github.com/google/uuid). Updates `github.com/aws/aws-sdk-go` from 1.44.323 to 1.44.328 - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.44.323...v1.44.328) Updates `github.com/google/uuid` from 1.3.0 to 1.3.1 - [Release notes](https://github.com/google/uuid/releases) - [Changelog](https://github.com/google/uuid/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/uuid/compare/v1.3.0...v1.3.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-patch dependency-group: golang - dependency-name: github.com/google/uuid dependency-type: direct:production update-type: version-update:semver-patch dependency-group: golang ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 369133b8..562f1cc2 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.19 require ( - github.com/aws/aws-sdk-go v1.44.323 + github.com/aws/aws-sdk-go v1.44.328 github.com/fatih/color v1.15.0 github.com/golang/mock v1.6.0 - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.3.1 github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4 github.com/pkg/errors v0.9.1 github.com/rebuy-de/rebuy-go-sdk/v4 v4.5.1 diff --git a/go.sum b/go.sum index f560e1ea..b2066cd7 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.44.323 h1:97/dn93DWrN1VfhAWQ2tV+xuE6oO/LO9rSsEsuC4PLU= -github.com/aws/aws-sdk-go v1.44.323/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.328 h1:WBwlf8ym9SDQ/GTIBO9eXyvwappKJyOetWJKl4mT7ZU= +github.com/aws/aws-sdk-go v1.44.328/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -11,8 +11,8 @@ github.com/gemnasium/logrus-graylog-hook/v3 v3.1.0 h1:SLtCnpI5ZZaz4l7RSatEhppB1B github.com/gemnasium/logrus-graylog-hook/v3 v3.1.0/go.mod h1:wi1zWv9tIvyLSMLCAzgRP+YR24oLVQVBHfPPKjtht44= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= From db11768ffd4e5eda8510e9e3e517c4bd54829993 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Tue, 22 Aug 2023 12:10:50 -0500 Subject: [PATCH 049/135] Adding filters for key-phrases and dominant-language Adding filters for key-phrases and dominant-language --- resources/comprehend_dominant_language_detection_job.go | 5 +++++ resources/comprehend_key_phrases_detection_job.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/resources/comprehend_dominant_language_detection_job.go b/resources/comprehend_dominant_language_detection_job.go index 26bcf860..6a4a22ba 100644 --- a/resources/comprehend_dominant_language_detection_job.go +++ b/resources/comprehend_dominant_language_detection_job.go @@ -22,6 +22,11 @@ func ListComprehendDominantLanguageDetectionJobs(sess *session.Session) ([]Resou return nil, err } for _, dominantLanguageDetectionJob := range resp.DominantLanguageDetectionJobPropertiesList { + switch *dominantLanguageDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } resources = append(resources, &ComprehendDominantLanguageDetectionJob{ svc: svc, dominantLanguageDetectionJob: dominantLanguageDetectionJob, diff --git a/resources/comprehend_key_phrases_detection_job.go b/resources/comprehend_key_phrases_detection_job.go index 3a78d963..6c3009ec 100644 --- a/resources/comprehend_key_phrases_detection_job.go +++ b/resources/comprehend_key_phrases_detection_job.go @@ -22,6 +22,11 @@ func ListComprehendKeyPhrasesDetectionJobs(sess *session.Session) ([]Resource, e return nil, err } for _, keyPhrasesDetectionJob := range resp.KeyPhrasesDetectionJobPropertiesList { + switch *keyPhrasesDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } resources = append(resources, &ComprehendKeyPhrasesDetectionJob{ svc: svc, keyPhrasesDetectionJob: keyPhrasesDetectionJob, From 7b51b7f5176cdcee1bd5d3c18522a464137e7758 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Tue, 22 Aug 2023 18:48:52 -0500 Subject: [PATCH 050/135] Adding pii entitites and sentiment detection job support. --- .../comprehend_pii_entities_detection_job.go | 72 +++++++++++++++++++ ...rehend_targeted_sentiment_detection_job.go | 72 +++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 resources/comprehend_pii_entities_detection_job.go create mode 100644 resources/comprehend_targeted_sentiment_detection_job.go diff --git a/resources/comprehend_pii_entities_detection_job.go b/resources/comprehend_pii_entities_detection_job.go new file mode 100644 index 00000000..6d923461 --- /dev/null +++ b/resources/comprehend_pii_entities_detection_job.go @@ -0,0 +1,72 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/comprehend" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +func init() { + register("ComprehendPiiEntititesDetectionJob", ListComprehendPiiEntitiesDetectionJobs) +} + +func ListComprehendPiiEntitiesDetectionJobs(sess *session.Session) ([]Resource, error) { + svc := comprehend.New(sess) + + params := &comprehend.ListPiiEntitiesDetectionJobsInput{} + resources := make([]Resource, 0) + + for { + resp, err := svc.ListPiiEntitiesDetectionJobs(params) + if err != nil { + return nil, err + } + for _, piiEntititesDetectionJob := range resp.PiiEntitiesDetectionJobPropertiesList { + switch *piiEntititesDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } + resources = append(resources, &ComprehendPiiEntitiesDetectionJob{ + svc: svc, + piiEntititesDetectionJob: piiEntititesDetectionJob, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +type ComprehendPiiEntitiesDetectionJob struct { + svc *comprehend.Comprehend + piiEntititesDetectionJob *comprehend.PiiEntitiesDetectionJobProperties +} + +func (ce *ComprehendPiiEntitiesDetectionJob) Remove() error { + _, err := ce.svc.StopPiiEntitiesDetectionJob(&comprehend.StopPiiEntitiesDetectionJobInput{ + JobId: ce.piiEntititesDetectionJob.JobId, + }) + return err +} + +func (ce *ComprehendPiiEntitiesDetectionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("JobName", ce.piiEntititesDetectionJob.JobName) + properties.Set("JobId", ce.piiEntititesDetectionJob.JobId) + + return properties +} + +func (ce *ComprehendPiiEntitiesDetectionJob) String() string { + if ce.piiEntititesDetectionJob.JobName == nil { + return "Unnamed job" + } else { + return *ce.piiEntititesDetectionJob.JobName + } +} diff --git a/resources/comprehend_targeted_sentiment_detection_job.go b/resources/comprehend_targeted_sentiment_detection_job.go new file mode 100644 index 00000000..b60b39b6 --- /dev/null +++ b/resources/comprehend_targeted_sentiment_detection_job.go @@ -0,0 +1,72 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/comprehend" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +func init() { + register("ComprehendTargetedSentimentDetectionJob", ListComprehendTargetedSentimentDetectionJobs) +} + +func ListComprehendTargetedSentimentDetectionJobs(sess *session.Session) ([]Resource, error) { + svc := comprehend.New(sess) + + params := &comprehend.ListTargetedSentimentDetectionJobsInput{} + resources := make([]Resource, 0) + + for { + resp, err := svc.ListTargetedSentimentDetectionJobs(params) + if err != nil { + return nil, err + } + for _, targetedSentimentDetectionJob := range resp.TargetedSentimentDetectionJobPropertiesList { + switch *targetedSentimentDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } + resources = append(resources, &ComprehendTargetedSentimentDetectionJob{ + svc: svc, + targetedSentimentDetectionJob: targetedSentimentDetectionJob, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +type ComprehendTargetedSentimentDetectionJob struct { + svc *comprehend.Comprehend + targetedSentimentDetectionJob *comprehend.TargetedSentimentDetectionJobProperties +} + +func (ce *ComprehendTargetedSentimentDetectionJob) Remove() error { + _, err := ce.svc.StopTargetedSentimentDetectionJob(&comprehend.StopTargetedSentimentDetectionJobInput{ + JobId: ce.targetedSentimentDetectionJob.JobId, + }) + return err +} + +func (ce *ComprehendTargetedSentimentDetectionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("JobName", ce.targetedSentimentDetectionJob.JobName) + properties.Set("JobId", ce.targetedSentimentDetectionJob.JobId) + + return properties +} + +func (ce *ComprehendTargetedSentimentDetectionJob) String() string { + if ce.targetedSentimentDetectionJob.JobName == nil { + return "Unnamed job" + } else { + return *ce.targetedSentimentDetectionJob.JobName + } +} From eeb2e174e94ca391aad5328a1f9b4502b6e2c5b0 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Tue, 22 Aug 2023 18:54:15 -0500 Subject: [PATCH 051/135] Adding events detection job support. --- resources/comprehend_events_detection_job.go | 72 ++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 resources/comprehend_events_detection_job.go diff --git a/resources/comprehend_events_detection_job.go b/resources/comprehend_events_detection_job.go new file mode 100644 index 00000000..e8b303eb --- /dev/null +++ b/resources/comprehend_events_detection_job.go @@ -0,0 +1,72 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/comprehend" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +func init() { + register("ComprehendEventsDetectionJob", ListComprehendEventsDetectionJobs) +} + +func ListComprehendEventsDetectionJobs(sess *session.Session) ([]Resource, error) { + svc := comprehend.New(sess) + + params := &comprehend.ListEventsDetectionJobsInput{} + resources := make([]Resource, 0) + + for { + resp, err := svc.ListEventsDetectionJobs(params) + if err != nil { + return nil, err + } + for _, eventsDetectionJob := range resp.EventsDetectionJobPropertiesList { + switch *eventsDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } + resources = append(resources, &ComprehendEventsDetectionJob{ + svc: svc, + eventsDetectionJob: eventsDetectionJob, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +type ComprehendEventsDetectionJob struct { + svc *comprehend.Comprehend + eventsDetectionJob *comprehend.EventsDetectionJobProperties +} + +func (ce *ComprehendEventsDetectionJob) Remove() error { + _, err := ce.svc.StopEventsDetectionJob(&comprehend.StopEventsDetectionJobInput{ + JobId: ce.eventsDetectionJob.JobId, + }) + return err +} + +func (ce *ComprehendEventsDetectionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("JobName", ce.eventsDetectionJob.JobName) + properties.Set("JobId", ce.eventsDetectionJob.JobId) + + return properties +} + +func (ce *ComprehendEventsDetectionJob) String() string { + if ce.eventsDetectionJob.JobName == nil { + return "Unnamed job" + } else { + return *ce.eventsDetectionJob.JobName + } +} From 88607f3a1e9bd6adee1f0889402bff1c4beff001 Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Wed, 23 Aug 2023 16:55:55 +0200 Subject: [PATCH 052/135] Fix: Don't delete predefined deployment strategies (#1081) --- resources/appconfig-deploymentstrategies.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/appconfig-deploymentstrategies.go b/resources/appconfig-deploymentstrategies.go index c88d103e..aedf0b34 100644 --- a/resources/appconfig-deploymentstrategies.go +++ b/resources/appconfig-deploymentstrategies.go @@ -1,6 +1,9 @@ package resources import ( + "fmt" + "strings" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/appconfig" @@ -39,6 +42,13 @@ func ListAppConfigDeploymentStrategies(sess *session.Session) ([]Resource, error return resources, nil } +func (f *AppConfigDeploymentStrategy) Filter() error { + if strings.HasPrefix(*f.name, "AppConfig.") { + return fmt.Errorf("cannot delete predefined Deployment Strategy") + } + return nil +} + func (f *AppConfigDeploymentStrategy) Remove() error { _, err := f.svc.DeleteDeploymentStrategy(&appconfig.DeleteDeploymentStrategyInput{ DeploymentStrategyId: f.id, From 468e5e37b2837a9018bd12906ac9a1e82d04d9a3 Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Wed, 23 Aug 2023 17:39:17 +0200 Subject: [PATCH 053/135] Stop building ARM containers for PRs (#1082) --- .github/workflows/ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 345cd2f9..c9040de0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -59,6 +59,7 @@ jobs: id: generate_tags - name: Set up QEMU + if: github.event_name != 'pull_request' id: qemu uses: docker/setup-qemu-action@v2 with: @@ -88,4 +89,4 @@ jobs: context: . push: true tags: ${{ steps.generate_tags.outputs.tags }} - platforms: linux/amd64,linux/arm64 + platforms: ${{ github.event_name != 'pull_request' && 'linux/amd64,linux/arm64' || 'linux/amd64' }} From 158ca368c02ea0ffed86b255eab81e438a856edf Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Wed, 23 Aug 2023 17:48:49 +0200 Subject: [PATCH 054/135] Defuse unnecessary errors for unavailable services (#1083) --- resources/fms_notification_channels.go | 8 ++++++-- resources/fms_policies.go | 10 ++++++++++ resources/machinelearning-batchpredictions.go | 10 ++++++++++ resources/machinelearning-datasources.go | 10 ++++++++++ resources/machinelearning-evaluations.go | 10 ++++++++++ resources/machinelearning-mlmodels.go | 10 ++++++++++ resources/mgn-jobs.go | 5 +++++ resources/mgn-source_servers.go | 5 +++++ 8 files changed, 66 insertions(+), 2 deletions(-) diff --git a/resources/fms_notification_channels.go b/resources/fms_notification_channels.go index f7a832d0..9f70e714 100644 --- a/resources/fms_notification_channels.go +++ b/resources/fms_notification_channels.go @@ -1,10 +1,13 @@ package resources import ( + "strings" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/fms" "github.com/rebuy-de/aws-nuke/v2/pkg/types" + "github.com/sirupsen/logrus" ) type FMSNotificationChannel struct { @@ -21,8 +24,9 @@ func ListFMSNotificationChannel(sess *session.Session) ([]Resource, error) { if _, err := svc.GetNotificationChannel(&fms.GetNotificationChannelInput{}); err != nil { if aerr, ok := err.(awserr.Error); ok { - if aerr.Code() != fms.ErrCodeResourceNotFoundException { - return nil, err + if strings.Contains(aerr.Message(), "No default admin could be found") { + logrus.Infof("FMSNotificationChannel: %s. Ignore if you haven't set it up.", aerr.Message()) + return nil, nil } } else { return nil, err diff --git a/resources/fms_policies.go b/resources/fms_policies.go index f369518a..9e617673 100644 --- a/resources/fms_policies.go +++ b/resources/fms_policies.go @@ -1,10 +1,14 @@ package resources import ( + "strings" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/fms" "github.com/rebuy-de/aws-nuke/v2/pkg/types" + "github.com/sirupsen/logrus" ) type FMSPolicy struct { @@ -27,6 +31,12 @@ func ListFMSPolicies(sess *session.Session) ([]Resource, error) { for { resp, err := svc.ListPolicies(params) if err != nil { + if aerr, ok := err.(awserr.Error); ok { + if strings.Contains(aerr.Message(), "No default admin could be found") { + logrus.Infof("FMSPolicy: %s. Ignore if you haven't set it up.", aerr.Message()) + return nil, nil + } + } return nil, err } diff --git a/resources/machinelearning-batchpredictions.go b/resources/machinelearning-batchpredictions.go index 46c9977b..f9362722 100644 --- a/resources/machinelearning-batchpredictions.go +++ b/resources/machinelearning-batchpredictions.go @@ -1,9 +1,13 @@ package resources import ( + "strings" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/machinelearning" + "github.com/sirupsen/logrus" ) type MachineLearningBranchPrediction struct { @@ -26,6 +30,12 @@ func ListMachineLearningBranchPredictions(sess *session.Session) ([]Resource, er for { output, err := svc.DescribeBatchPredictions(params) if err != nil { + if aerr, ok := err.(awserr.Error); ok { + if strings.Contains(aerr.Message(), "AmazonML is no longer available to new customers") { + logrus.Info("MachineLearningBranchPrediction: AmazonML is no longer available to new customers. Ignore if you haven't set it up.") + return nil, nil + } + } return nil, err } diff --git a/resources/machinelearning-datasources.go b/resources/machinelearning-datasources.go index 3dfb84a4..0b730156 100644 --- a/resources/machinelearning-datasources.go +++ b/resources/machinelearning-datasources.go @@ -1,9 +1,13 @@ package resources import ( + "strings" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/machinelearning" + "github.com/sirupsen/logrus" ) type MachineLearningDataSource struct { @@ -26,6 +30,12 @@ func ListMachineLearningDataSources(sess *session.Session) ([]Resource, error) { for { output, err := svc.DescribeDataSources(params) if err != nil { + if aerr, ok := err.(awserr.Error); ok { + if strings.Contains(aerr.Message(), "AmazonML is no longer available to new customers") { + logrus.Info("MachineLearningBranchPrediction: AmazonML is no longer available to new customers. Ignore if you haven't set it up.") + return nil, nil + } + } return nil, err } diff --git a/resources/machinelearning-evaluations.go b/resources/machinelearning-evaluations.go index 6ef83408..7d307ac9 100644 --- a/resources/machinelearning-evaluations.go +++ b/resources/machinelearning-evaluations.go @@ -1,9 +1,13 @@ package resources import ( + "strings" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/machinelearning" + "github.com/sirupsen/logrus" ) type MachineLearningEvaluation struct { @@ -26,6 +30,12 @@ func ListMachineLearningEvaluations(sess *session.Session) ([]Resource, error) { for { output, err := svc.DescribeEvaluations(params) if err != nil { + if aerr, ok := err.(awserr.Error); ok { + if strings.Contains(aerr.Message(), "AmazonML is no longer available to new customers") { + logrus.Info("MachineLearningBranchPrediction: AmazonML is no longer available to new customers. Ignore if you haven't set it up.") + return nil, nil + } + } return nil, err } diff --git a/resources/machinelearning-mlmodels.go b/resources/machinelearning-mlmodels.go index b223efd0..0bde5f74 100644 --- a/resources/machinelearning-mlmodels.go +++ b/resources/machinelearning-mlmodels.go @@ -1,9 +1,13 @@ package resources import ( + "strings" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/machinelearning" + "github.com/sirupsen/logrus" ) type MachineLearningMLModel struct { @@ -26,6 +30,12 @@ func ListMachineLearningMLModels(sess *session.Session) ([]Resource, error) { for { output, err := svc.DescribeMLModels(params) if err != nil { + if aerr, ok := err.(awserr.Error); ok { + if strings.Contains(aerr.Message(), "AmazonML is no longer available to new customers") { + logrus.Info("MachineLearningBranchPrediction: AmazonML is no longer available to new customers. Ignore if you haven't set it up.") + return nil, nil + } + } return nil, err } diff --git a/resources/mgn-jobs.go b/resources/mgn-jobs.go index 2159b3c5..670d4c4c 100644 --- a/resources/mgn-jobs.go +++ b/resources/mgn-jobs.go @@ -5,6 +5,7 @@ import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/mgn" "github.com/rebuy-de/aws-nuke/v2/pkg/types" + "github.com/sirupsen/logrus" ) type MGNJob struct { @@ -29,6 +30,10 @@ func ListMGNJobs(sess *session.Session) ([]Resource, error) { for { output, err := svc.DescribeJobs(params) if err != nil { + if IsAWSError(err, mgn.ErrCodeUninitializedAccountException) { + logrus.Info("MGNJob: Account not initialized for Application Migration Service. Ignore if you haven't set it up.") + return nil, nil + } return nil, err } diff --git a/resources/mgn-source_servers.go b/resources/mgn-source_servers.go index 706138a7..fe840439 100644 --- a/resources/mgn-source_servers.go +++ b/resources/mgn-source_servers.go @@ -5,6 +5,7 @@ import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/mgn" "github.com/rebuy-de/aws-nuke/v2/pkg/types" + "github.com/sirupsen/logrus" ) type MGNSourceServer struct { @@ -29,6 +30,10 @@ func ListMGNSourceServers(sess *session.Session) ([]Resource, error) { for { output, err := svc.DescribeSourceServers(params) if err != nil { + if IsAWSError(err, mgn.ErrCodeUninitializedAccountException) { + logrus.Info("MGNSourceServer: Account not initialized for Application Migration Service. Ignore if you haven't set it up.") + return nil, nil + } return nil, err } From ef87e8073533058554185182a3a7588965ce0ebb Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Wed, 23 Aug 2023 17:52:20 +0200 Subject: [PATCH 055/135] Build with Go 1.21 (#1084) --- .github/workflows/ci.yaml | 2 +- .github/workflows/release.yaml | 2 +- Dockerfile | 2 +- go.mod | 2 +- go.sum | 3 +++ 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c9040de0..37a19c19 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,7 +16,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v3 with: - go-version: '1.20' + go-version: '1.21' - name: Setup tools run: | go install golang.org/x/lint/golint@latest diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e9831a42..738d2760 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -38,7 +38,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v3 with: - go-version: '1.20' + go-version: '1.21' - name: Checkout code uses: actions/checkout@v3 with: diff --git a/Dockerfile b/Dockerfile index 01011959..bcbea03c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.20-alpine as builder +FROM golang:1.21-alpine as builder RUN apk add --no-cache git make curl openssl diff --git a/go.mod b/go.mod index 562f1cc2..ed24ca09 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/rebuy-de/aws-nuke/v2 -go 1.19 +go 1.21 require ( github.com/aws/aws-sdk-go v1.44.328 diff --git a/go.sum b/go.sum index b2066cd7..befb1b71 100644 --- a/go.sum +++ b/go.sum @@ -71,6 +71,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -98,6 +99,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -112,6 +114,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From a3fa4aaa01aff4a37b576c3733ce7d40a6622b2c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:20:41 +0200 Subject: [PATCH 056/135] Update readme for v2.24.2 release (#1086) Co-authored-by: der-eismann --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8395671e..0446134f 100644 --- a/README.md +++ b/README.md @@ -612,10 +612,10 @@ The easiest way of installing it, is to download the latest #### Example for Linux Intel/AMD Download and extract -`$ wget -c https://github.com/rebuy-de/aws-nuke/releases/download/v2.24.1/aws-nuke-v2.24.1-linux-amd64.tar.gz -O - | tar -xz -C $HOME/bin` +`$ wget -c https://github.com/rebuy-de/aws-nuke/releases/download/v2.24.2/aws-nuke-v2.24.2-linux-amd64.tar.gz -O - | tar -xz -C $HOME/bin` Run -`$ aws-nuke-v2.24.1-linux-amd64` +`$ aws-nuke-v2.24.2-linux-amd64` ### Compile from Source @@ -639,7 +639,7 @@ $ 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.24.1 \ + quay.io/rebuy/aws-nuke:v2.24.2 \ --profile default \ --config /home/aws-nuke/config.yml ``` From a55248935f3f17affb36ec64c47b2d455472e9ab Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Wed, 23 Aug 2023 18:39:23 +0200 Subject: [PATCH 057/135] Add EC2InstanceConnectEndpoint resource (#1087) --- resources/ec2-instance-connect-endpoint.go | 98 ++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 resources/ec2-instance-connect-endpoint.go diff --git a/resources/ec2-instance-connect-endpoint.go b/resources/ec2-instance-connect-endpoint.go new file mode 100644 index 00000000..70e584d1 --- /dev/null +++ b/resources/ec2-instance-connect-endpoint.go @@ -0,0 +1,98 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/ec2" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type EC2InstanceConnectEndpoint struct { + svc *ec2.EC2 + az *string + createdAt *time.Time + dnsName *string + fipsDNSName *string + id *string + ownerID *string + state *string + subnetID *string + tags []*ec2.Tag + vpcID *string +} + +func init() { + register("EC2InstanceConnectEndpoint", ListEC2InstanceConnectEndpoints) +} + +func ListEC2InstanceConnectEndpoints(sess *session.Session) ([]Resource, error) { + svc := ec2.New(sess) + params := &ec2.DescribeInstanceConnectEndpointsInput{} + resources := make([]Resource, 0) + for { + resp, err := svc.DescribeInstanceConnectEndpoints(params) + if err != nil { + return nil, err + } + + for _, endpoint := range resp.InstanceConnectEndpoints { + resources = append(resources, &EC2InstanceConnectEndpoint{ + svc: svc, + az: endpoint.AvailabilityZone, + createdAt: endpoint.CreatedAt, + dnsName: endpoint.DnsName, + fipsDNSName: endpoint.FipsDnsName, + id: endpoint.InstanceConnectEndpointId, + ownerID: endpoint.OwnerId, + state: endpoint.State, + subnetID: endpoint.SubnetId, + tags: endpoint.Tags, + vpcID: endpoint.VpcId, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (i *EC2InstanceConnectEndpoint) Remove() error { + params := &ec2.DeleteInstanceConnectEndpointInput{ + InstanceConnectEndpointId: i.id, + } + + _, err := i.svc.DeleteInstanceConnectEndpoint(params) + if err != nil { + return err + } + return nil +} + +func (i *EC2InstanceConnectEndpoint) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("ID", i.id) + properties.Set("AZ", i.az) + properties.Set("CreatedAt", i.createdAt.Format(time.RFC3339)) + properties.Set("DNSName", i.dnsName) + properties.Set("FIPSDNSName", i.fipsDNSName) + properties.Set("OwnerID", i.ownerID) + properties.Set("State", i.state) + properties.Set("SubnetID", i.subnetID) + properties.Set("VPCID", i.vpcID) + + for _, tagValue := range i.tags { + properties.SetTag(tagValue.Key, tagValue.Value) + } + + return properties +} + +func (i *EC2InstanceConnectEndpoint) String() string { + return *i.id +} From 9874f48a92a2e6cce94ab4e0b9074edbae23d851 Mon Sep 17 00:00:00 2001 From: Sherd White <106187526+swhite-oreilly@users.noreply.github.com> Date: Thu, 24 Aug 2023 02:57:15 -0500 Subject: [PATCH 058/135] Add elasticache user and group support (#1044) * Adding Elasticache User and UserGroup Support Adding go modules for elasticache users and groups. Adding filtering for subnet groups to ignore the default elasticache subnet group. * Create opensearchservice-packages.go Adding working code for packages cleanup. * Delete opensearchservice-packages.go Moving opensearch changes to separate branch. * Updating elasticache user/group list calls with pagination. * Reverting versions to match oreilly-main Reverting versions to match oreilly-main * Updating go version to match upstream. * Updating to more closely match style of other resource types. * Adding properties to EC user/usergroups. --- resources/elasticache-subnetgroups.go | 10 +++ resources/elasticache-usergroups.go | 74 +++++++++++++++++++++++ resources/elasticache-users.go | 87 +++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 resources/elasticache-usergroups.go create mode 100644 resources/elasticache-users.go diff --git a/resources/elasticache-subnetgroups.go b/resources/elasticache-subnetgroups.go index 2e17689e..d4cbc418 100644 --- a/resources/elasticache-subnetgroups.go +++ b/resources/elasticache-subnetgroups.go @@ -1,6 +1,9 @@ package resources import ( + "fmt" + "strings" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/elasticache" @@ -35,6 +38,13 @@ func ListElasticacheSubnetGroups(sess *session.Session) ([]Resource, error) { return resources, nil } +func (i *ElasticacheSubnetGroup) Filter() error { + if strings.HasPrefix(*i.name, "default") { + return fmt.Errorf("Cannot delete default subnet group") + } + return nil +} + func (i *ElasticacheSubnetGroup) Remove() error { params := &elasticache.DeleteCacheSubnetGroupInput{ CacheSubnetGroupName: i.name, diff --git a/resources/elasticache-usergroups.go b/resources/elasticache-usergroups.go new file mode 100644 index 00000000..df001fd9 --- /dev/null +++ b/resources/elasticache-usergroups.go @@ -0,0 +1,74 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/elasticache" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type ElasticacheUserGroup struct { + svc *elasticache.ElastiCache + groupId *string +} + +func init() { + register("ElasticacheUserGroup", ListElasticacheUserGroups) +} + +func ListElasticacheUserGroups(sess *session.Session) ([]Resource, error) { + svc := elasticache.New(sess) + resources := []Resource{} + var nextToken *string + + for { + params := &elasticache.DescribeUserGroupsInput{ + MaxRecords: aws.Int64(100), + Marker: nextToken, + } + resp, err := svc.DescribeUserGroups(params) + if err != nil { + return nil, err + } + + for _, userGroup := range resp.UserGroups { + resources = append(resources, &ElasticacheUserGroup{ + svc: svc, + groupId: userGroup.UserGroupId, + }) + } + + // Check if there are more results + if resp.Marker == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = resp.Marker + } + + return resources, nil +} + +func (i *ElasticacheUserGroup) Remove() error { + params := &elasticache.DeleteUserGroupInput{ + UserGroupId: i.groupId, + } + + _, err := i.svc.DeleteUserGroup(params) + if err != nil { + return err + } + + return nil +} + +func (i *ElasticacheUserGroup) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("ID", i.groupId) + return properties +} + +func (i *ElasticacheUserGroup) String() string { + return *i.groupId +} diff --git a/resources/elasticache-users.go b/resources/elasticache-users.go new file mode 100644 index 00000000..8bd37079 --- /dev/null +++ b/resources/elasticache-users.go @@ -0,0 +1,87 @@ +package resources + +import ( + "fmt" + "strings" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/elasticache" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type ElasticacheUser struct { + svc *elasticache.ElastiCache + userId *string + userName *string +} + +func init() { + register("ElasticacheUser", ListElasticacheUsers) +} + +func ListElasticacheUsers(sess *session.Session) ([]Resource, error) { + svc := elasticache.New(sess) + resources := []Resource{} + var nextToken *string + + for { + params := &elasticache.DescribeUsersInput{ + MaxRecords: aws.Int64(100), + Marker: nextToken, + } + resp, err := svc.DescribeUsers(params) + if err != nil { + return nil, err + } + + for _, user := range resp.Users { + resources = append(resources, &ElasticacheUser{ + svc: svc, + userId: user.UserId, + userName: user.UserName, + }) + } + + // Check if there are more results + if resp.Marker == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = resp.Marker + } + + return resources, nil +} + +func (i *ElasticacheUser) Filter() error { + if strings.HasPrefix(*i.userName, "default") { + return fmt.Errorf("cannot delete default user") + } + return nil +} + +func (i *ElasticacheUser) Remove() error { + params := &elasticache.DeleteUserInput{ + UserId: i.userId, + } + + _, err := i.svc.DeleteUser(params) + if err != nil { + return err + } + + return nil +} + +func (i *ElasticacheUser) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("ID", i.userId) + properties.Set("UserName", i.userName) + return properties +} + +func (i *ElasticacheUser) String() string { + return *i.userId +} From f8fc2e5532cbb1860116c3394d878394ba0feab0 Mon Sep 17 00:00:00 2001 From: Nicolas Pellegrin Date: Thu, 24 Aug 2023 17:04:00 +0200 Subject: [PATCH 059/135] Add support for CloudFront public keys and CloudFront key groups (#873) (#1065) --- resources/cloudfront-key-groups.go | 74 +++++++++++++++++++++++++++++ resources/cloudfront-public-keys.go | 74 +++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 resources/cloudfront-key-groups.go create mode 100644 resources/cloudfront-public-keys.go diff --git a/resources/cloudfront-key-groups.go b/resources/cloudfront-key-groups.go new file mode 100644 index 00000000..8a790ed3 --- /dev/null +++ b/resources/cloudfront-key-groups.go @@ -0,0 +1,74 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/cloudfront" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CloudFrontKeyGroup struct { + svc *cloudfront.CloudFront + ID *string + name *string + lastModifiedTime *time.Time +} + +func init() { + register("CloudFrontKeyGroup", ListCloudFrontKeyGroups) +} + +func ListCloudFrontKeyGroups(sess *session.Session) ([]Resource, error) { + svc := cloudfront.New(sess) + resources := []Resource{} + params := &cloudfront.ListKeyGroupsInput{} + + for { + resp, err := svc.ListKeyGroups(params) + if err != nil { + return nil, err + } + + for _, item := range resp.KeyGroupList.Items { + resources = append(resources, &CloudFrontKeyGroup{ + svc: svc, + ID: item.KeyGroup.Id, + name: item.KeyGroup.KeyGroupConfig.Name, + lastModifiedTime: item.KeyGroup.LastModifiedTime, + }) + } + + if resp.KeyGroupList.NextMarker == nil { + break + } + + params.Marker = resp.KeyGroupList.NextMarker + } + + return resources, nil +} + +func (f *CloudFrontKeyGroup) Remove() error { + resp, err := f.svc.GetKeyGroup(&cloudfront.GetKeyGroupInput{ + Id: f.ID, + }) + if err != nil { + return err + } + + _, err = f.svc.DeleteKeyGroup(&cloudfront.DeleteKeyGroupInput{ + Id: f.ID, + IfMatch: resp.ETag, + }) + + return err +} + +func (f *CloudFrontKeyGroup) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("ID", f.ID) + properties.Set("Name", f.name) + properties.Set("LastModifiedTime", f.lastModifiedTime.Format(time.RFC3339)) + return properties +} diff --git a/resources/cloudfront-public-keys.go b/resources/cloudfront-public-keys.go new file mode 100644 index 00000000..3c5cd6e7 --- /dev/null +++ b/resources/cloudfront-public-keys.go @@ -0,0 +1,74 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/cloudfront" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CloudFrontPublicKey struct { + svc *cloudfront.CloudFront + ID *string + name *string + createdTime *time.Time +} + +func init() { + register("CloudFrontPublicKey", ListCloudFrontPublicKeys) +} + +func ListCloudFrontPublicKeys(sess *session.Session) ([]Resource, error) { + svc := cloudfront.New(sess) + resources := []Resource{} + params := &cloudfront.ListPublicKeysInput{} + + for { + resp, err := svc.ListPublicKeys(params) + if err != nil { + return nil, err + } + + for _, item := range resp.PublicKeyList.Items { + resources = append(resources, &CloudFrontPublicKey{ + svc: svc, + ID: item.Id, + name: item.Name, + createdTime: item.CreatedTime, + }) + } + + if resp.PublicKeyList.NextMarker == nil { + break + } + + params.Marker = resp.PublicKeyList.NextMarker + } + + return resources, nil +} + +func (f *CloudFrontPublicKey) Remove() error { + resp, err := f.svc.GetPublicKey(&cloudfront.GetPublicKeyInput{ + Id: f.ID, + }) + if err != nil { + return err + } + + _, err = f.svc.DeletePublicKey(&cloudfront.DeletePublicKeyInput{ + Id: f.ID, + IfMatch: resp.ETag, + }) + + return err +} + +func (f *CloudFrontPublicKey) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("ID", f.ID) + properties.Set("Name", f.name) + properties.Set("CreatedTime", f.createdTime.Format(time.RFC3339)) + return properties +} From f1aff709f78026454f74079b5f6aefe159684ce7 Mon Sep 17 00:00:00 2001 From: James Taylor <127947293+JTaylor-myenergi@users.noreply.github.com> Date: Thu, 24 Aug 2023 16:04:11 +0100 Subject: [PATCH 060/135] feat: MemoryDBACL resource support (#1079) feat: MemoryDBCluster resource support feat: MemoryDBParameterGroup resource support feat: MemoryDBSubnetGroup resource support feat: MemoryDBUser resource support --- resources/memorydb-acl.go | 84 +++++++++++++++++++++++ resources/memorydb-cluster.go | 84 +++++++++++++++++++++++ resources/memorydb-parametergroups.go | 98 +++++++++++++++++++++++++++ resources/memorydb-subnetgroups.go | 85 +++++++++++++++++++++++ resources/memorydb-user.go | 95 ++++++++++++++++++++++++++ 5 files changed, 446 insertions(+) create mode 100644 resources/memorydb-acl.go create mode 100644 resources/memorydb-cluster.go create mode 100644 resources/memorydb-parametergroups.go create mode 100644 resources/memorydb-subnetgroups.go create mode 100644 resources/memorydb-user.go diff --git a/resources/memorydb-acl.go b/resources/memorydb-acl.go new file mode 100644 index 00000000..fa43e46d --- /dev/null +++ b/resources/memorydb-acl.go @@ -0,0 +1,84 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/memorydb" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type MemoryDBACL struct { + svc *memorydb.MemoryDB + name *string + tags []*memorydb.Tag +} + +func init() { + register("MemoryDBACL", ListMemoryDBACLs) +} + +func ListMemoryDBACLs(sess *session.Session) ([]Resource, error) { + svc := memorydb.New(sess) + var resources []Resource + + params := &memorydb.DescribeACLsInput{MaxResults: aws.Int64(50)} + for { + resp, err := svc.DescribeACLs(params) + if err != nil { + return nil, err + } + + for _, acl := range resp.ACLs { + tags, err := svc.ListTags(&memorydb.ListTagsInput{ + ResourceArn: acl.ARN, + }) + + if err != nil { + continue + } + + resources = append(resources, &MemoryDBACL{ + svc: svc, + name: acl.Name, + tags: tags.TagList, + }) + + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (i *MemoryDBACL) Remove() error { + params := &memorydb.DeleteACLInput{ + ACLName: i.name, + } + + _, err := i.svc.DeleteACL(params) + if err != nil { + return err + } + + return nil +} + +func (i *MemoryDBACL) String() string { + return *i.name +} + +func (i *MemoryDBACL) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", i.name) + + for _, tag := range i.tags { + properties.SetTag(tag.Key, tag.Value) + } + + return properties +} diff --git a/resources/memorydb-cluster.go b/resources/memorydb-cluster.go new file mode 100644 index 00000000..a2ca799e --- /dev/null +++ b/resources/memorydb-cluster.go @@ -0,0 +1,84 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/memorydb" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type MemoryDBCluster struct { + svc *memorydb.MemoryDB + name *string + tags []*memorydb.Tag +} + +func init() { + register("MemoryDBCluster", ListMemoryDbClusters) +} + +func ListMemoryDbClusters(sess *session.Session) ([]Resource, error) { + svc := memorydb.New(sess) + var resources []Resource + + params := &memorydb.DescribeClustersInput{MaxResults: aws.Int64(100)} + + for { + resp, err := svc.DescribeClusters(params) + if err != nil { + return nil, err + } + + for _, cluster := range resp.Clusters { + tags, err := svc.ListTags(&memorydb.ListTagsInput{ + ResourceArn: cluster.ARN, + }) + + if err != nil { + continue + } + + resources = append(resources, &MemoryDBCluster{ + svc: svc, + name: cluster.Name, + tags: tags.TagList, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (c *MemoryDBCluster) Remove() error { + params := &memorydb.DeleteClusterInput{ + ClusterName: c.name, + } + + _, err := c.svc.DeleteCluster(params) + if err != nil { + return err + } + + return nil +} + +func (i *MemoryDBCluster) String() string { + return *i.name +} + +func (i *MemoryDBCluster) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", i.name) + + for _, tag := range i.tags { + properties.SetTag(tag.Key, tag.Value) + } + + return properties +} diff --git a/resources/memorydb-parametergroups.go b/resources/memorydb-parametergroups.go new file mode 100644 index 00000000..0583d6df --- /dev/null +++ b/resources/memorydb-parametergroups.go @@ -0,0 +1,98 @@ +package resources + +import ( + "fmt" + "strings" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/memorydb" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type MemoryDBParameterGroup struct { + svc *memorydb.MemoryDB + name *string + family *string + tags []*memorydb.Tag +} + +func init() { + register("MemoryDBParameterGroup", ListMemoryDBParameterGroups) +} + +func ListMemoryDBParameterGroups(sess *session.Session) ([]Resource, error) { + svc := memorydb.New(sess) + var resources []Resource + + params := &memorydb.DescribeParameterGroupsInput{MaxResults: aws.Int64(100)} + + for { + resp, err := svc.DescribeParameterGroups(params) + if err != nil { + return nil, err + } + + for _, parameterGroup := range resp.ParameterGroups { + tags, err := svc.ListTags(&memorydb.ListTagsInput{ + ResourceArn: parameterGroup.ARN, + }) + + if err != nil { + continue + } + + resources = append(resources, &MemoryDBParameterGroup{ + svc: svc, + name: parameterGroup.Name, + family: parameterGroup.Family, + tags: tags.TagList, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (i *MemoryDBParameterGroup) Filter() error { + if strings.HasPrefix(*i.name, "default.") { + return fmt.Errorf("Cannot delete default parameter group") + } + return nil +} + +func (i *MemoryDBParameterGroup) Remove() error { + params := &memorydb.DeleteParameterGroupInput{ + ParameterGroupName: i.name, + } + + _, err := i.svc.DeleteParameterGroup(params) + if err != nil { + return err + } + + return nil +} + +func (i *MemoryDBParameterGroup) String() string { + return *i.name +} + +func (i *MemoryDBParameterGroup) Properties() types.Properties { + properties := types.NewProperties() + properties. + Set("Name", i.name). + Set("Family", i.family) + + for _, tag := range i.tags { + properties.SetTag(tag.Key, tag.Value) + } + + return properties +} diff --git a/resources/memorydb-subnetgroups.go b/resources/memorydb-subnetgroups.go new file mode 100644 index 00000000..b2ac7cd6 --- /dev/null +++ b/resources/memorydb-subnetgroups.go @@ -0,0 +1,85 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/memorydb" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type MemoryDBSubnetGroup struct { + svc *memorydb.MemoryDB + name *string + tags []*memorydb.Tag +} + +func init() { + register("MemoryDBSubnetGroup", ListMemoryDBSubnetGroups) +} + +func ListMemoryDBSubnetGroups(sess *session.Session) ([]Resource, error) { + svc := memorydb.New(sess) + var resources []Resource + + params := &memorydb.DescribeSubnetGroupsInput{MaxResults: aws.Int64(100)} + + for { + resp, err := svc.DescribeSubnetGroups(params) + if err != nil { + return nil, err + } + for _, subnetGroup := range resp.SubnetGroups { + tags, err := svc.ListTags(&memorydb.ListTagsInput{ + ResourceArn: subnetGroup.ARN, + }) + + if err != nil { + continue + } + + resources = append(resources, &MemoryDBSubnetGroup{ + svc: svc, + name: subnetGroup.Name, + tags: tags.TagList, + }) + + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (i *MemoryDBSubnetGroup) Remove() error { + params := &memorydb.DeleteSubnetGroupInput{ + SubnetGroupName: i.name, + } + + _, err := i.svc.DeleteSubnetGroup(params) + if err != nil { + return err + } + + return nil +} + +func (i *MemoryDBSubnetGroup) String() string { + return *i.name +} + +func (i *MemoryDBSubnetGroup) Properties() types.Properties { + properties := types.NewProperties() + properties. + Set("Name", i.name) + + for _, tag := range i.tags { + properties.SetTag(tag.Key, tag.Value) + } + + return properties +} diff --git a/resources/memorydb-user.go b/resources/memorydb-user.go new file mode 100644 index 00000000..cfeb140d --- /dev/null +++ b/resources/memorydb-user.go @@ -0,0 +1,95 @@ +package resources + +import ( + "fmt" + "strings" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/memorydb" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type MemoryDBUser struct { + svc *memorydb.MemoryDB + name *string + tags []*memorydb.Tag +} + +func init() { + register("MemoryDBUser", ListMemoryDBUsers) +} + +func ListMemoryDBUsers(sess *session.Session) ([]Resource, error) { + svc := memorydb.New(sess) + var resources []Resource + + params := &memorydb.DescribeUsersInput{MaxResults: aws.Int64(50)} + for { + resp, err := svc.DescribeUsers(params) + if err != nil { + return nil, err + } + + for _, user := range resp.Users { + tags, err := svc.ListTags(&memorydb.ListTagsInput{ + ResourceArn: user.ARN, + }) + + if err != nil { + continue + } + + resources = append(resources, &MemoryDBUser{ + svc: svc, + name: user.Name, + tags: tags.TagList, + }) + + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (i *MemoryDBUser) Filter() error { + if strings.EqualFold(*i.name, "default") { + return fmt.Errorf("Cannot delete default user") + } + return nil +} + +func (i *MemoryDBUser) Remove() error { + params := &memorydb.DeleteUserInput{ + UserName: i.name, + } + + _, err := i.svc.DeleteUser(params) + if err != nil { + return err + } + + return nil +} + +func (i *MemoryDBUser) String() string { + return *i.name +} + +func (i *MemoryDBUser) Properties() types.Properties { + properties := types.NewProperties() + properties. + Set("Name", i.name) + + for _, tag := range i.tags { + properties.SetTag(tag.Key, tag.Value) + } + + return properties +} From e641116ce4744015187330c9aecffcfb498a1584 Mon Sep 17 00:00:00 2001 From: Suleman Sohail <108665301+suleman-sohail@users.noreply.github.com> Date: Thu, 24 Aug 2023 20:04:31 +0500 Subject: [PATCH 061/135] Stopped Executions before deleting step functions state machines (#1053) * Added Deletion protection disable feature in cognito user-pool * Minor Changes * nit * spaces * spaces 2 * stopping executions * Stopped executiins * nit * Formatted --------- Co-authored-by: Suleman Sohail Co-authored-by: Philipp Trulson --- resources/sfn-statemachines.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/resources/sfn-statemachines.go b/resources/sfn-statemachines.go index e0748f7a..5edcd9a6 100644 --- a/resources/sfn-statemachines.go +++ b/resources/sfn-statemachines.go @@ -47,6 +47,27 @@ func ListSFNStateMachines(sess *session.Session) ([]Resource, error) { } func (f *SFNStateMachine) Remove() error { + params := &sfn.ListExecutionsInput{ + StateMachineArn: f.ARN, + } + + for { + executions, execError := f.svc.ListExecutions(params) + if execError != nil { + break + } + for _, execs := range executions.Executions { + + f.svc.StopExecution(&sfn.StopExecutionInput{ + ExecutionArn: execs.ExecutionArn, + }) + } + + if executions.NextToken == nil { + break + } + params.NextToken = executions.NextToken + } _, err := f.svc.DeleteStateMachine(&sfn.DeleteStateMachineInput{ StateMachineArn: f.ARN, From 150eb13e54a604d974af1201695c629d08f6a189 Mon Sep 17 00:00:00 2001 From: Mike Schouw <49021968+MikeSchouw@users.noreply.github.com> Date: Thu, 24 Aug 2023 17:09:00 +0200 Subject: [PATCH 062/135] Add RedshiftScheduledAction resource (#1047) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add RedshiftScheduledAction resource --------- Co-authored-by: Björn Häuser --- resources/redshift-scheduled-action.go | 60 ++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 resources/redshift-scheduled-action.go diff --git a/resources/redshift-scheduled-action.go b/resources/redshift-scheduled-action.go new file mode 100644 index 00000000..e98b1569 --- /dev/null +++ b/resources/redshift-scheduled-action.go @@ -0,0 +1,60 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/redshift" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type RedshiftScheduledAction struct { + svc *redshift.Redshift + scheduledActionName *string +} + +func init() { + register("RedshiftScheduledAction", ListRedshiftScheduledActions) +} + +func ListRedshiftScheduledActions(sess *session.Session) ([]Resource, error) { + svc := redshift.New(sess) + resources := []Resource{} + + params := &redshift.DescribeScheduledActionsInput{} + + for { + resp, err := svc.DescribeScheduledActions(params) + if err != nil { + return nil, err + } + + for _, item := range resp.ScheduledActions { + resources = append(resources, &RedshiftScheduledAction{ + svc: svc, + scheduledActionName: item.ScheduledActionName, + }) + } + + if resp.Marker == nil { + break + } + + params.Marker = resp.Marker + } + + return resources, nil +} + +func (f *RedshiftScheduledAction) Remove() error { + + _, err := f.svc.DeleteScheduledAction(&redshift.DeleteScheduledActionInput{ + ScheduledActionName: f.scheduledActionName, + }) + + return err +} + +func (f *RedshiftScheduledAction) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("scheduledActionName", f.scheduledActionName) + return properties +} From 23ee2226c3cd8026072067e5f8da0873fbeb966f Mon Sep 17 00:00:00 2001 From: Sherd White Date: Thu, 17 Aug 2023 09:17:29 -0500 Subject: [PATCH 063/135] Updating detection filters. Adding `Completed` to the job status types that are ignored upon cleanup. --- resources/comprehend_entities_detection_job.go | 6 +++--- resources/comprehend_sentiment_detection_job.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/comprehend_entities_detection_job.go b/resources/comprehend_entities_detection_job.go index 3ae80484..8baecc7a 100644 --- a/resources/comprehend_entities_detection_job.go +++ b/resources/comprehend_entities_detection_job.go @@ -22,9 +22,9 @@ func ListComprehendEntitiesDetectionJobs(sess *session.Session) ([]Resource, err return nil, err } for _, entitiesDetectionJob := range resp.EntitiesDetectionJobPropertiesList { - if *entitiesDetectionJob.JobStatus == "STOPPED" || - *entitiesDetectionJob.JobStatus == "FAILED" { - // if the job has already been stopped, do not try to delete it again + switch *entitiesDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again continue } resources = append(resources, &ComprehendEntitiesDetectionJob{ diff --git a/resources/comprehend_sentiment_detection_job.go b/resources/comprehend_sentiment_detection_job.go index eddd2041..835e8233 100644 --- a/resources/comprehend_sentiment_detection_job.go +++ b/resources/comprehend_sentiment_detection_job.go @@ -22,9 +22,9 @@ func ListComprehendSentimentDetectionJobs(sess *session.Session) ([]Resource, er return nil, err } for _, sentimentDetectionJob := range resp.SentimentDetectionJobPropertiesList { - if *sentimentDetectionJob.JobStatus == "STOPPED" || - *sentimentDetectionJob.JobStatus == "FAILED" { - // if the job has already been stopped, do not try to delete it again + switch *sentimentDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again continue } resources = append(resources, &ComprehendSentimentDetectionJob{ From 5bcf0b64740bd72a6377efc8921b3e096b9326d2 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Tue, 22 Aug 2023 12:10:50 -0500 Subject: [PATCH 064/135] Adding filters for key-phrases and dominant-language Adding filters for key-phrases and dominant-language --- resources/comprehend_dominant_language_detection_job.go | 5 +++++ resources/comprehend_key_phrases_detection_job.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/resources/comprehend_dominant_language_detection_job.go b/resources/comprehend_dominant_language_detection_job.go index 26bcf860..6a4a22ba 100644 --- a/resources/comprehend_dominant_language_detection_job.go +++ b/resources/comprehend_dominant_language_detection_job.go @@ -22,6 +22,11 @@ func ListComprehendDominantLanguageDetectionJobs(sess *session.Session) ([]Resou return nil, err } for _, dominantLanguageDetectionJob := range resp.DominantLanguageDetectionJobPropertiesList { + switch *dominantLanguageDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } resources = append(resources, &ComprehendDominantLanguageDetectionJob{ svc: svc, dominantLanguageDetectionJob: dominantLanguageDetectionJob, diff --git a/resources/comprehend_key_phrases_detection_job.go b/resources/comprehend_key_phrases_detection_job.go index 3a78d963..6c3009ec 100644 --- a/resources/comprehend_key_phrases_detection_job.go +++ b/resources/comprehend_key_phrases_detection_job.go @@ -22,6 +22,11 @@ func ListComprehendKeyPhrasesDetectionJobs(sess *session.Session) ([]Resource, e return nil, err } for _, keyPhrasesDetectionJob := range resp.KeyPhrasesDetectionJobPropertiesList { + switch *keyPhrasesDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } resources = append(resources, &ComprehendKeyPhrasesDetectionJob{ svc: svc, keyPhrasesDetectionJob: keyPhrasesDetectionJob, From 33fa1cf96b7ce250540d8250777da93e0147b193 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Tue, 22 Aug 2023 18:48:52 -0500 Subject: [PATCH 065/135] Adding pii entitites and sentiment detection job support. --- .../comprehend_pii_entities_detection_job.go | 72 +++++++++++++++++++ ...rehend_targeted_sentiment_detection_job.go | 72 +++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 resources/comprehend_pii_entities_detection_job.go create mode 100644 resources/comprehend_targeted_sentiment_detection_job.go diff --git a/resources/comprehend_pii_entities_detection_job.go b/resources/comprehend_pii_entities_detection_job.go new file mode 100644 index 00000000..6d923461 --- /dev/null +++ b/resources/comprehend_pii_entities_detection_job.go @@ -0,0 +1,72 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/comprehend" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +func init() { + register("ComprehendPiiEntititesDetectionJob", ListComprehendPiiEntitiesDetectionJobs) +} + +func ListComprehendPiiEntitiesDetectionJobs(sess *session.Session) ([]Resource, error) { + svc := comprehend.New(sess) + + params := &comprehend.ListPiiEntitiesDetectionJobsInput{} + resources := make([]Resource, 0) + + for { + resp, err := svc.ListPiiEntitiesDetectionJobs(params) + if err != nil { + return nil, err + } + for _, piiEntititesDetectionJob := range resp.PiiEntitiesDetectionJobPropertiesList { + switch *piiEntititesDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } + resources = append(resources, &ComprehendPiiEntitiesDetectionJob{ + svc: svc, + piiEntititesDetectionJob: piiEntititesDetectionJob, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +type ComprehendPiiEntitiesDetectionJob struct { + svc *comprehend.Comprehend + piiEntititesDetectionJob *comprehend.PiiEntitiesDetectionJobProperties +} + +func (ce *ComprehendPiiEntitiesDetectionJob) Remove() error { + _, err := ce.svc.StopPiiEntitiesDetectionJob(&comprehend.StopPiiEntitiesDetectionJobInput{ + JobId: ce.piiEntititesDetectionJob.JobId, + }) + return err +} + +func (ce *ComprehendPiiEntitiesDetectionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("JobName", ce.piiEntititesDetectionJob.JobName) + properties.Set("JobId", ce.piiEntititesDetectionJob.JobId) + + return properties +} + +func (ce *ComprehendPiiEntitiesDetectionJob) String() string { + if ce.piiEntititesDetectionJob.JobName == nil { + return "Unnamed job" + } else { + return *ce.piiEntititesDetectionJob.JobName + } +} diff --git a/resources/comprehend_targeted_sentiment_detection_job.go b/resources/comprehend_targeted_sentiment_detection_job.go new file mode 100644 index 00000000..b60b39b6 --- /dev/null +++ b/resources/comprehend_targeted_sentiment_detection_job.go @@ -0,0 +1,72 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/comprehend" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +func init() { + register("ComprehendTargetedSentimentDetectionJob", ListComprehendTargetedSentimentDetectionJobs) +} + +func ListComprehendTargetedSentimentDetectionJobs(sess *session.Session) ([]Resource, error) { + svc := comprehend.New(sess) + + params := &comprehend.ListTargetedSentimentDetectionJobsInput{} + resources := make([]Resource, 0) + + for { + resp, err := svc.ListTargetedSentimentDetectionJobs(params) + if err != nil { + return nil, err + } + for _, targetedSentimentDetectionJob := range resp.TargetedSentimentDetectionJobPropertiesList { + switch *targetedSentimentDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } + resources = append(resources, &ComprehendTargetedSentimentDetectionJob{ + svc: svc, + targetedSentimentDetectionJob: targetedSentimentDetectionJob, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +type ComprehendTargetedSentimentDetectionJob struct { + svc *comprehend.Comprehend + targetedSentimentDetectionJob *comprehend.TargetedSentimentDetectionJobProperties +} + +func (ce *ComprehendTargetedSentimentDetectionJob) Remove() error { + _, err := ce.svc.StopTargetedSentimentDetectionJob(&comprehend.StopTargetedSentimentDetectionJobInput{ + JobId: ce.targetedSentimentDetectionJob.JobId, + }) + return err +} + +func (ce *ComprehendTargetedSentimentDetectionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("JobName", ce.targetedSentimentDetectionJob.JobName) + properties.Set("JobId", ce.targetedSentimentDetectionJob.JobId) + + return properties +} + +func (ce *ComprehendTargetedSentimentDetectionJob) String() string { + if ce.targetedSentimentDetectionJob.JobName == nil { + return "Unnamed job" + } else { + return *ce.targetedSentimentDetectionJob.JobName + } +} From f30fbd63de7680e18309a2f9ba119dabb8dfb6bb Mon Sep 17 00:00:00 2001 From: Sherd White Date: Tue, 22 Aug 2023 18:54:15 -0500 Subject: [PATCH 066/135] Adding events detection job support. --- resources/comprehend_events_detection_job.go | 72 ++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 resources/comprehend_events_detection_job.go diff --git a/resources/comprehend_events_detection_job.go b/resources/comprehend_events_detection_job.go new file mode 100644 index 00000000..e8b303eb --- /dev/null +++ b/resources/comprehend_events_detection_job.go @@ -0,0 +1,72 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/comprehend" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +func init() { + register("ComprehendEventsDetectionJob", ListComprehendEventsDetectionJobs) +} + +func ListComprehendEventsDetectionJobs(sess *session.Session) ([]Resource, error) { + svc := comprehend.New(sess) + + params := &comprehend.ListEventsDetectionJobsInput{} + resources := make([]Resource, 0) + + for { + resp, err := svc.ListEventsDetectionJobs(params) + if err != nil { + return nil, err + } + for _, eventsDetectionJob := range resp.EventsDetectionJobPropertiesList { + switch *eventsDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } + resources = append(resources, &ComprehendEventsDetectionJob{ + svc: svc, + eventsDetectionJob: eventsDetectionJob, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +type ComprehendEventsDetectionJob struct { + svc *comprehend.Comprehend + eventsDetectionJob *comprehend.EventsDetectionJobProperties +} + +func (ce *ComprehendEventsDetectionJob) Remove() error { + _, err := ce.svc.StopEventsDetectionJob(&comprehend.StopEventsDetectionJobInput{ + JobId: ce.eventsDetectionJob.JobId, + }) + return err +} + +func (ce *ComprehendEventsDetectionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("JobName", ce.eventsDetectionJob.JobName) + properties.Set("JobId", ce.eventsDetectionJob.JobId) + + return properties +} + +func (ce *ComprehendEventsDetectionJob) String() string { + if ce.eventsDetectionJob.JobName == nil { + return "Unnamed job" + } else { + return *ce.eventsDetectionJob.JobName + } +} From 534298272621d96ad8e103da643110efdbf7eb11 Mon Sep 17 00:00:00 2001 From: Sherd White <106187526+swhite-oreilly@users.noreply.github.com> Date: Fri, 25 Aug 2023 03:36:33 -0500 Subject: [PATCH 067/135] Add opensearch packages vpc endpoint support (#1078) * Create opensearchservice-packages.go Adding support for opensearch packages. * Update opensearchservice-packages.go Confirmed working cleanup of os packages. * Adding opensearch vpcendpoints functionality. Removing unused var from packages. * Update opensearchservice-vpcendpoints.go Correctly retrieving VPC endpoint ids. * Update opensearchservice-packages.go Setting property values. * Update opensearchservice-vpcendpoints.go Adding id to properties. * Update opensearchservice-vpcendpoints.go Removing unneeded describe call. * Update opensearchservice-vpcendpoints.go Removed extra function for getting id's, incorporated into list function. * Adding pagination to list functions. --- resources/opensearchservice-packages.go | 75 +++++++++++++++++++++ resources/opensearchservice-vpcendpoints.go | 67 ++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 resources/opensearchservice-packages.go create mode 100644 resources/opensearchservice-vpcendpoints.go diff --git a/resources/opensearchservice-packages.go b/resources/opensearchservice-packages.go new file mode 100644 index 00000000..8dde96cf --- /dev/null +++ b/resources/opensearchservice-packages.go @@ -0,0 +1,75 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/opensearchservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type OSPackage struct { + svc *opensearchservice.OpenSearchService + packageID *string + packageName *string + createdTime *time.Time +} + +func init() { + register("OSPackage", ListOSPackages) +} + +func ListOSPackages(sess *session.Session) ([]Resource, error) { + svc := opensearchservice.New(sess) + resources := []Resource{} + var nextToken *string + + for { + params := &opensearchservice.DescribePackagesInput{ + NextToken: nextToken, + } + listResp, err := svc.DescribePackages(params) + if err != nil { + return nil, err + } + + for _, pkg := range listResp.PackageDetailsList { + resources = append(resources, &OSPackage{ + svc: svc, + packageID: pkg.PackageID, + packageName: pkg.PackageName, + createdTime: pkg.CreatedAt, + }) + } + + // Check if there are more results + if listResp.NextToken == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = listResp.NextToken + } + + return resources, nil +} + +func (o *OSPackage) Remove() error { + _, err := o.svc.DeletePackage(&opensearchservice.DeletePackageInput{ + PackageID: o.packageID, + }) + + return err +} + +func (o *OSPackage) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("PackageID", o.packageID) + properties.Set("PackageName", o.packageName) + properties.Set("CreatedTime", o.createdTime.Format(time.RFC3339)) + return properties +} + +func (o *OSPackage) String() string { + return *o.packageID +} diff --git a/resources/opensearchservice-vpcendpoints.go b/resources/opensearchservice-vpcendpoints.go new file mode 100644 index 00000000..ad2253ba --- /dev/null +++ b/resources/opensearchservice-vpcendpoints.go @@ -0,0 +1,67 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/opensearchservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type OSVPCEndpoint struct { + svc *opensearchservice.OpenSearchService + vpcEndpointId *string +} + +func init() { + register("OSVPCEndpoint", ListOSVPCEndpoints) +} + +func ListOSVPCEndpoints(sess *session.Session) ([]Resource, error) { + svc := opensearchservice.New(sess) + resources := []Resource{} + var nextToken *string + + for { + params := &opensearchservice.ListVpcEndpointsInput{ + NextToken: nextToken, + } + listResp, err := svc.ListVpcEndpoints(params) + if err != nil { + return nil, err + } + + for _, vpcEndpoint := range listResp.VpcEndpointSummaryList { + resources = append(resources, &OSVPCEndpoint{ + svc: svc, + vpcEndpointId: vpcEndpoint.VpcEndpointId, + }) + } + + // Check if there are more results + if listResp.NextToken == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = listResp.NextToken + } + + return resources, nil +} + +func (o *OSVPCEndpoint) Remove() error { + _, err := o.svc.DeleteVpcEndpoint(&opensearchservice.DeleteVpcEndpointInput{ + VpcEndpointId: o.vpcEndpointId, + }) + + return err +} + +func (o *OSVPCEndpoint) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("VpcEndpointId", o.vpcEndpointId) + return properties +} + +func (o *OSVPCEndpoint) String() string { + return *o.vpcEndpointId +} From 7771ef6ea26b5c7aba5942a6265cef5161f0730f Mon Sep 17 00:00:00 2001 From: Mike Schouw <49021968+MikeSchouw@users.noreply.github.com> Date: Fri, 25 Aug 2023 10:36:53 +0200 Subject: [PATCH 068/135] Adding tag support for FirehoseDeliveryStreams (#1088) * adding code for removing custom origin request policies * rename resource * test for replication * revert secretsmanager change * undo this * revert mod and sum changes * add resources for redshift scheduled actions * remove cloudfront resource * clean up * cloudwatch rum app * remove rum * add cloudfront origin request policy * remove * test release pipeline * add these two * update agent to self-hosted * initial commit without storing the latest tag, max tags = 1 * initial commit without storing the latest tag, max tags = 1 * simplified the if-statement * PR ready * Update release.yaml --- resources/firehose-deliverystreams.go | 36 ++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/resources/firehose-deliverystreams.go b/resources/firehose-deliverystreams.go index 831f457f..dc8c7580 100644 --- a/resources/firehose-deliverystreams.go +++ b/resources/firehose-deliverystreams.go @@ -4,11 +4,13 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/firehose" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" ) type FirehoseDeliveryStream struct { svc *firehose.Firehose deliveryStreamName *string + tags []*firehose.Tag } func init() { @@ -18,6 +20,7 @@ func init() { func ListFirehoseDeliveryStreams(sess *session.Session) ([]Resource, error) { svc := firehose.New(sess) resources := []Resource{} + tags := []*firehose.Tag{} var lastDeliveryStreamName *string params := &firehose.ListDeliveryStreamsInput{ @@ -31,14 +34,35 @@ func ListFirehoseDeliveryStreams(sess *session.Session) ([]Resource, error) { } for _, deliveryStreamName := range output.DeliveryStreamNames { + tagParams := &firehose.ListTagsForDeliveryStreamInput{ + DeliveryStreamName: deliveryStreamName, + Limit: aws.Int64(50), + } + + for { + tagResp, tagErr := svc.ListTagsForDeliveryStream(tagParams) + if tagErr != nil { + return nil, tagErr + } + + tags = append(tags, tagResp.Tags...) + if !*tagResp.HasMoreTags { + break + } + + tagParams.ExclusiveStartTagKey = tagResp.Tags[len(tagResp.Tags)-1].Key + } + resources = append(resources, &FirehoseDeliveryStream{ svc: svc, deliveryStreamName: deliveryStreamName, + tags: tags, }) + lastDeliveryStreamName = deliveryStreamName } - if *output.HasMoreDeliveryStreams == false { + if !*output.HasMoreDeliveryStreams { break } @@ -60,3 +84,13 @@ func (f *FirehoseDeliveryStream) Remove() error { func (f *FirehoseDeliveryStream) String() string { return *f.deliveryStreamName } + +func (f *FirehoseDeliveryStream) Properties() types.Properties { + properties := types.NewProperties() + for _, tag := range f.tags { + properties.SetTag(tag.Key, tag.Value) + } + + properties.Set("Name", f.deliveryStreamName) + return properties +} From 6179e5971cf4edb2374e5b6d8a4699133e0f856d Mon Sep 17 00:00:00 2001 From: Mike Schouw <49021968+MikeSchouw@users.noreply.github.com> Date: Fri, 25 Aug 2023 16:36:33 +0200 Subject: [PATCH 069/135] Adding support for AppRunner services (#1060) * adding code for removing custom origin request policies * rename resource * test for replication * revert secretsmanager change * undo this * revert mod and sum changes * add resources for redshift scheduled actions * remove cloudfront resource * clean up * cloudwatch rum app * first attempt at apprunner-service * first attempt at apprunner-service * add apprunner connection as well * clean up --- resources/apprunner-connection.go | 62 +++++++++++++++++++++++++++++ resources/apprunner-service.go | 65 +++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 resources/apprunner-connection.go create mode 100644 resources/apprunner-service.go diff --git a/resources/apprunner-connection.go b/resources/apprunner-connection.go new file mode 100644 index 00000000..27197437 --- /dev/null +++ b/resources/apprunner-connection.go @@ -0,0 +1,62 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/apprunner" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type AppRunnerConnection struct { + svc *apprunner.AppRunner + ConnectionArn *string + ConnectionName *string +} + +func init() { + register("AppRunnerConnection", ListAppRunnerConnections) +} + +func ListAppRunnerConnections(sess *session.Session) ([]Resource, error) { + svc := apprunner.New(sess) + resources := []Resource{} + + params := &apprunner.ListConnectionsInput{} + + for { + resp, err := svc.ListConnections(params) + if err != nil { + return nil, err + } + + for _, item := range resp.ConnectionSummaryList { + resources = append(resources, &AppRunnerConnection{ + svc: svc, + ConnectionArn: item.ConnectionArn, + ConnectionName: item.ConnectionName, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (f *AppRunnerConnection) Remove() error { + _, err := f.svc.DeleteConnection(&apprunner.DeleteConnectionInput{ + ConnectionArn: f.ConnectionArn, + }) + + return err +} + +func (f *AppRunnerConnection) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("ConnectionArn", f.ConnectionArn) + properties.Set("ConnectionName", f.ConnectionName) + return properties +} diff --git a/resources/apprunner-service.go b/resources/apprunner-service.go new file mode 100644 index 00000000..9a2abdc4 --- /dev/null +++ b/resources/apprunner-service.go @@ -0,0 +1,65 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/apprunner" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type AppRunnerService struct { + svc *apprunner.AppRunner + ServiceArn *string + ServiceId *string + ServiceName *string +} + +func init() { + register("AppRunnerService", ListAppRunnerServices) +} + +func ListAppRunnerServices(sess *session.Session) ([]Resource, error) { + svc := apprunner.New(sess) + resources := []Resource{} + + params := &apprunner.ListServicesInput{} + + for { + resp, err := svc.ListServices(params) + if err != nil { + return nil, err + } + + for _, item := range resp.ServiceSummaryList { + resources = append(resources, &AppRunnerService{ + svc: svc, + ServiceArn: item.ServiceArn, + ServiceId: item.ServiceId, + ServiceName: item.ServiceName, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (f *AppRunnerService) Remove() error { + _, err := f.svc.DeleteService(&apprunner.DeleteServiceInput{ + ServiceArn: f.ServiceArn, + }) + + return err +} + +func (f *AppRunnerService) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("ServiceArn", f.ServiceArn) + properties.Set("ServiceId", f.ServiceId) + properties.Set("ServiceName", f.ServiceName) + return properties +} From c0b549d4aa9403a76131f90fd25b1f5f0ef9ba7d Mon Sep 17 00:00:00 2001 From: Sam Marley-Jarrett Date: Sat, 26 Aug 2023 01:02:19 +1000 Subject: [PATCH 070/135] Add ownerID as fields to a variety of ec2/vpc resources (#964) * Add ownerID as fields to a variety of ec2/vpc resources * Fix formatting --------- Co-authored-by: Philipp Trulson Co-authored-by: Philipp Trulson --- pkg/types/properties.go | 15 ++++++++ pkg/types/properties_test.go | 38 +++++++++++++++++++ resources/ec2-dhcp-options.go | 3 ++ resources/ec2-internet-gateway-attachments.go | 6 +++ resources/ec2-route-tables.go | 3 ++ 5 files changed, 65 insertions(+) diff --git a/pkg/types/properties.go b/pkg/types/properties.go index 5789669b..bb2c27e9 100644 --- a/pkg/types/properties.go +++ b/pkg/types/properties.go @@ -85,6 +85,21 @@ func (p Properties) SetTagWithPrefix(prefix string, tagKey *string, tagValue int return p.Set(keyStr, tagValue) } +func (p Properties) SetPropertyWithPrefix(prefix string, propertyKey string, propertyValue interface{}) Properties { + keyStr := strings.TrimSpace(propertyKey) + prefix = strings.TrimSpace(prefix) + + if keyStr == "" { + return p + } + + if prefix != "" { + keyStr = fmt.Sprintf("%s:%s", prefix, keyStr) + } + + return p.Set(keyStr, propertyValue) +} + func (p Properties) Get(key string) string { value, ok := p[key] if !ok { diff --git a/pkg/types/properties_test.go b/pkg/types/properties_test.go index 79481099..6561d26d 100644 --- a/pkg/types/properties_test.go +++ b/pkg/types/properties_test.go @@ -161,3 +161,41 @@ func TestPropertiesSetTagWithPrefix(t *testing.T) { }) } } + +func TestPropertiesSetPropertiesWithPrefix(t *testing.T) { + cases := []struct { + name string + prefix string + key string + value interface{} + want string + }{ + { + name: "empty", + prefix: "", + key: "OwnerID", + value: aws.String("123456789012"), + want: `[OwnerID: "123456789012"]`, + }, + { + name: "nonempty", + prefix: "igw", + key: "OwnerID", + value: aws.String("123456789012"), + want: `[igw:OwnerID: "123456789012"]`, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + p := types.NewProperties() + + p.SetPropertyWithPrefix(tc.prefix, tc.key, tc.value) + have := p.String() + + if tc.want != have { + t.Errorf("'%s' != '%s'", tc.want, have) + } + }) + } +} diff --git a/resources/ec2-dhcp-options.go b/resources/ec2-dhcp-options.go index 705865a0..ecd8e512 100644 --- a/resources/ec2-dhcp-options.go +++ b/resources/ec2-dhcp-options.go @@ -11,6 +11,7 @@ type EC2DHCPOption struct { id *string tags []*ec2.Tag defaultVPC bool + ownerID *string } func init() { @@ -37,6 +38,7 @@ func ListEC2DHCPOptions(sess *session.Session) ([]Resource, error) { id: out.DhcpOptionsId, tags: out.Tags, defaultVPC: defVpcDhcpOptsId == *out.DhcpOptionsId, + ownerID: out.OwnerId, }) } @@ -62,6 +64,7 @@ func (e *EC2DHCPOption) Properties() types.Properties { properties.SetTag(tagValue.Key, tagValue.Value) } properties.Set("DefaultVPC", e.defaultVPC) + properties.Set("OwnerID", e.ownerID) return properties } diff --git a/resources/ec2-internet-gateway-attachments.go b/resources/ec2-internet-gateway-attachments.go index 107602fd..af87a2e5 100644 --- a/resources/ec2-internet-gateway-attachments.go +++ b/resources/ec2-internet-gateway-attachments.go @@ -12,8 +12,10 @@ import ( type EC2InternetGatewayAttachment struct { svc *ec2.EC2 vpcId *string + vpcOwnerID *string vpcTags []*ec2.Tag igwId *string + igwOwnerID *string igwTags []*ec2.Tag defaultVPC bool } @@ -50,8 +52,10 @@ func ListEC2InternetGatewayAttachments(sess *session.Session) ([]Resource, error resources = append(resources, &EC2InternetGatewayAttachment{ svc: svc, vpcId: vpc.VpcId, + vpcOwnerID: vpc.OwnerId, vpcTags: vpc.Tags, igwId: igw.InternetGatewayId, + igwOwnerID: igw.OwnerId, igwTags: igw.Tags, defaultVPC: *vpc.IsDefault, }) @@ -84,6 +88,8 @@ func (e *EC2InternetGatewayAttachment) Properties() types.Properties { properties.SetTagWithPrefix("vpc", tagValue.Key, tagValue.Value) } properties.Set("DefaultVPC", e.defaultVPC) + properties.SetPropertyWithPrefix("vpc", "OwnerID", e.vpcOwnerID) + properties.SetPropertyWithPrefix("igw", "OwnerID", e.igwOwnerID) return properties } diff --git a/resources/ec2-route-tables.go b/resources/ec2-route-tables.go index 175e7a5c..a26049f9 100644 --- a/resources/ec2-route-tables.go +++ b/resources/ec2-route-tables.go @@ -12,6 +12,7 @@ type EC2RouteTable struct { svc *ec2.EC2 routeTable *ec2.RouteTable defaultVPC bool + ownerID *string } func init() { @@ -37,6 +38,7 @@ func ListEC2RouteTables(sess *session.Session) ([]Resource, error) { svc: svc, routeTable: out, defaultVPC: defVpcId == *out.VpcId, + ownerID: out.OwnerId, }) } @@ -72,6 +74,7 @@ func (e *EC2RouteTable) Properties() types.Properties { properties.SetTag(tagValue.Key, tagValue.Value) } properties.Set("DefaultVPC", e.defaultVPC) + properties.Set("OwnerID", e.ownerID) return properties } From ab396a45a0ae06989c2dac1a502c8fab1ddb44aa Mon Sep 17 00:00:00 2001 From: Joel Armstrong Date: Fri, 25 Aug 2023 11:02:40 -0400 Subject: [PATCH 071/135] fix(IAMInstanceProfileRole): Fix instance profile role glob filtering (#982) Co-authored-by: Philipp Trulson --- resources/iam-instance-profile-roles.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/iam-instance-profile-roles.go b/resources/iam-instance-profile-roles.go index 4033423e..fe119b1d 100644 --- a/resources/iam-instance-profile-roles.go +++ b/resources/iam-instance-profile-roles.go @@ -74,7 +74,7 @@ func (e *IAMInstanceProfileRole) Remove() error { } func (e *IAMInstanceProfileRole) String() string { - return fmt.Sprintf("%s -> %s", *e.profile.InstanceProfileName, e.role) + return fmt.Sprintf("%s -> %s", *e.profile.InstanceProfileName, *e.role.RoleName) } func (e *IAMInstanceProfileRole) Properties() types.Properties { From 57238264a4064f420956ce55038cbf332d20f0d7 Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Fri, 25 Aug 2023 18:14:11 +0200 Subject: [PATCH 072/135] Filter open-access MemoryDB ACL (#1089) --- resources/memorydb-acl.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/memorydb-acl.go b/resources/memorydb-acl.go index fa43e46d..4587c4ed 100644 --- a/resources/memorydb-acl.go +++ b/resources/memorydb-acl.go @@ -1,6 +1,8 @@ package resources import ( + "fmt" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/memorydb" @@ -55,6 +57,14 @@ func ListMemoryDBACLs(sess *session.Session) ([]Resource, error) { return resources, nil } +func (i *MemoryDBACL) Filter() error { + if *i.name == "open-access" { + return fmt.Errorf("open-access ACL can't be deleted") + } else { + return nil + } +} + func (i *MemoryDBACL) Remove() error { params := &memorydb.DeleteACLInput{ ACLName: i.name, From 0dd135fbd2dd5b560b73af28f1f174d9fb0fccff Mon Sep 17 00:00:00 2001 From: wei-zhong90 <38466460+wei-zhong90@users.noreply.github.com> Date: Tue, 29 Aug 2023 10:55:51 +0200 Subject: [PATCH 073/135] (features)The delete function for cloudwatch rum is added (#952) * (features)The delete function for cloudwatch rum is added * Update resources/cloudwatch-rum.go Change the naming convention to conform to the general style as suggested Co-authored-by: Philipp Trulson * Add properties --------- Co-authored-by: Philipp Trulson Co-authored-by: Philipp Trulson --- resources/cloudwatch-rum.go | 71 +++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 resources/cloudwatch-rum.go diff --git a/resources/cloudwatch-rum.go b/resources/cloudwatch-rum.go new file mode 100644 index 00000000..15b28a74 --- /dev/null +++ b/resources/cloudwatch-rum.go @@ -0,0 +1,71 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/cloudwatchrum" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CloudWatchRumApp struct { + svc *cloudwatchrum.CloudWatchRUM + appmonitorname *string + id *string + state *string +} + +func init() { + register("CloudWatchRUMApp", ListCloudWatchRumApp) +} + +func ListCloudWatchRumApp(sess *session.Session) ([]Resource, error) { + svc := cloudwatchrum.New(sess) + resources := []Resource{} + + params := &cloudwatchrum.ListAppMonitorsInput{} + + for { + output, err := svc.ListAppMonitors(params) + if err != nil { + return nil, err + } + + for _, appEntry := range output.AppMonitorSummaries { + resources = append(resources, &CloudWatchRumApp{ + svc: svc, + appmonitorname: appEntry.Name, + id: appEntry.Id, + state: appEntry.State, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (f *CloudWatchRumApp) Remove() error { + + _, err := f.svc.DeleteAppMonitor(&cloudwatchrum.DeleteAppMonitorInput{ + Name: f.appmonitorname, + }) + + return err +} + +func (f *CloudWatchRumApp) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", *f.appmonitorname) + properties.Set("ID", *f.id) + properties.Set("State", *f.state) + + return properties +} + +func (f *CloudWatchRumApp) String() string { + return *f.appmonitorname +} From 36a47fe8f4ca840386126b604c500f822889a902 Mon Sep 17 00:00:00 2001 From: Sherd White <106187526+swhite-oreilly@users.noreply.github.com> Date: Tue, 29 Aug 2023 06:04:26 -0500 Subject: [PATCH 074/135] Update comprehend detection filters (#1090) * Updating detection filters. Adding `Completed` to the job status types that are ignored upon cleanup. * Adding filters for key-phrases and dominant-language Adding filters for key-phrases and dominant-language * Adding pii entitites and sentiment detection job support. * Adding events detection job support. --- ...prehend_dominant_language_detection_job.go | 5 ++ .../comprehend_entities_detection_job.go | 6 +- resources/comprehend_events_detection_job.go | 72 +++++++++++++++++++ .../comprehend_key_phrases_detection_job.go | 5 ++ .../comprehend_pii_entities_detection_job.go | 72 +++++++++++++++++++ .../comprehend_sentiment_detection_job.go | 6 +- ...rehend_targeted_sentiment_detection_job.go | 72 +++++++++++++++++++ 7 files changed, 232 insertions(+), 6 deletions(-) create mode 100644 resources/comprehend_events_detection_job.go create mode 100644 resources/comprehend_pii_entities_detection_job.go create mode 100644 resources/comprehend_targeted_sentiment_detection_job.go diff --git a/resources/comprehend_dominant_language_detection_job.go b/resources/comprehend_dominant_language_detection_job.go index 26bcf860..6a4a22ba 100644 --- a/resources/comprehend_dominant_language_detection_job.go +++ b/resources/comprehend_dominant_language_detection_job.go @@ -22,6 +22,11 @@ func ListComprehendDominantLanguageDetectionJobs(sess *session.Session) ([]Resou return nil, err } for _, dominantLanguageDetectionJob := range resp.DominantLanguageDetectionJobPropertiesList { + switch *dominantLanguageDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } resources = append(resources, &ComprehendDominantLanguageDetectionJob{ svc: svc, dominantLanguageDetectionJob: dominantLanguageDetectionJob, diff --git a/resources/comprehend_entities_detection_job.go b/resources/comprehend_entities_detection_job.go index 3ae80484..8baecc7a 100644 --- a/resources/comprehend_entities_detection_job.go +++ b/resources/comprehend_entities_detection_job.go @@ -22,9 +22,9 @@ func ListComprehendEntitiesDetectionJobs(sess *session.Session) ([]Resource, err return nil, err } for _, entitiesDetectionJob := range resp.EntitiesDetectionJobPropertiesList { - if *entitiesDetectionJob.JobStatus == "STOPPED" || - *entitiesDetectionJob.JobStatus == "FAILED" { - // if the job has already been stopped, do not try to delete it again + switch *entitiesDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again continue } resources = append(resources, &ComprehendEntitiesDetectionJob{ diff --git a/resources/comprehend_events_detection_job.go b/resources/comprehend_events_detection_job.go new file mode 100644 index 00000000..e8b303eb --- /dev/null +++ b/resources/comprehend_events_detection_job.go @@ -0,0 +1,72 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/comprehend" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +func init() { + register("ComprehendEventsDetectionJob", ListComprehendEventsDetectionJobs) +} + +func ListComprehendEventsDetectionJobs(sess *session.Session) ([]Resource, error) { + svc := comprehend.New(sess) + + params := &comprehend.ListEventsDetectionJobsInput{} + resources := make([]Resource, 0) + + for { + resp, err := svc.ListEventsDetectionJobs(params) + if err != nil { + return nil, err + } + for _, eventsDetectionJob := range resp.EventsDetectionJobPropertiesList { + switch *eventsDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } + resources = append(resources, &ComprehendEventsDetectionJob{ + svc: svc, + eventsDetectionJob: eventsDetectionJob, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +type ComprehendEventsDetectionJob struct { + svc *comprehend.Comprehend + eventsDetectionJob *comprehend.EventsDetectionJobProperties +} + +func (ce *ComprehendEventsDetectionJob) Remove() error { + _, err := ce.svc.StopEventsDetectionJob(&comprehend.StopEventsDetectionJobInput{ + JobId: ce.eventsDetectionJob.JobId, + }) + return err +} + +func (ce *ComprehendEventsDetectionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("JobName", ce.eventsDetectionJob.JobName) + properties.Set("JobId", ce.eventsDetectionJob.JobId) + + return properties +} + +func (ce *ComprehendEventsDetectionJob) String() string { + if ce.eventsDetectionJob.JobName == nil { + return "Unnamed job" + } else { + return *ce.eventsDetectionJob.JobName + } +} diff --git a/resources/comprehend_key_phrases_detection_job.go b/resources/comprehend_key_phrases_detection_job.go index 3a78d963..6c3009ec 100644 --- a/resources/comprehend_key_phrases_detection_job.go +++ b/resources/comprehend_key_phrases_detection_job.go @@ -22,6 +22,11 @@ func ListComprehendKeyPhrasesDetectionJobs(sess *session.Session) ([]Resource, e return nil, err } for _, keyPhrasesDetectionJob := range resp.KeyPhrasesDetectionJobPropertiesList { + switch *keyPhrasesDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } resources = append(resources, &ComprehendKeyPhrasesDetectionJob{ svc: svc, keyPhrasesDetectionJob: keyPhrasesDetectionJob, diff --git a/resources/comprehend_pii_entities_detection_job.go b/resources/comprehend_pii_entities_detection_job.go new file mode 100644 index 00000000..6d923461 --- /dev/null +++ b/resources/comprehend_pii_entities_detection_job.go @@ -0,0 +1,72 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/comprehend" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +func init() { + register("ComprehendPiiEntititesDetectionJob", ListComprehendPiiEntitiesDetectionJobs) +} + +func ListComprehendPiiEntitiesDetectionJobs(sess *session.Session) ([]Resource, error) { + svc := comprehend.New(sess) + + params := &comprehend.ListPiiEntitiesDetectionJobsInput{} + resources := make([]Resource, 0) + + for { + resp, err := svc.ListPiiEntitiesDetectionJobs(params) + if err != nil { + return nil, err + } + for _, piiEntititesDetectionJob := range resp.PiiEntitiesDetectionJobPropertiesList { + switch *piiEntititesDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } + resources = append(resources, &ComprehendPiiEntitiesDetectionJob{ + svc: svc, + piiEntititesDetectionJob: piiEntititesDetectionJob, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +type ComprehendPiiEntitiesDetectionJob struct { + svc *comprehend.Comprehend + piiEntititesDetectionJob *comprehend.PiiEntitiesDetectionJobProperties +} + +func (ce *ComprehendPiiEntitiesDetectionJob) Remove() error { + _, err := ce.svc.StopPiiEntitiesDetectionJob(&comprehend.StopPiiEntitiesDetectionJobInput{ + JobId: ce.piiEntititesDetectionJob.JobId, + }) + return err +} + +func (ce *ComprehendPiiEntitiesDetectionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("JobName", ce.piiEntititesDetectionJob.JobName) + properties.Set("JobId", ce.piiEntititesDetectionJob.JobId) + + return properties +} + +func (ce *ComprehendPiiEntitiesDetectionJob) String() string { + if ce.piiEntititesDetectionJob.JobName == nil { + return "Unnamed job" + } else { + return *ce.piiEntititesDetectionJob.JobName + } +} diff --git a/resources/comprehend_sentiment_detection_job.go b/resources/comprehend_sentiment_detection_job.go index eddd2041..835e8233 100644 --- a/resources/comprehend_sentiment_detection_job.go +++ b/resources/comprehend_sentiment_detection_job.go @@ -22,9 +22,9 @@ func ListComprehendSentimentDetectionJobs(sess *session.Session) ([]Resource, er return nil, err } for _, sentimentDetectionJob := range resp.SentimentDetectionJobPropertiesList { - if *sentimentDetectionJob.JobStatus == "STOPPED" || - *sentimentDetectionJob.JobStatus == "FAILED" { - // if the job has already been stopped, do not try to delete it again + switch *sentimentDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again continue } resources = append(resources, &ComprehendSentimentDetectionJob{ diff --git a/resources/comprehend_targeted_sentiment_detection_job.go b/resources/comprehend_targeted_sentiment_detection_job.go new file mode 100644 index 00000000..b60b39b6 --- /dev/null +++ b/resources/comprehend_targeted_sentiment_detection_job.go @@ -0,0 +1,72 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/comprehend" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +func init() { + register("ComprehendTargetedSentimentDetectionJob", ListComprehendTargetedSentimentDetectionJobs) +} + +func ListComprehendTargetedSentimentDetectionJobs(sess *session.Session) ([]Resource, error) { + svc := comprehend.New(sess) + + params := &comprehend.ListTargetedSentimentDetectionJobsInput{} + resources := make([]Resource, 0) + + for { + resp, err := svc.ListTargetedSentimentDetectionJobs(params) + if err != nil { + return nil, err + } + for _, targetedSentimentDetectionJob := range resp.TargetedSentimentDetectionJobPropertiesList { + switch *targetedSentimentDetectionJob.JobStatus { + case "STOPPED", "FAILED", "COMPLETED": + // if the job has already been stopped, failed, or completed; do not try to stop it again + continue + } + resources = append(resources, &ComprehendTargetedSentimentDetectionJob{ + svc: svc, + targetedSentimentDetectionJob: targetedSentimentDetectionJob, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +type ComprehendTargetedSentimentDetectionJob struct { + svc *comprehend.Comprehend + targetedSentimentDetectionJob *comprehend.TargetedSentimentDetectionJobProperties +} + +func (ce *ComprehendTargetedSentimentDetectionJob) Remove() error { + _, err := ce.svc.StopTargetedSentimentDetectionJob(&comprehend.StopTargetedSentimentDetectionJobInput{ + JobId: ce.targetedSentimentDetectionJob.JobId, + }) + return err +} + +func (ce *ComprehendTargetedSentimentDetectionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("JobName", ce.targetedSentimentDetectionJob.JobName) + properties.Set("JobId", ce.targetedSentimentDetectionJob.JobId) + + return properties +} + +func (ce *ComprehendTargetedSentimentDetectionJob) String() string { + if ce.targetedSentimentDetectionJob.JobName == nil { + return "Unnamed job" + } else { + return *ce.targetedSentimentDetectionJob.JobName + } +} From 7c612f4515072845e91d4974ab171658a23ca440 Mon Sep 17 00:00:00 2001 From: Muhammad-Ahmad-Rai <111280841+Muhammad-Ahmad-Rai@users.noreply.github.com> Date: Tue, 29 Aug 2023 16:05:38 +0500 Subject: [PATCH 075/135] Disabling Remediation Configuration from configservice rules before attempting deletion of rule (#1001) --- resources/configservice-configrules.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/configservice-configrules.go b/resources/configservice-configrules.go index 1246fdb8..e185b207 100644 --- a/resources/configservice-configrules.go +++ b/resources/configservice-configrules.go @@ -44,6 +44,9 @@ func ListConfigServiceConfigRules(sess *session.Session) ([]Resource, error) { } func (f *ConfigServiceConfigRule) Remove() error { + f.svc.DeleteRemediationConfiguration(&configservice.DeleteRemediationConfigurationInput{ + ConfigRuleName: f.configRuleName, + }) _, err := f.svc.DeleteConfigRule(&configservice.DeleteConfigRuleInput{ ConfigRuleName: f.configRuleName, From bffd3661cd11289f39eb228ce2b2317bd54a2c4b Mon Sep 17 00:00:00 2001 From: Andrea Decorte Date: Tue, 29 Aug 2023 14:06:07 +0200 Subject: [PATCH 076/135] Route53ResourceRecordSet: add tags of the parent Hosted Zone (#978) Add the tags of the parent Hosted Zone with a 'hz' prefix, following a similar pattern used for other resource types. Co-authored-by: Philipp Trulson --- resources/route53-resource-records.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/resources/route53-resource-records.go b/resources/route53-resource-records.go index c21cfd3f..0066f70d 100644 --- a/resources/route53-resource-records.go +++ b/resources/route53-resource-records.go @@ -15,6 +15,7 @@ type Route53ResourceRecordSet struct { hostedZoneName *string data *route53.ResourceRecordSet changeId *string + tags []*route53.Tag } func init() { @@ -49,6 +50,15 @@ func ListResourceRecordsForZone(svc *route53.Route53, zoneId *string, zoneName * HostedZoneId: zoneId, } + hostedZoneTags, err := svc.ListTagsForResource(&route53.ListTagsForResourceInput{ + ResourceId: zoneId, + ResourceType: aws.String("hostedzone"), + }) + + if err != nil { + return nil, err + } + resources := make([]Resource, 0) for { @@ -63,6 +73,7 @@ func ListResourceRecordsForZone(svc *route53.Route53, zoneId *string, zoneName * hostedZoneId: zoneId, hostedZoneName: zoneName, data: rrs, + tags: hostedZoneTags.ResourceTagSet.Tags, }) } @@ -114,9 +125,13 @@ func (r *Route53ResourceRecordSet) Remove() error { } func (r *Route53ResourceRecordSet) Properties() types.Properties { - return types.NewProperties(). - Set("Name", r.data.Name). - Set("Type", r.data.Type) + properties := types.NewProperties() + for _, tag := range r.tags { + properties.SetTagWithPrefix("hz", tag.Key, tag.Value) + } + properties.Set("Name", r.data.Name) + properties.Set("Type", r.data.Type) + return properties } func (r *Route53ResourceRecordSet) String() string { From ac386b8ee8b4a31b6969ad65ebba47f946910a0e Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Tue, 29 Aug 2023 14:49:39 +0200 Subject: [PATCH 077/135] Add dates to IAM users, access keys & Elasticache Replication Groups (#1093) * Add `CreateDate` property to IAM users Add the ability to easily filter for old or expired IAM users by adding the `CreateDate` property to them. This allows the possibility of nuking users that are "old" while leaving recently-created ones intact. * Add `CreateDate` property to IAM user access keys Add the ability to easily filter for old or expired IAM user access keys by adding the `CreateDate` property to them. This allows us to nuke user access keys that are old or expired while leaving recent ones intact. * Add `CreationTime` to elasticache replication groups Add the ability to easily filter for old or expired elasticache replication groups by adding the `CreationTime` property to them. This allows `aws-nuke` to easily clear out all "old" resources while leaving recent ones intact. * Fix ECRG change to stop using whole object --------- Co-authored-by: Remi Broemeling --- resources/elasticache-replicationgroups.go | 25 ++++++++++++++++++---- resources/iam-user-access-keys.go | 7 ++++++ resources/iam-users.go | 25 ++++++++++++++++------ 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/resources/elasticache-replicationgroups.go b/resources/elasticache-replicationgroups.go index b677263e..fc382be9 100644 --- a/resources/elasticache-replicationgroups.go +++ b/resources/elasticache-replicationgroups.go @@ -1,14 +1,18 @@ package resources import ( + "time" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/elasticache" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" ) type ElasticacheReplicationGroup struct { - svc *elasticache.ElastiCache - groupID *string + svc *elasticache.ElastiCache + groupID *string + createTime *time.Time } func init() { @@ -29,8 +33,9 @@ func ListElasticacheReplicationGroups(sess *session.Session) ([]Resource, error) for _, replicationGroup := range resp.ReplicationGroups { resources = append(resources, &ElasticacheReplicationGroup{ - svc: svc, - groupID: replicationGroup.ReplicationGroupId, + svc: svc, + groupID: replicationGroup.ReplicationGroupId, + createTime: replicationGroup.ReplicationGroupCreateTime, }) } @@ -44,6 +49,18 @@ func ListElasticacheReplicationGroups(sess *session.Session) ([]Resource, error) return resources, nil } +func (i *ElasticacheReplicationGroup) Properties() types.Properties { + properties := types.NewProperties() + + properties.Set("ID", i.groupID) + + if i.createTime != nil { + properties.Set("CreateTime", i.createTime.Format(time.RFC3339)) + } + + return properties +} + func (i *ElasticacheReplicationGroup) Remove() error { params := &elasticache.DeleteReplicationGroupInput{ ReplicationGroupId: i.groupID, diff --git a/resources/iam-user-access-keys.go b/resources/iam-user-access-keys.go index 11e837ce..250e9d6e 100644 --- a/resources/iam-user-access-keys.go +++ b/resources/iam-user-access-keys.go @@ -2,6 +2,7 @@ package resources import ( "fmt" + "time" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/iam" @@ -11,6 +12,7 @@ import ( type IAMUserAccessKey struct { svc *iam.IAM accessKeyId string + createDate *time.Time userName string status string userTags []*iam.Tag @@ -47,6 +49,7 @@ func ListIAMUserAccessKeys(sess *session.Session) ([]Resource, error) { resources = append(resources, &IAMUserAccessKey{ svc: svc, accessKeyId: *meta.AccessKeyId, + createDate: meta.CreateDate, userName: *meta.UserName, status: *meta.Status, userTags: userTags.Tags, @@ -75,6 +78,10 @@ func (e *IAMUserAccessKey) Properties() types.Properties { properties.Set("UserName", e.userName) properties.Set("AccessKeyID", e.accessKeyId) + if e.createDate != nil { + properties.Set("CreateDate", e.createDate.Format(time.RFC3339)) + } + for _, tag := range e.userTags { properties.SetTag(tag.Key, tag.Value) } diff --git a/resources/iam-users.go b/resources/iam-users.go index 67a34c16..7995fc0a 100644 --- a/resources/iam-users.go +++ b/resources/iam-users.go @@ -1,6 +1,8 @@ package resources import ( + "time" + "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/iam" "github.com/rebuy-de/aws-nuke/v2/pkg/types" @@ -8,9 +10,11 @@ import ( ) type IAMUser struct { - svc *iam.IAM - name string - tags []*iam.Tag + svc *iam.IAM + name string + tags []*iam.Tag + createDate *time.Time + passwordLastUsed *time.Time } func init() { @@ -37,9 +41,11 @@ func ListIAMUsers(sess *session.Session) ([]Resource, error) { continue } resources = append(resources, &IAMUser{ - svc: svc, - name: *out.UserName, - tags: user.Tags, + svc: svc, + name: *user.UserName, + tags: user.Tags, + createDate: user.CreateDate, + passwordLastUsed: user.PasswordLastUsed, }) } return true @@ -70,6 +76,13 @@ func (e *IAMUser) Properties() types.Properties { properties := types.NewProperties() properties.Set("Name", e.name) + if e.createDate != nil { + properties.Set("CreateDate", e.createDate.Format(time.RFC3339)) + } + if e.passwordLastUsed != nil { + properties.Set("PasswordLastUsed", e.passwordLastUsed.Format(time.RFC3339)) + } + for _, tag := range e.tags { properties.SetTag(tag.Key, tag.Value) } From 5560ce3a3aa014bf85365446f427e7d4582ac9f5 Mon Sep 17 00:00:00 2001 From: Adrian Grucza <46910040+apgrucza@users.noreply.github.com> Date: Tue, 29 Aug 2023 22:53:15 +1000 Subject: [PATCH 078/135] Fix crash when WAF/WAFRegional GetRule gives error (#894) --- resources/waf-rules.go | 5 ++++- resources/wafregional-rules.go | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/resources/waf-rules.go b/resources/waf-rules.go index a4b2b429..721c2eb4 100644 --- a/resources/waf-rules.go +++ b/resources/waf-rules.go @@ -32,9 +32,12 @@ func ListWAFRules(sess *session.Session) ([]Resource, error) { } for _, rule := range resp.Rules { - ruleResp, _ := svc.GetRule(&waf.GetRuleInput{ + ruleResp, err := svc.GetRule(&waf.GetRuleInput{ RuleId: rule.RuleId, }) + if err != nil { + return nil, err + } resources = append(resources, &WAFRule{ svc: svc, ID: rule.RuleId, diff --git a/resources/wafregional-rules.go b/resources/wafregional-rules.go index 30c771ab..5dd83ff9 100644 --- a/resources/wafregional-rules.go +++ b/resources/wafregional-rules.go @@ -34,9 +34,12 @@ func ListWAFRegionalRules(sess *session.Session) ([]Resource, error) { } for _, rule := range resp.Rules { - ruleResp, _ := svc.GetRule(&waf.GetRuleInput{ + ruleResp, err := svc.GetRule(&waf.GetRuleInput{ RuleId: rule.RuleId, }) + if err != nil { + return nil, err + } resources = append(resources, &WAFRegionalRule{ svc: svc, ID: rule.RuleId, From 2bd22d5e5c0cf6a4011b3c08a5b1c25e2e6c75bd Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Thu, 31 Aug 2023 13:44:24 +0200 Subject: [PATCH 079/135] Improve listing of cloudcontrol resources (#1096) --- dev/list-cloudcontrol/main.go | 117 ++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 55 deletions(-) diff --git a/dev/list-cloudcontrol/main.go b/dev/list-cloudcontrol/main.go index d61c3b07..b7078096 100644 --- a/dev/list-cloudcontrol/main.go +++ b/dev/list-cloudcontrol/main.go @@ -34,67 +34,74 @@ func main() { mapping := resources.GetCloudControlMapping() in := &cloudformation.ListTypesInput{ - Type: aws.String(cloudformation.RegistryTypeResource), - Visibility: aws.String(cloudformation.VisibilityPublic), - ProvisioningType: aws.String(cloudformation.ProvisioningTypeFullyMutable), - } + Type: aws.String(cloudformation.RegistryTypeResource), + Visibility: aws.String(cloudformation.VisibilityPublic), - err = cf.ListTypesPagesWithContext(ctx, in, func(out *cloudformation.ListTypesOutput, _ bool) bool { - if out == nil { - return true - } - - for _, summary := range out.TypeSummaries { - if summary == nil { - continue - } - - typeName := aws.StringValue(summary.TypeName) - color.New(color.Bold).Printf("%-55s", typeName) - if !strings.HasPrefix(typeName, "AWS::") { - color.HiBlack("does not have a valid prefix") - continue - } - - describe, err := cf.DescribeType(&cloudformation.DescribeTypeInput{ - Type: aws.String(cloudformation.RegistryTypeResource), - TypeName: aws.String(typeName), - }) - if err != nil { - color.New(color.FgRed).Println(err) - continue - } - - var schema CFTypeSchema - err = json.Unmarshal([]byte(aws.StringValue(describe.Schema)), &schema) - if err != nil { - color.New(color.FgRed).Println(err) - continue - } + Filters: &cloudformation.TypeFilters{ + TypeNamePrefix: aws.String("AWS::"), + }, + } - _, canList := schema.Handlers["list"] - if !canList { - color.New(color.FgHiBlack).Println("does not support list") - continue + // Immutable objects don't have an `update` option, but can still be removed + for _, provisioningType := range []string{cloudformation.ProvisioningTypeFullyMutable, cloudformation.ProvisioningTypeImmutable} { + in.ProvisioningType = &provisioningType + err = cf.ListTypesPagesWithContext(ctx, in, func(out *cloudformation.ListTypesOutput, _ bool) bool { + if out == nil { + return true } - resourceName, exists := mapping[typeName] - if exists && resourceName == typeName { - fmt.Print("is only covered by ") - color.New(color.FgGreen, color.Bold).Println(resourceName) - continue - } else if exists { - fmt.Print("is also covered by ") - color.New(color.FgBlue, color.Bold).Println(resourceName) - continue + for _, summary := range out.TypeSummaries { + if summary == nil { + continue + } + + typeName := aws.StringValue(summary.TypeName) + color.New(color.Bold).Printf("%-55s", typeName) + if !strings.HasPrefix(typeName, "AWS::") { + color.HiBlack("does not have a valid prefix") + continue + } + + describe, err := cf.DescribeType(&cloudformation.DescribeTypeInput{ + Type: aws.String(cloudformation.RegistryTypeResource), + TypeName: aws.String(typeName), + }) + if err != nil { + color.New(color.FgRed).Println(err) + continue + } + + var schema CFTypeSchema + err = json.Unmarshal([]byte(aws.StringValue(describe.Schema)), &schema) + if err != nil { + color.New(color.FgRed).Println(err) + continue + } + + _, canList := schema.Handlers["list"] + if !canList { + color.New(color.FgHiBlack).Println("does not support list") + continue + } + + resourceName, exists := mapping[typeName] + if exists && resourceName == typeName { + fmt.Print("is only covered by ") + color.New(color.FgGreen, color.Bold).Println(resourceName) + continue + } else if exists { + fmt.Print("is also covered by ") + color.New(color.FgBlue, color.Bold).Println(resourceName) + continue + } + + color.New(color.FgYellow).Println("is not configured") } - color.New(color.FgYellow).Println("is not configured") + return true + }) + if err != nil { + logrus.Fatal(err) } - - return true - }) - if err != nil { - logrus.Fatal(err) } } From a341126d7049acb0b36ab51304b587ac8c6f7880 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 09:22:17 +0200 Subject: [PATCH 080/135] Update readme for v2.25.0 release (#1100) Co-authored-by: der-eismann --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0446134f..5ae5d6a7 100644 --- a/README.md +++ b/README.md @@ -612,10 +612,10 @@ The easiest way of installing it, is to download the latest #### Example for Linux Intel/AMD Download and extract -`$ wget -c https://github.com/rebuy-de/aws-nuke/releases/download/v2.24.2/aws-nuke-v2.24.2-linux-amd64.tar.gz -O - | tar -xz -C $HOME/bin` +`$ 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` Run -`$ aws-nuke-v2.24.2-linux-amd64` +`$ aws-nuke-v2.25.0-linux-amd64` ### Compile from Source @@ -639,7 +639,7 @@ $ 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.24.2 \ + quay.io/rebuy/aws-nuke:v2.25.0 \ --profile default \ --config /home/aws-nuke/config.yml ``` From 5fca9fc69bbda82009ffe4809f6e3bc17e552445 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 5 Sep 2023 15:40:44 -0500 Subject: [PATCH 081/135] Remove docker_build job again (#14) --- .github/workflows/ci.yaml | 55 --------------------------------------- 1 file changed, 55 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index adf9ac40..ae827c47 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -35,58 +35,3 @@ jobs: - name: Build Project run: | make - - docker_build: - runs-on: ubuntu-22.04 - name: Docker Build - if: github.event_name != 'pull_request' || (github.event.pull_request.head.repo.full_name == 'rebuy-de/aws-nuke' && github.event.pull_request.user.login != 'dependabot[bot]') - - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Generate image tags - shell: bash - run: | - if [ "${GITHUB_EVENT_NAME}" == "pull_request" ]; then - BRANCH="$(echo ${GITHUB_HEAD_REF} | tr '/' '_')" - echo "tags=quay.io/rebuy/aws-nuke:${BRANCH},docker.io/rebuy/aws-nuke:${BRANCH}" >> $GITHUB_OUTPUT - else - echo "tags=quay.io/rebuy/aws-nuke:main,docker.io/rebuy/aws-nuke:main,\ - quay.io/rebuy/aws-nuke:latest,docker.io/rebuy/aws-nuke:latest" >> $GITHUB_OUTPUT - fi - id: generate_tags - - - name: Set up QEMU - if: github.event_name != 'pull_request' - id: qemu - uses: docker/setup-qemu-action@v2 - with: - platforms: arm64 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - with: - install: true - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Login to Quay.io - uses: docker/login-action@v2 - with: - registry: quay.io - username: ${{ secrets.QUAY_USERNAME }} - password: ${{ secrets.QUAY_PASSWORD }} - - - name: Build and push - uses: docker/build-push-action@v3 - with: - context: . - push: true - tags: ${{ steps.generate_tags.outputs.tags }} - platforms: ${{ github.event_name != 'pull_request' && 'linux/amd64,linux/arm64' || 'linux/amd64' }} From 08cd574bc7a88c7a1243ab08746a2c36bc543df0 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 6 Sep 2023 14:22:42 -0500 Subject: [PATCH 082/135] Add Transcribe support (#13) * Add TranscribeCallAnalyticsCategory resource * Add TranscribeCallAnalyticsJob resource * Add TranscribeLanguageModel resource * Add TranscribeMedicalTranscriptionJob resource * Add TranscribeMedicalVocabulary resource * Add TranscribeTranscriptionJob resource * Add TranscribeVocabulary resource * Add TranscribeVocabularyFilter resource * go fmt formatting fixes --- .../transcribe-call-analytics-categories.go | 77 +++++++++++++ resources/transcribe-call-analytics-jobs.go | 90 ++++++++++++++++ resources/transcribe-language-models.go | 91 ++++++++++++++++ .../transcribe-medical-transcription-jobs.go | 102 ++++++++++++++++++ resources/transcribe-medical-vocabularies.go | 77 +++++++++++++ resources/transcribe-transcription-jobs.go | 90 ++++++++++++++++ resources/transcribe-vocabularies.go | 77 +++++++++++++ resources/transcribe-vocabulary-filter.go | 74 +++++++++++++ 8 files changed, 678 insertions(+) create mode 100644 resources/transcribe-call-analytics-categories.go create mode 100644 resources/transcribe-call-analytics-jobs.go create mode 100644 resources/transcribe-language-models.go create mode 100644 resources/transcribe-medical-transcription-jobs.go create mode 100644 resources/transcribe-medical-vocabularies.go create mode 100644 resources/transcribe-transcription-jobs.go create mode 100644 resources/transcribe-vocabularies.go create mode 100644 resources/transcribe-vocabulary-filter.go diff --git a/resources/transcribe-call-analytics-categories.go b/resources/transcribe-call-analytics-categories.go new file mode 100644 index 00000000..892b27d3 --- /dev/null +++ b/resources/transcribe-call-analytics-categories.go @@ -0,0 +1,77 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/transcribeservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type TranscribeCallAnalyticsCategory struct { + svc *transcribeservice.TranscribeService + name *string + inputType *string + createTime *time.Time + lastUpdateTime *time.Time +} + +func init() { + register("TranscribeCallAnalyticsCategory", ListTranscribeCallAnalyticsCategories) +} + +func ListTranscribeCallAnalyticsCategories(sess *session.Session) ([]Resource, error) { + svc := transcribeservice.New(sess) + resources := []Resource{} + var nextToken *string + + for { + listCallAnalyticsCategoriesInput := &transcribeservice.ListCallAnalyticsCategoriesInput{ + NextToken: nextToken, + } + + listOutput, err := svc.ListCallAnalyticsCategories(listCallAnalyticsCategoriesInput) + if err != nil { + return nil, err + } + for _, category := range listOutput.Categories { + resources = append(resources, &TranscribeCallAnalyticsCategory{ + svc: svc, + name: category.CategoryName, + inputType: category.InputType, + createTime: category.CreateTime, + lastUpdateTime: category.LastUpdateTime, + }) + } + + // Check if there are more results + if listOutput.NextToken == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = listOutput.NextToken + } + return resources, nil +} + +func (category *TranscribeCallAnalyticsCategory) Remove() error { + deleteInput := &transcribeservice.DeleteCallAnalyticsCategoryInput{ + CategoryName: category.name, + } + _, err := category.svc.DeleteCallAnalyticsCategory(deleteInput) + return err +} + +func (category *TranscribeCallAnalyticsCategory) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", category.name) + properties.Set("InputType", category.inputType) + if category.createTime != nil { + properties.Set("CreateTime", category.createTime.Format(time.RFC3339)) + } + if category.lastUpdateTime != nil { + properties.Set("LastUpdateTime", category.lastUpdateTime.Format(time.RFC3339)) + } + return properties +} diff --git a/resources/transcribe-call-analytics-jobs.go b/resources/transcribe-call-analytics-jobs.go new file mode 100644 index 00000000..4971c9fb --- /dev/null +++ b/resources/transcribe-call-analytics-jobs.go @@ -0,0 +1,90 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/transcribeservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type TranscribeCallAnalyticsJob struct { + svc *transcribeservice.TranscribeService + name *string + status *string + completionTime *time.Time + creationTime *time.Time + failureReason *string + languageCode *string + startTime *time.Time +} + +func init() { + register("TranscribeCallAnalyticsJob", ListTranscribeCallAnalyticsJobs) +} + +func ListTranscribeCallAnalyticsJobs(sess *session.Session) ([]Resource, error) { + svc := transcribeservice.New(sess) + resources := []Resource{} + var nextToken *string + + for { + listCallAnalyticsJobsInput := &transcribeservice.ListCallAnalyticsJobsInput{ + MaxResults: aws.Int64(100), + NextToken: nextToken, + } + + listOutput, err := svc.ListCallAnalyticsJobs(listCallAnalyticsJobsInput) + if err != nil { + return nil, err + } + for _, job := range listOutput.CallAnalyticsJobSummaries { + resources = append(resources, &TranscribeCallAnalyticsJob{ + svc: svc, + name: job.CallAnalyticsJobName, + status: job.CallAnalyticsJobStatus, + completionTime: job.CompletionTime, + creationTime: job.CreationTime, + failureReason: job.FailureReason, + languageCode: job.LanguageCode, + startTime: job.StartTime, + }) + } + + // Check if there are more results + if listOutput.NextToken == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = listOutput.NextToken + } + return resources, nil +} + +func (job *TranscribeCallAnalyticsJob) Remove() error { + deleteInput := &transcribeservice.DeleteCallAnalyticsJobInput{ + CallAnalyticsJobName: job.name, + } + _, err := job.svc.DeleteCallAnalyticsJob(deleteInput) + return err +} + +func (job *TranscribeCallAnalyticsJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", job.name) + properties.Set("Status", job.status) + if job.completionTime != nil { + properties.Set("CompletionTime", job.completionTime.Format(time.RFC3339)) + } + if job.creationTime != nil { + properties.Set("CreationTime", job.creationTime.Format(time.RFC3339)) + } + properties.Set("FailureReason", job.failureReason) + properties.Set("LanguageCode", job.languageCode) + if job.startTime != nil { + properties.Set("StartTime", job.startTime.Format(time.RFC3339)) + } + return properties +} diff --git a/resources/transcribe-language-models.go b/resources/transcribe-language-models.go new file mode 100644 index 00000000..aab986e8 --- /dev/null +++ b/resources/transcribe-language-models.go @@ -0,0 +1,91 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/transcribeservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type TranscribeLanguageModel struct { + svc *transcribeservice.TranscribeService + name *string + baseModelName *string + createTime *time.Time + failureReason *string + languageCode *string + lastModifiedTime *time.Time + modelStatus *string + upgradeAvailability *bool +} + +func init() { + register("TranscribeLanguageModel", ListTranscribeLanguageModels) +} + +func ListTranscribeLanguageModels(sess *session.Session) ([]Resource, error) { + svc := transcribeservice.New(sess) + resources := []Resource{} + var nextToken *string + + for { + listLanguageModelsInput := &transcribeservice.ListLanguageModelsInput{ + MaxResults: aws.Int64(100), + NextToken: nextToken, + } + + listOutput, err := svc.ListLanguageModels(listLanguageModelsInput) + if err != nil { + return nil, err + } + for _, model := range listOutput.Models { + resources = append(resources, &TranscribeLanguageModel{ + svc: svc, + name: model.ModelName, + baseModelName: model.BaseModelName, + createTime: model.CreateTime, + failureReason: model.FailureReason, + languageCode: model.LanguageCode, + lastModifiedTime: model.LastModifiedTime, + modelStatus: model.ModelStatus, + upgradeAvailability: model.UpgradeAvailability, + }) + } + + // Check if there are more results + if listOutput.NextToken == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = listOutput.NextToken + } + return resources, nil +} + +func (model *TranscribeLanguageModel) Remove() error { + deleteInput := &transcribeservice.DeleteLanguageModelInput{ + ModelName: model.name, + } + _, err := model.svc.DeleteLanguageModel(deleteInput) + return err +} + +func (model *TranscribeLanguageModel) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", model.name) + properties.Set("BaseModelName", model.baseModelName) + if model.createTime != nil { + properties.Set("CreateTime", model.createTime.Format(time.RFC3339)) + } + properties.Set("FailureReason", model.failureReason) + properties.Set("LanguageCode", model.languageCode) + if model.lastModifiedTime != nil { + properties.Set("LastModifiedTime", model.lastModifiedTime.Format(time.RFC3339)) + } + properties.Set("ModelStatus", model.modelStatus) + properties.Set("UpgradeAvailability", model.upgradeAvailability) + return properties +} diff --git a/resources/transcribe-medical-transcription-jobs.go b/resources/transcribe-medical-transcription-jobs.go new file mode 100644 index 00000000..6547421c --- /dev/null +++ b/resources/transcribe-medical-transcription-jobs.go @@ -0,0 +1,102 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/transcribeservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type TranscribeMedicalTranscriptionJob struct { + svc *transcribeservice.TranscribeService + name *string + status *string + completionTime *time.Time + contentIdentificationType *string + creationTime *time.Time + failureReason *string + languageCode *string + outputLocationType *string + specialty *string + startTime *time.Time + inputType *string +} + +func init() { + register("TranscribeMedicalTranscriptionJob", ListTranscribeMedicalTranscriptionJobs) +} + +func ListTranscribeMedicalTranscriptionJobs(sess *session.Session) ([]Resource, error) { + svc := transcribeservice.New(sess) + resources := []Resource{} + var nextToken *string + + for { + listMedicalTranscriptionJobsInput := &transcribeservice.ListMedicalTranscriptionJobsInput{ + MaxResults: aws.Int64(100), + NextToken: nextToken, + } + + listOutput, err := svc.ListMedicalTranscriptionJobs(listMedicalTranscriptionJobsInput) + if err != nil { + return nil, err + } + for _, job := range listOutput.MedicalTranscriptionJobSummaries { + resources = append(resources, &TranscribeMedicalTranscriptionJob{ + svc: svc, + name: job.MedicalTranscriptionJobName, + status: job.TranscriptionJobStatus, + completionTime: job.CompletionTime, + contentIdentificationType: job.ContentIdentificationType, + creationTime: job.CreationTime, + failureReason: job.FailureReason, + languageCode: job.LanguageCode, + outputLocationType: job.OutputLocationType, + specialty: job.Specialty, + startTime: job.StartTime, + inputType: job.Type, + }) + } + + // Check if there are more results + if listOutput.NextToken == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = listOutput.NextToken + } + return resources, nil +} + +func (job *TranscribeMedicalTranscriptionJob) Remove() error { + deleteInput := &transcribeservice.DeleteMedicalTranscriptionJobInput{ + MedicalTranscriptionJobName: job.name, + } + _, err := job.svc.DeleteMedicalTranscriptionJob(deleteInput) + return err +} + +func (job *TranscribeMedicalTranscriptionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", job.name) + properties.Set("Status", job.status) + if job.completionTime != nil { + properties.Set("CompletionTime", job.completionTime.Format(time.RFC3339)) + } + properties.Set("ContentIdentificationType", job.contentIdentificationType) + if job.creationTime != nil { + properties.Set("CreationTime", job.creationTime.Format(time.RFC3339)) + } + properties.Set("FailureReason", job.failureReason) + properties.Set("LanguageCode", job.languageCode) + properties.Set("OutputLocationType", job.outputLocationType) + properties.Set("Specialty", job.specialty) + if job.startTime != nil { + properties.Set("StartTime", job.startTime.Format(time.RFC3339)) + } + properties.Set("InputType", job.inputType) + return properties +} diff --git a/resources/transcribe-medical-vocabularies.go b/resources/transcribe-medical-vocabularies.go new file mode 100644 index 00000000..0f4b1ffa --- /dev/null +++ b/resources/transcribe-medical-vocabularies.go @@ -0,0 +1,77 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/transcribeservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type TranscribeMedicalVocabulary struct { + svc *transcribeservice.TranscribeService + name *string + state *string + languageCode *string + lastModifiedTime *time.Time +} + +func init() { + register("TranscribeMedicalVocabulary", ListTranscribeMedicalVocabularies) +} + +func ListTranscribeMedicalVocabularies(sess *session.Session) ([]Resource, error) { + svc := transcribeservice.New(sess) + resources := []Resource{} + var nextToken *string + + for { + listMedicalVocabulariesInput := &transcribeservice.ListMedicalVocabulariesInput{ + MaxResults: aws.Int64(100), + NextToken: nextToken, + } + + listOutput, err := svc.ListMedicalVocabularies(listMedicalVocabulariesInput) + if err != nil { + return nil, err + } + for _, vocab := range listOutput.Vocabularies { + resources = append(resources, &TranscribeMedicalVocabulary{ + svc: svc, + name: vocab.VocabularyName, + state: vocab.VocabularyState, + languageCode: vocab.LanguageCode, + lastModifiedTime: vocab.LastModifiedTime, + }) + } + + // Check if there are more results + if listOutput.NextToken == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = listOutput.NextToken + } + return resources, nil +} + +func (vocab *TranscribeMedicalVocabulary) Remove() error { + deleteInput := &transcribeservice.DeleteMedicalVocabularyInput{ + VocabularyName: vocab.name, + } + _, err := vocab.svc.DeleteMedicalVocabulary(deleteInput) + return err +} + +func (vocab *TranscribeMedicalVocabulary) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", vocab.name) + properties.Set("State", vocab.state) + properties.Set("LanguageCode", vocab.languageCode) + if vocab.lastModifiedTime != nil { + properties.Set("LastModifiedTime", vocab.lastModifiedTime.Format(time.RFC3339)) + } + return properties +} diff --git a/resources/transcribe-transcription-jobs.go b/resources/transcribe-transcription-jobs.go new file mode 100644 index 00000000..b4ff71f7 --- /dev/null +++ b/resources/transcribe-transcription-jobs.go @@ -0,0 +1,90 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/transcribeservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type TranscribeTranscriptionJob struct { + svc *transcribeservice.TranscribeService + name *string + status *string + completionTime *time.Time + creationTime *time.Time + failureReason *string + languageCode *string + startTime *time.Time +} + +func init() { + register("TranscribeTranscriptionJob", ListTranscribeTranscriptionJobs) +} + +func ListTranscribeTranscriptionJobs(sess *session.Session) ([]Resource, error) { + svc := transcribeservice.New(sess) + resources := []Resource{} + var nextToken *string + + for { + listTranscriptionJobsInput := &transcribeservice.ListTranscriptionJobsInput{ + MaxResults: aws.Int64(100), + NextToken: nextToken, + } + + listOutput, err := svc.ListTranscriptionJobs(listTranscriptionJobsInput) + if err != nil { + return nil, err + } + for _, job := range listOutput.TranscriptionJobSummaries { + resources = append(resources, &TranscribeTranscriptionJob{ + svc: svc, + name: job.TranscriptionJobName, + status: job.TranscriptionJobStatus, + completionTime: job.CompletionTime, + creationTime: job.CreationTime, + failureReason: job.FailureReason, + languageCode: job.LanguageCode, + startTime: job.StartTime, + }) + } + + // Check if there are more results + if listOutput.NextToken == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = listOutput.NextToken + } + return resources, nil +} + +func (job *TranscribeTranscriptionJob) Remove() error { + deleteInput := &transcribeservice.DeleteTranscriptionJobInput{ + TranscriptionJobName: job.name, + } + _, err := job.svc.DeleteTranscriptionJob(deleteInput) + return err +} + +func (job *TranscribeTranscriptionJob) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", job.name) + properties.Set("Status", job.status) + if job.completionTime != nil { + properties.Set("CompletionTime", job.completionTime.Format(time.RFC3339)) + } + if job.creationTime != nil { + properties.Set("CreationTime", job.creationTime.Format(time.RFC3339)) + } + properties.Set("FailureReason", job.failureReason) + properties.Set("LanguageCode", job.languageCode) + if job.startTime != nil { + properties.Set("StartTime", job.startTime.Format(time.RFC3339)) + } + return properties +} diff --git a/resources/transcribe-vocabularies.go b/resources/transcribe-vocabularies.go new file mode 100644 index 00000000..18771b24 --- /dev/null +++ b/resources/transcribe-vocabularies.go @@ -0,0 +1,77 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/transcribeservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type TranscribeVocabulary struct { + svc *transcribeservice.TranscribeService + name *string + state *string + languageCode *string + lastModifiedTime *time.Time +} + +func init() { + register("TranscribeVocabulary", ListTranscribeVocabularies) +} + +func ListTranscribeVocabularies(sess *session.Session) ([]Resource, error) { + svc := transcribeservice.New(sess) + resources := []Resource{} + var nextToken *string + + for { + listVocabulariesInput := &transcribeservice.ListVocabulariesInput{ + MaxResults: aws.Int64(100), + NextToken: nextToken, + } + + listOutput, err := svc.ListVocabularies(listVocabulariesInput) + if err != nil { + return nil, err + } + for _, vocab := range listOutput.Vocabularies { + resources = append(resources, &TranscribeVocabulary{ + svc: svc, + name: vocab.VocabularyName, + state: vocab.VocabularyState, + languageCode: vocab.LanguageCode, + lastModifiedTime: vocab.LastModifiedTime, + }) + } + + // Check if there are more results + if listOutput.NextToken == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = listOutput.NextToken + } + return resources, nil +} + +func (vocab *TranscribeVocabulary) Remove() error { + deleteInput := &transcribeservice.DeleteVocabularyInput{ + VocabularyName: vocab.name, + } + _, err := vocab.svc.DeleteVocabulary(deleteInput) + return err +} + +func (vocab *TranscribeVocabulary) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", vocab.name) + properties.Set("State", vocab.state) + properties.Set("LanguageCode", vocab.languageCode) + if vocab.lastModifiedTime != nil { + properties.Set("LastModifiedTime", vocab.lastModifiedTime.Format(time.RFC3339)) + } + return properties +} diff --git a/resources/transcribe-vocabulary-filter.go b/resources/transcribe-vocabulary-filter.go new file mode 100644 index 00000000..d3c51897 --- /dev/null +++ b/resources/transcribe-vocabulary-filter.go @@ -0,0 +1,74 @@ +package resources + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/transcribeservice" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type TranscribeVocabularyFilter struct { + svc *transcribeservice.TranscribeService + name *string + languageCode *string + lastModifiedTime *time.Time +} + +func init() { + register("TranscribeVocabularyFilter", ListTranscribeVocabularyFilters) +} + +func ListTranscribeVocabularyFilters(sess *session.Session) ([]Resource, error) { + svc := transcribeservice.New(sess) + resources := []Resource{} + var nextToken *string + + for { + listVocabularyFiltersInput := &transcribeservice.ListVocabularyFiltersInput{ + MaxResults: aws.Int64(100), + NextToken: nextToken, + } + + listOutput, err := svc.ListVocabularyFilters(listVocabularyFiltersInput) + if err != nil { + return nil, err + } + for _, filter := range listOutput.VocabularyFilters { + resources = append(resources, &TranscribeVocabularyFilter{ + svc: svc, + name: filter.VocabularyFilterName, + languageCode: filter.LanguageCode, + lastModifiedTime: filter.LastModifiedTime, + }) + } + + // Check if there are more results + if listOutput.NextToken == nil { + break // No more results, exit the loop + } + + // Set the nextToken for the next iteration + nextToken = listOutput.NextToken + } + return resources, nil +} + +func (filter *TranscribeVocabularyFilter) Remove() error { + deleteInput := &transcribeservice.DeleteVocabularyFilterInput{ + VocabularyFilterName: filter.name, + } + _, err := filter.svc.DeleteVocabularyFilter(deleteInput) + return err +} + +func (filter *TranscribeVocabularyFilter) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", filter.name) + properties.Set("LanguageCode", filter.languageCode) + if filter.lastModifiedTime != nil { + properties.Set("LastModifiedTime", filter.lastModifiedTime.Format(time.RFC3339)) + } + return properties +} From 90a9c2a749c55c328f95d583e3caa17a4bdc6194 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 11:41:23 +0200 Subject: [PATCH 083/135] Bump the golang group with 1 update (#1105) Bumps the golang group with 1 update: [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go). - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.44.328...v1.45.12) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ed24ca09..c6c14032 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.44.328 + github.com/aws/aws-sdk-go v1.45.12 github.com/fatih/color v1.15.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.1 diff --git a/go.sum b/go.sum index befb1b71..98bdd171 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.44.328 h1:WBwlf8ym9SDQ/GTIBO9eXyvwappKJyOetWJKl4mT7ZU= -github.com/aws/aws-sdk-go v1.44.328/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.45.12 h1:+bKbbesGNPp+TeGrcqfrWuZoqcIEhjwKyBMHQPp80Jo= +github.com/aws/aws-sdk-go v1.45.12/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 724a06404e28858e0266aae231dd502ad7507372 Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Thu, 21 Sep 2023 11:07:41 +0200 Subject: [PATCH 084/135] Upgrade checkout action in workflows to v4 (#1106) > This is an automatically generated PR. actions/checkout got a new release with v4. Shouldn't affect anything, just newer. @rebuy-de/it-platform FYI --- .github/workflows/ci.yaml | 4 ++-- .github/workflows/release.yaml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 37a19c19..078944ac 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -21,7 +21,7 @@ jobs: run: | go install golang.org/x/lint/golint@latest - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Check Formatting run: | if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then @@ -42,7 +42,7 @@ jobs: if: github.event_name != 'pull_request' || (github.event.pull_request.head.repo.full_name == 'rebuy-de/aws-nuke' && github.event.pull_request.user.login != 'dependabot[bot]') steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 738d2760..04a79068 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 ref: main @@ -40,7 +40,7 @@ jobs: with: go-version: '1.21' - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Build Project binaries @@ -62,7 +62,7 @@ jobs: name: Docker Build steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 From 54c1ff91ff772912562e48bd6667eba29ac2b76e Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Tue, 3 Oct 2023 14:07:54 +0000 Subject: [PATCH 085/135] Add support for codebuild builds Signed-off-by: Gabriela S. Soria --- resources/codebuild-builds.go | 60 +++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 resources/codebuild-builds.go diff --git a/resources/codebuild-builds.go b/resources/codebuild-builds.go new file mode 100644 index 00000000..e6e10810 --- /dev/null +++ b/resources/codebuild-builds.go @@ -0,0 +1,60 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/codebuild" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CodeBuildBuild struct { + svc *codebuild.CodeBuild + Id *string +} + +func init() { + register("CodeBuildBuild", ListCodeBuildBuild) +} + +func ListCodeBuildBuild(sess *session.Session) ([]Resource, error) { + svc := codebuild.New(sess) + resources := []Resource{} + + params := &codebuild.ListBuildsInput{} + + for { + resp, err := svc.ListBuilds(params) + if err != nil { + return nil, err + } + + for _, build := range resp.Ids { + resources = append(resources, &CodeBuildBuild{ + svc: svc, + Id: build, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (f *CodeBuildBuild) Remove() error { + _, err := f.svc.BatchDeleteBuilds(&codebuild.BatchDeleteBuildsInput{ + Ids: []*string{f.Id}, + }) + + return err +} + +func (f *CodeBuildBuild) Properties() types.Properties { + properties := types.NewProperties() + properties. + Set("Id", f.Id) + return properties +} From c703c4346dcff278abd6072d8d72d9be4e911034 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 11:32:35 +0200 Subject: [PATCH 086/135] Bump the golang group with 2 updates (#1120) Bumps the golang group with 2 updates: [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) and [golang.org/x/sync](https://github.com/golang/sync). Updates `github.com/aws/aws-sdk-go` from 1.45.12 to 1.45.24 - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.45.12...v1.45.24) Updates `golang.org/x/sync` from 0.3.0 to 0.4.0 - [Commits](https://github.com/golang/sync/compare/v0.3.0...v0.4.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-patch dependency-group: golang - dependency-name: golang.org/x/sync dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index c6c14032..c3490456 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.45.12 + github.com/aws/aws-sdk-go v1.45.24 github.com/fatih/color v1.15.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.1 @@ -13,7 +13,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/stretchr/testify v1.8.4 - golang.org/x/sync v0.3.0 + golang.org/x/sync v0.4.0 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index 98bdd171..58eedb7a 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.45.12 h1:+bKbbesGNPp+TeGrcqfrWuZoqcIEhjwKyBMHQPp80Jo= -github.com/aws/aws-sdk-go v1.45.12/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.45.24 h1:TZx/CizkmCQn8Rtsb11iLYutEQVGK5PK9wAhwouELBo= +github.com/aws/aws-sdk-go v1.45.24/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -75,8 +75,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From c6b2a70b4c0175abe2b4f5bb79bdc03ba6976c70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 10:18:00 +0200 Subject: [PATCH 087/135] Bump the golang group with 1 update (#1122) Bumps the golang group with 1 update: [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go). - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.45.24...v1.45.26) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-patch dependency-group: golang ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c3490456..e207b751 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.45.24 + github.com/aws/aws-sdk-go v1.45.26 github.com/fatih/color v1.15.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.1 diff --git a/go.sum b/go.sum index 58eedb7a..7f833c1e 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.45.24 h1:TZx/CizkmCQn8Rtsb11iLYutEQVGK5PK9wAhwouELBo= -github.com/aws/aws-sdk-go v1.45.24/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.45.26 h1:PJ2NJNY5N/yeobLYe1Y+xLdavBi67ZI8gvph6ftwVCg= +github.com/aws/aws-sdk-go v1.45.26/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 4d35ec1dd66d73a782c2cbf424322ecc3f497368 Mon Sep 17 00:00:00 2001 From: Sherd White <106187526+swhite-oreilly@users.noreply.github.com> Date: Mon, 23 Oct 2023 13:25:12 -0500 Subject: [PATCH 088/135] Add filter for opensearch default packages (#1130) * Adding filter to skip default opensearch packages --- resources/opensearchservice-packages.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/resources/opensearchservice-packages.go b/resources/opensearchservice-packages.go index 8dde96cf..99f336d3 100644 --- a/resources/opensearchservice-packages.go +++ b/resources/opensearchservice-packages.go @@ -1,6 +1,8 @@ package resources import ( + "fmt" + "strings" "time" "github.com/aws/aws-sdk-go/aws/session" @@ -54,6 +56,13 @@ func ListOSPackages(sess *session.Session) ([]Resource, error) { return resources, nil } +func (o *OSPackage) Filter() error { + if strings.HasPrefix(*o.packageID, "G") { + return fmt.Errorf("cannot delete default opensearch packages") + } + return nil +} + func (o *OSPackage) Remove() error { _, err := o.svc.DeletePackage(&opensearchservice.DeletePackageInput{ PackageID: o.packageID, From c2ae6d768beacb0434d23f2ea6358691284fdb29 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Tue, 24 Oct 2023 08:38:31 -0500 Subject: [PATCH 089/135] Update release.yaml Removing docker_build again. --- .github/workflows/release.yaml | 46 ---------------------------------- 1 file changed, 46 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3c14a99f..617e29d4 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -31,49 +31,3 @@ jobs: tag: ${{ github.ref }} overwrite: true file_glob: true - - docker_build: - runs-on: ubuntu-22.04 - name: Docker Build - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate image tags - shell: bash - run: echo "tags=quay.io/rebuy/aws-nuke:${GITHUB_REF#refs/tags/},docker.io/rebuy/aws-nuke:${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - id: generate_tags - - - name: Set up QEMU - id: qemu - uses: docker/setup-qemu-action@v2 - with: - platforms: arm64 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - with: - install: true - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Login to Quay.io - uses: docker/login-action@v2 - with: - registry: quay.io - username: ${{ secrets.QUAY_USERNAME }} - password: ${{ secrets.QUAY_PASSWORD }} - - - name: Build and push - uses: docker/build-push-action@v3 - with: - context: . - push: true - tags: ${{ steps.generate_tags.outputs.tags }} - platforms: linux/amd64,linux/arm64 From b185389ca01c0c7d1d2082220d30ca0f5dae4ff5 Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Tue, 24 Oct 2023 17:44:33 -0700 Subject: [PATCH 090/135] Add CodeGuru Reviewer RepositoryAssociation support Signed-off-by: Gabriela S. Soria --- ...odegurureviewer-repository-associations.go | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 resources/codegurureviewer-repository-associations.go diff --git a/resources/codegurureviewer-repository-associations.go b/resources/codegurureviewer-repository-associations.go new file mode 100644 index 00000000..d0dbb6c4 --- /dev/null +++ b/resources/codegurureviewer-repository-associations.go @@ -0,0 +1,71 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/codegurureviewer" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CodeGuruReviewerRepositoryAssociation struct { + svc *codegurureviewer.CodeGuruReviewer + AssociationArn *string + AssociationId *string + Name *string + Owner *string + ProviderType *string +} + +func init() { + register("CodeGuruReviewerRepositoryAssociation", ListCodeGuruReviewerRepositoryAssociations) +} + +func ListCodeGuruReviewerRepositoryAssociations(sess *session.Session) ([]Resource, error) { + svc := codegurureviewer.New(sess) + resources := []Resource{} + + params := &codegurureviewer.ListRepositoryAssociationsInput{} + + for { + resp, err := svc.ListRepositoryAssociations(params) + if err != nil { + return nil, err + } + + for _, association := range resp.RepositoryAssociationSummaries { + resources = append(resources, &CodeGuruReviewerRepositoryAssociation{ + svc: svc, + AssociationArn: association.AssociationArn, + AssociationId: association.AssociationId, + Name: association.Name, + Owner: association.Owner, + ProviderType: association.ProviderType, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (f *CodeGuruReviewerRepositoryAssociation) Remove() error { + _, err := f.svc.DisassociateRepository(&codegurureviewer.DisassociateRepositoryInput{ + AssociationArn: f.AssociationArn, + }) + return err +} + +func (f *CodeGuruReviewerRepositoryAssociation) Properties() types.Properties { + properties := types.NewProperties() + properties. + Set("AssociationArn", f.AssociationArn) + properties.Set("AssociationId", f.AssociationId) + properties.Set("Name", f.Name) + properties.Set("Owner", f.Owner) + properties.Set("ProviderType", f.ProviderType) + return properties +} From e22e3d9f6fbf44ca59369babc86b15bfb5820555 Mon Sep 17 00:00:00 2001 From: Sinisha Mihajlovski <9953687+sinisa229@users.noreply.github.com> Date: Thu, 26 Oct 2023 15:56:07 +0100 Subject: [PATCH 091/135] Fixing a null pointer exception --- resources/route53-resolver-rules.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/route53-resolver-rules.go b/resources/route53-resolver-rules.go index ad6e0dd0..a274dc85 100644 --- a/resources/route53-resolver-rules.go +++ b/resources/route53-resolver-rules.go @@ -100,7 +100,7 @@ func resolverRulesToVpcIDs(svc *route53resolver.Route53Resolver) (map[string][]* // Filter removes resources automatically from being nuked func (r *Route53ResolverRule) Filter() error { - if *r.domainName == "." { + if r.domainName != nil && *r.domainName == "." { return fmt.Errorf(`Filtering DomainName "."`) } From 4e8c0c5ef9c5525b1d881dadca38673136a699e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Oct 2023 17:05:20 +0200 Subject: [PATCH 092/135] Bump the golang group with 1 update (#1133) Bumps the golang group with 1 update: [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go). - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.45.26...v1.46.2) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e207b751..08806d23 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.45.26 + github.com/aws/aws-sdk-go v1.46.2 github.com/fatih/color v1.15.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.1 diff --git a/go.sum b/go.sum index 7f833c1e..7fcbc34a 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.45.26 h1:PJ2NJNY5N/yeobLYe1Y+xLdavBi67ZI8gvph6ftwVCg= -github.com/aws/aws-sdk-go v1.45.26/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.46.2 h1:XZbOmjtN1VCfEtQq7QNFsbxIqO+bB+bRhiOBjp6AzWc= +github.com/aws/aws-sdk-go v1.46.2/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 1ded821364448d23a2cf1413d6220d16904946d6 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Tue, 31 Oct 2023 10:03:20 -0500 Subject: [PATCH 093/135] cl-724 Adding support for codedeploy deployment configs Due to errors with using the cloud control resource type AWS::CodeDeploy::DeploymentConfig, creating custom nuke module for CodeDeploy Deployment Configs. --- resources/codedeploy-deployment-configs.go | 74 ++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 resources/codedeploy-deployment-configs.go diff --git a/resources/codedeploy-deployment-configs.go b/resources/codedeploy-deployment-configs.go new file mode 100644 index 00000000..0c47934c --- /dev/null +++ b/resources/codedeploy-deployment-configs.go @@ -0,0 +1,74 @@ +package resources + +import ( + "fmt" + "strings" + + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/codedeploy" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CodeDeployDeploymentConfig struct { + svc *codedeploy.CodeDeploy + deploymentConfigName *string +} + +func init() { + register("CodeDeployDeploymentConfig", ListCodeDeployDeploymentConfigs) +} + +func ListCodeDeployDeploymentConfigs(sess *session.Session) ([]Resource, error) { + svc := codedeploy.New(sess) + resources := []Resource{} + + params := &codedeploy.ListDeploymentConfigsInput{} + + for { + resp, err := svc.ListDeploymentConfigs(params) + if err != nil { + return nil, err + } + + for _, config := range resp.DeploymentConfigsList { + resources = append(resources, &CodeDeployDeploymentConfig{ + svc: svc, + deploymentConfigName: config, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (f *CodeDeployDeploymentConfig) Filter() error { + if strings.HasPrefix(*f.deploymentConfigName, "CodeDeployDefault") { + return fmt.Errorf("cannot delete default codedeploy config") + } + return nil +} + +func (f *CodeDeployDeploymentConfig) Remove() error { + + _, err := f.svc.DeleteDeploymentConfig(&codedeploy.DeleteDeploymentConfigInput{ + DeploymentConfigName: f.deploymentConfigName, + }) + + return err +} + +func (f *CodeDeployDeploymentConfig) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("DeploymentConfigName", f.deploymentConfigName) + return properties +} + +func (f *CodeDeployDeploymentConfig) String() string { + return *f.deploymentConfigName +} From 888f8d2a9d679d9c6f069e58424d2605e2a5805a Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Tue, 31 Oct 2023 09:22:51 -0700 Subject: [PATCH 094/135] CL-732 | add cloud control mapping for `RepositoryAssociation` Signed-off-by: Gabriela S. Soria --- resources/codegurureviewer-repository-associations.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/codegurureviewer-repository-associations.go b/resources/codegurureviewer-repository-associations.go index d0dbb6c4..e630ad94 100644 --- a/resources/codegurureviewer-repository-associations.go +++ b/resources/codegurureviewer-repository-associations.go @@ -16,7 +16,8 @@ type CodeGuruReviewerRepositoryAssociation struct { } func init() { - register("CodeGuruReviewerRepositoryAssociation", ListCodeGuruReviewerRepositoryAssociations) + register("CodeGuruReviewerRepositoryAssociation", ListCodeGuruReviewerRepositoryAssociations, + mapCloudControl("AWS::CodeGuruReviewer::RepositoryAssociation")) } func ListCodeGuruReviewerRepositoryAssociations(sess *session.Session) ([]Resource, error) { From 31d479e18544c4cee451cdb4c1930158e0c2e22d Mon Sep 17 00:00:00 2001 From: Sherd White <106187526+swhite-oreilly@users.noreply.github.com> Date: Wed, 1 Nov 2023 11:23:44 -0500 Subject: [PATCH 095/135] Update resources/codedeploy-deployment-configs.go Co-authored-by: Gabriela Soria --- resources/codedeploy-deployment-configs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/codedeploy-deployment-configs.go b/resources/codedeploy-deployment-configs.go index 0c47934c..5360210e 100644 --- a/resources/codedeploy-deployment-configs.go +++ b/resources/codedeploy-deployment-configs.go @@ -15,7 +15,7 @@ type CodeDeployDeploymentConfig struct { } func init() { - register("CodeDeployDeploymentConfig", ListCodeDeployDeploymentConfigs) + register("CodeDeployDeploymentConfig", ListCodeDeployDeploymentConfigs, mapCloudControl("AWS::CodeDeploy::DeploymentConfig")) } func ListCodeDeployDeploymentConfigs(sess *session.Session) ([]Resource, error) { From 0bc09f274589a3f0c3245fc0d23451be3feb22bd Mon Sep 17 00:00:00 2001 From: Sherd White Date: Wed, 1 Nov 2023 13:17:31 -0500 Subject: [PATCH 096/135] Adding custom action type support. --- resources/codepipeline-custom-action-types.go | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 resources/codepipeline-custom-action-types.go diff --git a/resources/codepipeline-custom-action-types.go b/resources/codepipeline-custom-action-types.go new file mode 100644 index 00000000..02acd741 --- /dev/null +++ b/resources/codepipeline-custom-action-types.go @@ -0,0 +1,79 @@ +package resources + +import ( + "fmt" + "strings" + + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/codepipeline" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CodePipelineCustomActionType struct { + svc *codepipeline.CodePipeline + owner *string + category *string + provider *string +} + +func init() { + register("CodePipelineCustomActionType", ListCodePipelineCustomActionTypes) +} + +func ListCodePipelineCustomActionTypes(sess *session.Session) ([]Resource, error) { + svc := codepipeline.New(sess) + resources := []Resource{} + + params := &codepipeline.ListActionTypesInput{} + + for { + resp, err := svc.ListActionTypes(params) + if err != nil { + return nil, err + } + + for _, actionTypes := range resp.ActionTypes { + resources = append(resources, &CodePipelineCustomActionType{ + svc: svc, + owner: actionTypes.Id.Owner, + category: actionTypes.Id.Category, + provider: actionTypes.Id.Provider, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (f *CodePipelineCustomActionType) Filter() error { + if !strings.HasPrefix(*f.owner, "Custom") { + return fmt.Errorf("cannot delete default codepipeline custom action type") + } + return nil +} + +func (f *CodePipelineCustomActionType) Remove() error { + _, err := f.svc.DeleteCustomActionType(&codepipeline.DeleteCustomActionTypeInput{ + Category: f.category, + }) + + return err +} + +func (f *CodePipelineCustomActionType) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Category", f.category) + properties.Set("Owner", f.owner) + properties.Set("Provider", f.provider) + return properties +} + +func (f *CodePipelineCustomActionType) String() string { + return *f.owner +} From 96f7e1435437c65a45f476334808b7a8c67f6d48 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Wed, 1 Nov 2023 18:28:02 -0500 Subject: [PATCH 097/135] Add support for codedeploy deployment groups, adding map for custom action types. --- resources/codedeploy-deployment-configs.go | 1 - resources/codedeploy-deployment-group.go | 69 +++++++++++++++++++ resources/codepipeline-custom-action-types.go | 2 +- 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 resources/codedeploy-deployment-group.go diff --git a/resources/codedeploy-deployment-configs.go b/resources/codedeploy-deployment-configs.go index 5360210e..5682df16 100644 --- a/resources/codedeploy-deployment-configs.go +++ b/resources/codedeploy-deployment-configs.go @@ -55,7 +55,6 @@ func (f *CodeDeployDeploymentConfig) Filter() error { } func (f *CodeDeployDeploymentConfig) Remove() error { - _, err := f.svc.DeleteDeploymentConfig(&codedeploy.DeleteDeploymentConfigInput{ DeploymentConfigName: f.deploymentConfigName, }) diff --git a/resources/codedeploy-deployment-group.go b/resources/codedeploy-deployment-group.go new file mode 100644 index 00000000..67616a4d --- /dev/null +++ b/resources/codedeploy-deployment-group.go @@ -0,0 +1,69 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/codedeploy" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CodeDeployDeploymentGroup struct { + svc *codedeploy.CodeDeploy + deploymentGroupName *string + applicationName *string +} + +func init() { + register("CodeDeployDeploymentGroup", ListCodeDeployDeploymentGroups) +} + +func ListCodeDeployDeploymentGroups(sess *session.Session) ([]Resource, error) { + svc := codedeploy.New(sess) + resources := []Resource{} + + appParams := &codedeploy.ListApplicationsInput{} + appResp, err := svc.ListApplications(appParams) + if err != nil { + return nil, err + } + + for _, appName := range appResp.Applications { + // For each application, list deployment groups + deploymentGroupParams := &codedeploy.ListDeploymentGroupsInput{ + ApplicationName: appName, + } + deploymentGroupResp, err := svc.ListDeploymentGroups(deploymentGroupParams) + if err != nil { + return nil, err + } + + for _, group := range deploymentGroupResp.DeploymentGroups { + resources = append(resources, &CodeDeployDeploymentGroup{ + svc: svc, + deploymentGroupName: group, + applicationName: appName, + }) + } + } + + return resources, nil +} + +func (f *CodeDeployDeploymentGroup) Remove() error { + _, err := f.svc.DeleteDeploymentGroup(&codedeploy.DeleteDeploymentGroupInput{ + ApplicationName: f.applicationName, + DeploymentGroupName: f.deploymentGroupName, + }) + + return err +} + +func (f *CodeDeployDeploymentGroup) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("DeploymentGroupName", f.deploymentGroupName) + properties.Set("ApplicationName", f.applicationName) + return properties +} + +func (f *CodeDeployDeploymentGroup) String() string { + return *f.deploymentGroupName +} diff --git a/resources/codepipeline-custom-action-types.go b/resources/codepipeline-custom-action-types.go index 02acd741..fd9e2370 100644 --- a/resources/codepipeline-custom-action-types.go +++ b/resources/codepipeline-custom-action-types.go @@ -17,7 +17,7 @@ type CodePipelineCustomActionType struct { } func init() { - register("CodePipelineCustomActionType", ListCodePipelineCustomActionTypes) + register("CodePipelineCustomActionType", ListCodePipelineCustomActionTypes, mapCloudControl("AWS::CodePipeline::CustomActionType")) } func ListCodePipelineCustomActionTypes(sess *session.Session) ([]Resource, error) { From ec3fa042dd073f111e4bf1f2a000263c2e4b0534 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Wed, 1 Nov 2023 18:38:55 -0500 Subject: [PATCH 098/135] Update codepipeline-custom-action-types.go Adding needed provider and version. --- resources/codepipeline-custom-action-types.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/codepipeline-custom-action-types.go b/resources/codepipeline-custom-action-types.go index fd9e2370..97a7903b 100644 --- a/resources/codepipeline-custom-action-types.go +++ b/resources/codepipeline-custom-action-types.go @@ -14,6 +14,7 @@ type CodePipelineCustomActionType struct { owner *string category *string provider *string + version *string } func init() { @@ -38,6 +39,7 @@ func ListCodePipelineCustomActionTypes(sess *session.Session) ([]Resource, error owner: actionTypes.Id.Owner, category: actionTypes.Id.Category, provider: actionTypes.Id.Provider, + version: actionTypes.Id.Version, }) } @@ -61,6 +63,8 @@ func (f *CodePipelineCustomActionType) Filter() error { func (f *CodePipelineCustomActionType) Remove() error { _, err := f.svc.DeleteCustomActionType(&codepipeline.DeleteCustomActionTypeInput{ Category: f.category, + Provider: f.provider, + Version: f.version, }) return err @@ -71,6 +75,7 @@ func (f *CodePipelineCustomActionType) Properties() types.Properties { properties.Set("Category", f.category) properties.Set("Owner", f.owner) properties.Set("Provider", f.provider) + properties.Set("Version", f.version) return properties } From f34717f54889646ad598c959c2a41b57983ddadf Mon Sep 17 00:00:00 2001 From: Sherd White Date: Thu, 2 Nov 2023 10:27:25 -0500 Subject: [PATCH 099/135] Adding webhook support. --- ...oup.go => codedeploy-deployment-groups.go} | 0 resources/codepipeline-webhooks.go | 63 +++++++++++++++++++ 2 files changed, 63 insertions(+) rename resources/{codedeploy-deployment-group.go => codedeploy-deployment-groups.go} (100%) create mode 100644 resources/codepipeline-webhooks.go diff --git a/resources/codedeploy-deployment-group.go b/resources/codedeploy-deployment-groups.go similarity index 100% rename from resources/codedeploy-deployment-group.go rename to resources/codedeploy-deployment-groups.go diff --git a/resources/codepipeline-webhooks.go b/resources/codepipeline-webhooks.go new file mode 100644 index 00000000..508894fe --- /dev/null +++ b/resources/codepipeline-webhooks.go @@ -0,0 +1,63 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/codepipeline" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CodePipelineWebhook struct { + svc *codepipeline.CodePipeline + name *string +} + +func init() { + register("CodePipelineWebhook", ListCodePipelineWebhooks) +} + +func ListCodePipelineWebhooks(sess *session.Session) ([]Resource, error) { + svc := codepipeline.New(sess) + resources := []Resource{} + + params := &codepipeline.ListWebhooksInput{} + + for { + resp, err := svc.ListWebhooks(params) + if err != nil { + return nil, err + } + + for _, webHooks := range resp.Webhooks { + resources = append(resources, &CodePipelineWebhook{ + svc: svc, + name: webHooks.Definition.Name, + }) + } + + if resp.NextToken == nil { + break + } + + params.NextToken = resp.NextToken + } + + return resources, nil +} + +func (f *CodePipelineWebhook) Remove() error { + _, err := f.svc.DeleteWebhook(&codepipeline.DeleteWebhookInput{ + Name: f.name, + }) + + return err +} + +func (f *CodePipelineWebhook) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", f.name) + return properties +} + +func (f *CodePipelineWebhook) String() string { + return *f.name +} From 57578500f582be11e85c7d5e593983486b8fcd86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 10:45:49 +0100 Subject: [PATCH 100/135] Bump the golang group with 5 updates (#1141) Bumps the golang group with 5 updates: | Package | From | To | | --- | --- | --- | | [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) | `1.46.2` | `1.47.4` | | [github.com/fatih/color](https://github.com/fatih/color) | `1.15.0` | `1.16.0` | | [github.com/google/uuid](https://github.com/google/uuid) | `1.3.1` | `1.4.0` | | [github.com/spf13/cobra](https://github.com/spf13/cobra) | `1.7.0` | `1.8.0` | | [golang.org/x/sync](https://github.com/golang/sync) | `0.4.0` | `0.5.0` | Updates `github.com/aws/aws-sdk-go` from 1.46.2 to 1.47.4 - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.46.2...v1.47.4) Updates `github.com/fatih/color` from 1.15.0 to 1.16.0 - [Release notes](https://github.com/fatih/color/releases) - [Commits](https://github.com/fatih/color/compare/v1.15.0...v1.16.0) Updates `github.com/google/uuid` from 1.3.1 to 1.4.0 - [Release notes](https://github.com/google/uuid/releases) - [Changelog](https://github.com/google/uuid/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/uuid/compare/v1.3.1...v1.4.0) Updates `github.com/spf13/cobra` from 1.7.0 to 1.8.0 - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.7.0...v1.8.0) Updates `golang.org/x/sync` from 0.4.0 to 0.5.0 - [Commits](https://github.com/golang/sync/compare/v0.4.0...v0.5.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/fatih/color dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/google/uuid dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: golang.org/x/sync dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 53 +++++++++++++++++++---------------------------------- 2 files changed, 26 insertions(+), 41 deletions(-) diff --git a/go.mod b/go.mod index 08806d23..461a2349 100644 --- a/go.mod +++ b/go.mod @@ -3,17 +3,17 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.46.2 - github.com/fatih/color v1.15.0 + github.com/aws/aws-sdk-go v1.47.4 + github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 - github.com/google/uuid v1.3.1 + github.com/google/uuid v1.4.0 github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4 github.com/pkg/errors v0.9.1 github.com/rebuy-de/rebuy-go-sdk/v4 v4.5.1 github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.7.0 + github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.8.4 - golang.org/x/sync v0.4.0 + golang.org/x/sync v0.5.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -24,11 +24,11 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spf13/pflag v1.0.5 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/sys v0.6.0 // indirect + golang.org/x/sys v0.14.0 // indirect golang.org/x/tools v0.7.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) diff --git a/go.sum b/go.sum index 7fcbc34a..b97ac003 100644 --- a/go.sum +++ b/go.sum @@ -1,18 +1,18 @@ -github.com/aws/aws-sdk-go v1.46.2 h1:XZbOmjtN1VCfEtQq7QNFsbxIqO+bB+bRhiOBjp6AzWc= -github.com/aws/aws-sdk-go v1.46.2/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/aws/aws-sdk-go v1.47.4 h1:IyhNbmPt+5ldi5HNzv7ZnXiqSglDMaJiZlzj4Yq3qnk= +github.com/aws/aws-sdk-go v1.47.4/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/gemnasium/logrus-graylog-hook/v3 v3.1.0 h1:SLtCnpI5ZZaz4l7RSatEhppB1BBhUEu+DqGANJzJdEA= github.com/gemnasium/logrus-graylog-hook/v3 v3.1.0/go.mod h1:wi1zWv9tIvyLSMLCAzgRP+YR24oLVQVBHfPPKjtht44= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -29,8 +29,8 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4 h1:NK3O7S5FRD/wj7ORQ5C3Mx1STpyEMuFe+/F0Lakd1Nk= github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4/go.mod h1:FqD3ES5hx6zpzDainDaHgkTIqrPaI9uX4CVWqYZoQjY= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -44,8 +44,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -55,55 +55,40 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 2d96dc7eaa09a6b7e266bd6e923a114a850b99f6 Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Thu, 9 Nov 2023 16:27:50 -0800 Subject: [PATCH 101/135] Modify the backup vault access policies that contain restrictive clauses to prevent their deletion This commit fixes the following error when trying to delete backup vault access policies for vaults (`aws/efs/automatic-backup-vault`) automatically created when EFS backup is enabled. ``` time="2023-10-05T15:37:07Z" level=error msg="AccessDeniedException: User: arn:aws:sts::X:assumed-role/XRole/SAAssumedRoleSession is not authorized to perform: backup:DeleteBackupVaultAccessPolicy on resource: arn:aws:backup:us-east-1:X:backup-vault:aws/efs/automatic-backup-vault with an explicit deny in a resource-based policy ``` The module before attempting to delete the backup vault access policy, sets a permissive policy to ensure the `backup:DeleteBackupVaultAccessPolicy` is allowed. The operation to put a policy to allow `backup:DeleteBackupVaultAccessPolicy` was silently failing due to an error: ``` The specified policy cannot be added to the vault due to cross-account sharing restrictions. Amend the policy or the vault's settings, then retry request ``` This commit updates the policy, to use the default as a template, but excluding delete actions. Signed-off-by: Gabriela S. Soria --- resources/backup-vaults-access-policies.go | 40 ++++++++++++++-------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/resources/backup-vaults-access-policies.go b/resources/backup-vaults-access-policies.go index 553efc66..e826062c 100644 --- a/resources/backup-vaults-access-policies.go +++ b/resources/backup-vaults-access-policies.go @@ -58,7 +58,7 @@ func ListBackupVaultAccessPolicies(sess *session.Session) ([]Resource, error) { } func (b *BackupVaultAccessPolicy) Remove() error { - // Set the policy to a policy that allows deletion before removal. + // Set a policy that allows deletion before removal. // // This is required to delete the policy for the automagically created vaults // such as "aws/efs/automatic-backup-vault" from EFS automatic backups @@ -87,21 +87,31 @@ func (b *BackupVaultAccessPolicy) Remove() error { // ] // } // - // While deletion is Denied, you can update the policy with one that - // doesn't deny and then delete at will. + // Update the default policy to remove the Deny on Delete* actions + // and then delete the policy. + // + // Why not putting a policy that allows `backup:DeleteBackupVaultAccessPolicy` in the first place? + // Because that throws an error: + // ' The specified policy cannot be added to the vault due to cross-account sharing restrictions. + // Amend the policy or the vault's settings, then retry request' + // allowDeletionPolicy := `{ - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": "backup:DeleteBackupVaultAccessPolicy", - "Resource": "*" - } - ] -}` + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Action": [ + "backup:StartCopyJob", + "backup:StartRestoreJob", + "backup:UpdateRecoveryPointLifecycle" + ], + "Resource": "*" + } + ] + }` // Ignore error from if we can't put permissive backup vault policy in for some reason, that's OK. _, _ = b.svc.PutBackupVaultAccessPolicy(&backup.PutBackupVaultAccessPolicyInput{ BackupVaultName: &b.backupVaultName, From b41b6e5cbf2cdc1bb40017e4daa5d62977ab5c58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 10:22:06 +0100 Subject: [PATCH 102/135] Bump the golang group with 1 update (#1149) Bumps the golang group with 1 update: [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go). - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Changelog](https://github.com/aws/aws-sdk-go/blob/main/CHANGELOG_PENDING.md) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.47.4...v1.47.10) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-patch dependency-group: golang ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 461a2349..4e2c3e54 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.47.4 + github.com/aws/aws-sdk-go v1.47.10 github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.4.0 diff --git a/go.sum b/go.sum index b97ac003..e401251f 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.47.4 h1:IyhNbmPt+5ldi5HNzv7ZnXiqSglDMaJiZlzj4Yq3qnk= -github.com/aws/aws-sdk-go v1.47.4/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.47.10 h1:cvufN7WkD1nlOgpRopsmxKQlFp5X1MfyAw4r7BBORQc= +github.com/aws/aws-sdk-go v1.47.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 87236b048e2f0889776fa2ff76002689a6422874 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 14:45:37 +0100 Subject: [PATCH 103/135] Bump the golang group with 3 updates (#1182) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 4e2c3e54..eecc4a2e 100644 --- a/go.mod +++ b/go.mod @@ -3,17 +3,17 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.47.10 + github.com/aws/aws-sdk-go v1.50.1 github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 - github.com/google/uuid v1.4.0 + github.com/google/uuid v1.5.0 github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4 github.com/pkg/errors v0.9.1 github.com/rebuy-de/rebuy-go-sdk/v4 v4.5.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.8.4 - golang.org/x/sync v0.5.0 + golang.org/x/sync v0.6.0 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index e401251f..d2fe8d58 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.47.10 h1:cvufN7WkD1nlOgpRopsmxKQlFp5X1MfyAw4r7BBORQc= -github.com/aws/aws-sdk-go v1.47.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.50.1 h1:AwnLUM7TcH9vMZqA4TcDKmGfLmDW5VXwT5tPH6kXylo= +github.com/aws/aws-sdk-go v1.50.1/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -11,8 +11,8 @@ github.com/gemnasium/logrus-graylog-hook/v3 v3.1.0 h1:SLtCnpI5ZZaz4l7RSatEhppB1B github.com/gemnasium/logrus-graylog-hook/v3 v3.1.0/go.mod h1:wi1zWv9tIvyLSMLCAzgRP+YR24oLVQVBHfPPKjtht44= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -68,8 +68,8 @@ golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 407950ae1701e749704c1d710165f2fc22c60605 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 10:40:42 +0100 Subject: [PATCH 104/135] Bump the golang group with 2 updates (#1183) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index eecc4a2e..a442f385 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.50.1 + github.com/aws/aws-sdk-go v1.50.6 github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 - github.com/google/uuid v1.5.0 + github.com/google/uuid v1.6.0 github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4 github.com/pkg/errors v0.9.1 github.com/rebuy-de/rebuy-go-sdk/v4 v4.5.1 diff --git a/go.sum b/go.sum index d2fe8d58..3eb5fc38 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.50.1 h1:AwnLUM7TcH9vMZqA4TcDKmGfLmDW5VXwT5tPH6kXylo= -github.com/aws/aws-sdk-go v1.50.1/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.50.6 h1:FaXvNwHG3Ri1paUEW16Ahk9zLVqSAdqa1M3phjZR35Q= +github.com/aws/aws-sdk-go v1.50.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -11,8 +11,8 @@ github.com/gemnasium/logrus-graylog-hook/v3 v3.1.0 h1:SLtCnpI5ZZaz4l7RSatEhppB1B github.com/gemnasium/logrus-graylog-hook/v3 v3.1.0/go.mod h1:wi1zWv9tIvyLSMLCAzgRP+YR24oLVQVBHfPPKjtht44= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= From ce034f894047a49a7bb34344d46d10069c078121 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Feb 2024 17:52:03 +0100 Subject: [PATCH 105/135] Bump the golang group with 1 update (#1188) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a442f385..5fdac484 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.50.6 + github.com/aws/aws-sdk-go v1.50.16 github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 3eb5fc38..54b68535 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.50.6 h1:FaXvNwHG3Ri1paUEW16Ahk9zLVqSAdqa1M3phjZR35Q= -github.com/aws/aws-sdk-go v1.50.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.50.16 h1:/KuHK+Sadp9BKXWWtMhPtBdj+PLIFCnQZxQnsuLhxKc= +github.com/aws/aws-sdk-go v1.50.16/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 93792d48ac79156f0dd045cc99e7924ffa409356 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:51:34 +0100 Subject: [PATCH 106/135] Bump the golang group with 1 update (#1191) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5fdac484..cc2573d8 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.50.16 + github.com/aws/aws-sdk-go v1.50.21 github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 54b68535..230367b7 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.50.16 h1:/KuHK+Sadp9BKXWWtMhPtBdj+PLIFCnQZxQnsuLhxKc= -github.com/aws/aws-sdk-go v1.50.16/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.50.21 h1:W8awpwiInOt4qHQE6JghRYQJhHcf/cDJS3mlZYqioSQ= +github.com/aws/aws-sdk-go v1.50.21/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From d6b1374e3ca7fe0b8dc6d9e8adf6fb5406101df7 Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Tue, 20 Feb 2024 18:14:23 +0100 Subject: [PATCH 107/135] Add release note config (#1192) --- .github/release.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/release.yml diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 00000000..4d213e6f --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,13 @@ +# https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes#configuring-automatically-generated-release-notes + +changelog: + categories: + - title: Notable changes + labels: + - '*' + exclude: + labels: + - dependencies + - title: Dependency updates + labels: + - dependencies From 566bb868bbf3033ac0d8cd49f09a9434ea70829e Mon Sep 17 00:00:00 2001 From: Maarten Dirkse Date: Fri, 23 Feb 2024 15:34:59 +0100 Subject: [PATCH 108/135] Add support for Redshift Serverless namespaces, snapshots and workgroups. (#1194) --- resources/redshiftserverless-namespaces.go | 68 +++++++++++++++++++++ resources/redshiftserverless-snapshots.go | 69 ++++++++++++++++++++++ resources/redshiftserverless-workgroups.go | 69 ++++++++++++++++++++++ 3 files changed, 206 insertions(+) create mode 100644 resources/redshiftserverless-namespaces.go create mode 100644 resources/redshiftserverless-snapshots.go create mode 100644 resources/redshiftserverless-workgroups.go diff --git a/resources/redshiftserverless-namespaces.go b/resources/redshiftserverless-namespaces.go new file mode 100644 index 00000000..adfaae07 --- /dev/null +++ b/resources/redshiftserverless-namespaces.go @@ -0,0 +1,68 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/redshiftserverless" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type RedshiftServerlessNamespace struct { + svc *redshiftserverless.RedshiftServerless + namespace *redshiftserverless.Namespace +} + +func init() { + register("RedshiftServerlessNamespace", ListRedshiftServerlessNamespaces) +} + +func ListRedshiftServerlessNamespaces(sess *session.Session) ([]Resource, error) { + svc := redshiftserverless.New(sess) + resources := []Resource{} + + params := &redshiftserverless.ListNamespacesInput{ + MaxResults: aws.Int64(100), + } + + for { + output, err := svc.ListNamespaces(params) + if err != nil { + return nil, err + } + + for _, namespace := range output.Namespaces { + resources = append(resources, &RedshiftServerlessNamespace{ + svc: svc, + namespace: namespace, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (n *RedshiftServerlessNamespace) Properties() types.Properties { + properties := types.NewProperties(). + Set("CreationDate", n.namespace.CreationDate). + Set("NamespaceName", n.namespace.NamespaceName) + + return properties +} + +func (n *RedshiftServerlessNamespace) Remove() error { + _, err := n.svc.DeleteNamespace(&redshiftserverless.DeleteNamespaceInput{ + NamespaceName: n.namespace.NamespaceName, + }) + + return err +} + +func (n *RedshiftServerlessNamespace) String() string { + return *n.namespace.NamespaceName +} diff --git a/resources/redshiftserverless-snapshots.go b/resources/redshiftserverless-snapshots.go new file mode 100644 index 00000000..9f56c8e6 --- /dev/null +++ b/resources/redshiftserverless-snapshots.go @@ -0,0 +1,69 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/redshiftserverless" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type RedshiftServerlessSnapshot struct { + svc *redshiftserverless.RedshiftServerless + snapshot *redshiftserverless.Snapshot +} + +func init() { + register("RedshiftServerlessSnapshot", ListRedshiftServerlessSnapshots) +} + +func ListRedshiftServerlessSnapshots(sess *session.Session) ([]Resource, error) { + svc := redshiftserverless.New(sess) + resources := []Resource{} + + params := &redshiftserverless.ListSnapshotsInput{ + MaxResults: aws.Int64(100), + } + + for { + output, err := svc.ListSnapshots(params) + if err != nil { + return nil, err + } + + for _, snapshot := range output.Snapshots { + resources = append(resources, &RedshiftServerlessSnapshot{ + svc: svc, + snapshot: snapshot, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (s *RedshiftServerlessSnapshot) Properties() types.Properties { + properties := types.NewProperties(). + Set("CreateTime", s.snapshot.SnapshotCreateTime). + Set("Namespace", s.snapshot.NamespaceName). + Set("SnapshotName", s.snapshot.SnapshotName) + + return properties +} + +func (s *RedshiftServerlessSnapshot) Remove() error { + _, err := s.svc.DeleteSnapshot(&redshiftserverless.DeleteSnapshotInput{ + SnapshotName: s.snapshot.SnapshotName, + }) + + return err +} + +func (s *RedshiftServerlessSnapshot) String() string { + return *s.snapshot.SnapshotName +} diff --git a/resources/redshiftserverless-workgroups.go b/resources/redshiftserverless-workgroups.go new file mode 100644 index 00000000..a88c8d16 --- /dev/null +++ b/resources/redshiftserverless-workgroups.go @@ -0,0 +1,69 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/redshiftserverless" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type RedshiftServerlessWorkgroup struct { + svc *redshiftserverless.RedshiftServerless + workgroup *redshiftserverless.Workgroup +} + +func init() { + register("RedshiftServerlessWorkgroup", ListRedshiftServerlessWorkgroups) +} + +func ListRedshiftServerlessWorkgroups(sess *session.Session) ([]Resource, error) { + svc := redshiftserverless.New(sess) + resources := []Resource{} + + params := &redshiftserverless.ListWorkgroupsInput{ + MaxResults: aws.Int64(100), + } + + for { + output, err := svc.ListWorkgroups(params) + if err != nil { + return nil, err + } + + for _, workgroup := range output.Workgroups { + resources = append(resources, &RedshiftServerlessWorkgroup{ + svc: svc, + workgroup: workgroup, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (w *RedshiftServerlessWorkgroup) Properties() types.Properties { + properties := types.NewProperties(). + Set("CreationDate", w.workgroup.CreationDate). + Set("Namespace", w.workgroup.NamespaceName). + Set("WorkgroupName", w.workgroup.WorkgroupName) + + return properties +} + +func (w *RedshiftServerlessWorkgroup) Remove() error { + _, err := w.svc.DeleteWorkgroup(&redshiftserverless.DeleteWorkgroupInput{ + WorkgroupName: w.workgroup.WorkgroupName, + }) + + return err +} + +func (w *RedshiftServerlessWorkgroup) String() string { + return *w.workgroup.WorkgroupName +} From 918119896b862879ea0263da9967ca8117858494 Mon Sep 17 00:00:00 2001 From: Oliver Fletcher Date: Mon, 26 Feb 2024 21:15:32 +1100 Subject: [PATCH 109/135] feat: Adding Cloudfront response headers policies (#1140) --- .../cloudfront-response-headers-policies.go | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 resources/cloudfront-response-headers-policies.go diff --git a/resources/cloudfront-response-headers-policies.go b/resources/cloudfront-response-headers-policies.go new file mode 100644 index 00000000..e075b5d6 --- /dev/null +++ b/resources/cloudfront-response-headers-policies.go @@ -0,0 +1,83 @@ +package resources + +import ( + "fmt" + "strings" + + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/cloudfront" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CloudFrontResponseHeadersPolicy struct { + svc *cloudfront.CloudFront + ID *string + name *string +} + +func init() { + register("CloudFrontResponseHeadersPolicy", ListCloudFrontResponseHeadersPolicies) +} + +func ListCloudFrontResponseHeadersPolicies(sess *session.Session) ([]Resource, error) { + svc := cloudfront.New(sess) + resources := []Resource{} + params := &cloudfront.ListResponseHeadersPoliciesInput{} + + for { + resp, err := svc.ListResponseHeadersPolicies(params) + if err != nil { + return nil, err + } + + for _, item := range resp.ResponseHeadersPolicyList.Items { + resources = append(resources, &CloudFrontResponseHeadersPolicy{ + svc: svc, + ID: item.ResponseHeadersPolicy.Id, + name: item.ResponseHeadersPolicy.ResponseHeadersPolicyConfig.Name, + }) + } + + if resp.ResponseHeadersPolicyList.NextMarker == nil { + break + } + + params.Marker = resp.ResponseHeadersPolicyList.NextMarker + } + + return resources, nil +} + +func (f *CloudFrontResponseHeadersPolicy) Filter() error { + if strings.HasPrefix(*f.name, "Managed-") { + return fmt.Errorf("Cannot delete default CloudFront Response headers policy") + } + return nil +} + +func (f *CloudFrontResponseHeadersPolicy) Remove() error { + resp, err := f.svc.GetResponseHeadersPolicy(&cloudfront.GetResponseHeadersPolicyInput{ + Id: f.ID, + }) + if err != nil { + return err + } + + _, err = f.svc.DeleteResponseHeadersPolicy(&cloudfront.DeleteResponseHeadersPolicyInput{ + Id: f.ID, + IfMatch: resp.ETag, + }) + + return err +} + +func (f *CloudFrontResponseHeadersPolicy) String() string { + return *f.name +} + +func (f *CloudFrontResponseHeadersPolicy) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("ID", f.ID) + properties.Set("Name", f.name) + return properties +} From defb30fd90e0407d4c17f908254716385f63de3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 12:03:50 +0100 Subject: [PATCH 110/135] Bump the golang group with 1 update (#1195) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cc2573d8..f54047f8 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.50.21 + github.com/aws/aws-sdk-go v1.50.26 github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 230367b7..3fffac4f 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.50.21 h1:W8awpwiInOt4qHQE6JghRYQJhHcf/cDJS3mlZYqioSQ= -github.com/aws/aws-sdk-go v1.50.21/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.50.26 h1:tuv8+dje59DBK1Pj65tSCdD36oamBxKYJgbng4bFylc= +github.com/aws/aws-sdk-go v1.50.26/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From c3ae17932f058f1867aab382182ecd837090961a Mon Sep 17 00:00:00 2001 From: Vincent Boulineau <58430298+vboulineau@users.noreply.github.com> Date: Thu, 29 Feb 2024 09:57:40 +0100 Subject: [PATCH 111/135] Add ELB Listener Rules object (#1193) Co-authored-by: Philipp Trulson --- resources/elbv2-listenerrule.go | 141 ++++++++++++++++++++++++++++++++ resources/util.go | 18 ++++ 2 files changed, 159 insertions(+) create mode 100644 resources/elbv2-listenerrule.go diff --git a/resources/elbv2-listenerrule.go b/resources/elbv2-listenerrule.go new file mode 100644 index 00000000..a4fe640e --- /dev/null +++ b/resources/elbv2-listenerrule.go @@ -0,0 +1,141 @@ +package resources + +import ( + "fmt" + + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/elbv2" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" + "github.com/sirupsen/logrus" +) + +var elbv2ListenerRulePageSize int64 = 400 // AWS has a limit of 100 rules per listener + +type ELBv2ListenerRule struct { + svc *elbv2.ELBV2 + ruleArn *string + lbName *string + listenerArn *string + tags []*elbv2.Tag +} + +func init() { + register("ELBv2ListenerRule", ListELBv2ListenerRules) +} + +func ListELBv2ListenerRules(sess *session.Session) ([]Resource, error) { + svc := elbv2.New(sess) + + // We need to retrieve ELBs then Listeners then Rules + lbs := make([]*elbv2.LoadBalancer, 0) + err := svc.DescribeLoadBalancersPages( + nil, + func(page *elbv2.DescribeLoadBalancersOutput, lastPage bool) bool { + for _, elbv2 := range page.LoadBalancers { + lbs = append(lbs, elbv2) + } + return !lastPage + }, + ) + if err != nil { + return nil, err + } + + // Required for batched tag retrieval later + ruleArns := make([]*string, 0) + ruleArnToResource := make(map[string]*ELBv2ListenerRule) + + resources := make([]Resource, 0) + for _, lb := range lbs { + err := svc.DescribeListenersPages( + &elbv2.DescribeListenersInput{ + LoadBalancerArn: lb.LoadBalancerArn, + }, + func(page *elbv2.DescribeListenersOutput, lastPage bool) bool { + for _, listener := range page.Listeners { + rules, err := svc.DescribeRules(&elbv2.DescribeRulesInput{ + ListenerArn: listener.ListenerArn, + PageSize: &elbv2ListenerRulePageSize, + }) + if err == nil { + for _, rule := range rules.Rules { + // Skip default rules as they cannot be deleted + if rule.IsDefault != nil && *rule.IsDefault { + continue + } + + listenerRule := &ELBv2ListenerRule{ + svc: svc, + ruleArn: rule.RuleArn, + lbName: lb.LoadBalancerName, + listenerArn: listener.ListenerArn, + } + + ruleArns = append(ruleArns, rule.RuleArn) + resources = append(resources, listenerRule) + ruleArnToResource[*rule.RuleArn] = listenerRule + } + } else { + logrus. + WithError(err). + WithField("listenerArn", listener.ListenerArn). + Error("Failed to list listener rules for listener") + } + } + + return !lastPage + }, + ) + if err != nil { + logrus. + WithError(err). + WithField("loadBalancerArn", lb.LoadBalancerArn). + Error("Failed to list listeners for load balancer") + } + } + + // Tags for Rules need to be fetched separately + // We can only specify up to 20 in a single call + // See: https://github.com/aws/aws-sdk-go/blob/0e8c61841163762f870f6976775800ded4a789b0/service/elbv2/api.go#L5398 + for _, ruleChunk := range Chunk(ruleArns, 20) { + tagResp, err := svc.DescribeTags(&elbv2.DescribeTagsInput{ + ResourceArns: ruleChunk, + }) + if err != nil { + return nil, err + } + for _, elbv2TagInfo := range tagResp.TagDescriptions { + rule := ruleArnToResource[*elbv2TagInfo.ResourceArn] + rule.tags = elbv2TagInfo.Tags + } + } + + return resources, nil +} + +func (e *ELBv2ListenerRule) Remove() error { + _, err := e.svc.DeleteRule(&elbv2.DeleteRuleInput{ + RuleArn: e.ruleArn, + }) + if err != nil { + return err + } + + return nil +} + +func (e *ELBv2ListenerRule) Properties() types.Properties { + properties := types.NewProperties(). + Set("ARN", e.ruleArn). + Set("ListenerARN", e.listenerArn). + Set("LoadBalancerName", e.lbName) + + for _, tagValue := range e.tags { + properties.SetTag(tagValue.Key, tagValue.Value) + } + return properties +} + +func (e *ELBv2ListenerRule) String() string { + return fmt.Sprintf("%s -> %s", *e.lbName, *e.ruleArn) +} diff --git a/resources/util.go b/resources/util.go index 22a3e1b2..b61b8396 100644 --- a/resources/util.go +++ b/resources/util.go @@ -36,3 +36,21 @@ func IsAWSError(err error, code string) bool { return aerr.Code() == code } + +func Chunk[T any](slice []T, size int) [][]T { + var chunks [][]T + for i := 0; i < len(slice); { + // Clamp the last chunk to the slice bound as necessary. + end := size + if l := len(slice[i:]); l < size { + end = l + } + + // Set the capacity of each chunk so that appending to a chunk does not + // modify the original slice. + chunks = append(chunks, slice[i:i+end:i+end]) + i += end + } + + return chunks +} From aada788dfeba7975157ebc57302401f08537ff98 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Fri, 15 Mar 2024 13:02:17 -0500 Subject: [PATCH 112/135] Adding support for Glue blueprints, ml transforms, sessions, and workflows. --- resources/glue-blueprints.go | 67 +++++++++++++++++++++++++++++++++ resources/glue-ml-transforms.go | 67 +++++++++++++++++++++++++++++++++ resources/glue-sessions.go | 67 +++++++++++++++++++++++++++++++++ resources/glue-workflows.go | 67 +++++++++++++++++++++++++++++++++ 4 files changed, 268 insertions(+) create mode 100644 resources/glue-blueprints.go create mode 100644 resources/glue-ml-transforms.go create mode 100644 resources/glue-sessions.go create mode 100644 resources/glue-workflows.go diff --git a/resources/glue-blueprints.go b/resources/glue-blueprints.go new file mode 100644 index 00000000..b40ab8df --- /dev/null +++ b/resources/glue-blueprints.go @@ -0,0 +1,67 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/glue" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type GlueBlueprint struct { + svc *glue.Glue + name *string +} + +func init() { + register("GlueBlueprint", ListGlueBlueprints) +} + +func ListGlueBlueprints(sess *session.Session) ([]Resource, error) { + svc := glue.New(sess) + resources := []Resource{} + + params := &glue.ListBlueprintsInput{ + MaxResults: aws.Int64(25), + } + + for { + output, err := svc.ListBlueprints(params) + if err != nil { + return nil, err + } + + for _, blueprint := range output.Blueprints { + resources = append(resources, &GlueBlueprint{ + svc: svc, + name: blueprint, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (f *GlueBlueprint) Remove() error { + _, err := f.svc.DeleteBlueprint(&glue.DeleteBlueprintInput{ + Name: f.name, + }) + + return err +} + +func (f *GlueBlueprint) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", f.name) + + return properties +} + +func (f *GlueBlueprint) String() string { + return *f.name +} diff --git a/resources/glue-ml-transforms.go b/resources/glue-ml-transforms.go new file mode 100644 index 00000000..67fdee30 --- /dev/null +++ b/resources/glue-ml-transforms.go @@ -0,0 +1,67 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/glue" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type GlueMLTransform struct { + svc *glue.Glue + id *string +} + +func init() { + register("GlueMLTransform", ListGlueMLTransforms) +} + +func ListGlueMLTransforms(sess *session.Session) ([]Resource, error) { + svc := glue.New(sess) + resources := []Resource{} + + params := &glue.ListMLTransformsInput{ + MaxResults: aws.Int64(100), + } + + for { + output, err := svc.ListMLTransforms(params) + if err != nil { + return nil, err + } + + for _, transformId := range output.TransformIds { + resources = append(resources, &GlueMLTransform{ + svc: svc, + id: transformId, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (f *GlueMLTransform) Remove() error { + _, err := f.svc.DeleteMLTransform(&glue.DeleteMLTransformInput{ + TransformId: f.id, + }) + + return err +} + +func (f *GlueMLTransform) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Id", f.id) + + return properties +} + +func (f *GlueMLTransform) String() string { + return *f.id +} diff --git a/resources/glue-sessions.go b/resources/glue-sessions.go new file mode 100644 index 00000000..6dd719ad --- /dev/null +++ b/resources/glue-sessions.go @@ -0,0 +1,67 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/glue" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type GlueSession struct { + svc *glue.Glue + id *string +} + +func init() { + register("GlueSession", ListGlueSessions) +} + +func ListGlueSessions(sess *session.Session) ([]Resource, error) { + svc := glue.New(sess) + resources := []Resource{} + + params := &glue.ListSessionsInput{ + MaxResults: aws.Int64(25), + } + + for { + output, err := svc.ListSessions(params) + if err != nil { + return nil, err + } + + for _, session := range output.Sessions { + resources = append(resources, &GlueSession{ + svc: svc, + id: session.Id, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (f *GlueSession) Remove() error { + _, err := f.svc.DeleteSession(&glue.DeleteSessionInput{ + Id: f.id, + }) + + return err +} + +func (f *GlueSession) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Id", f.id) + + return properties +} + +func (f *GlueSession) String() string { + return *f.id +} diff --git a/resources/glue-workflows.go b/resources/glue-workflows.go new file mode 100644 index 00000000..b7b5a7ab --- /dev/null +++ b/resources/glue-workflows.go @@ -0,0 +1,67 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/glue" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type GlueWorkflow struct { + svc *glue.Glue + name *string +} + +func init() { + register("GlueWorkflow", ListGlueWorkflows) +} + +func ListGlueWorkflows(sess *session.Session) ([]Resource, error) { + svc := glue.New(sess) + resources := []Resource{} + + params := &glue.ListWorkflowsInput{ + MaxResults: aws.Int64(25), + } + + for { + output, err := svc.ListWorkflows(params) + if err != nil { + return nil, err + } + + for _, workflowName := range output.Workflows { + resources = append(resources, &GlueWorkflow{ + svc: svc, + name: workflowName, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (f *GlueWorkflow) Remove() error { + _, err := f.svc.DeleteWorkflow(&glue.DeleteWorkflowInput{ + Name: f.name, + }) + + return err +} + +func (f *GlueWorkflow) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", f.name) + + return properties +} + +func (f *GlueWorkflow) String() string { + return *f.name +} From 3feba8eefdddd82234b65efa429173581c22bfb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:12:42 +0100 Subject: [PATCH 113/135] Bump the golang group with 2 updates (#1201) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index f54047f8..11742492 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.50.26 + github.com/aws/aws-sdk-go v1.51.2 github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 @@ -12,7 +12,7 @@ require ( github.com/rebuy-de/rebuy-go-sdk/v4 v4.5.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 golang.org/x/sync v0.6.0 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index 3fffac4f..f7fc2e08 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.50.26 h1:tuv8+dje59DBK1Pj65tSCdD36oamBxKYJgbng4bFylc= -github.com/aws/aws-sdk-go v1.50.26/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.51.2 h1:Ruwgz5aqIXin5Yfcgc+PCzoqW5tEGb9aDL/JWDsre7k= +github.com/aws/aws-sdk-go v1.51.2/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -52,8 +52,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= From fd49a6db711ca45bb14d1d8b26429b63c279236f Mon Sep 17 00:00:00 2001 From: Sherd White Date: Tue, 26 Mar 2024 16:29:53 -0500 Subject: [PATCH 114/135] CL-858 Adding Athena support for data catalogs and prepared statements --- resources/athena-data-catalogs.go | 77 ++++++++++++++++++++++++ resources/athena-prepared-statements.go | 80 +++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 resources/athena-data-catalogs.go create mode 100644 resources/athena-prepared-statements.go diff --git a/resources/athena-data-catalogs.go b/resources/athena-data-catalogs.go new file mode 100644 index 00000000..c59e833e --- /dev/null +++ b/resources/athena-data-catalogs.go @@ -0,0 +1,77 @@ +package resources + +import ( + "fmt" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/athena" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type AthenaDataCatalog struct { + svc *athena.Athena + name *string +} + +func init() { + register("AthenaDataCatalog", ListAthenaDataCatalogs) +} + +func ListAthenaDataCatalogs(sess *session.Session) ([]Resource, error) { + svc := athena.New(sess) + resources := []Resource{} + + params := &athena.ListDataCatalogsInput{ + MaxResults: aws.Int64(50), + } + + for { + output, err := svc.ListDataCatalogs(params) + if err != nil { + return nil, err + } + + for _, catalog := range output.DataCatalogsSummary { + resources = append(resources, &AthenaDataCatalog{ + svc: svc, + name: catalog.CatalogName, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (f *AthenaDataCatalog) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", f.name) + + return properties +} + +func (f *AthenaDataCatalog) Remove() error { + + _, err := f.svc.DeleteDataCatalog(&athena.DeleteDataCatalogInput{ + Name: f.name, + }) + + return err +} + +func (f *AthenaDataCatalog) Filter() error { + if *f.name == "AwsDataCatalog" { + return fmt.Errorf("cannot delete default data source") + } + return nil +} + +func (f *AthenaDataCatalog) String() string { + return *f.name +} diff --git a/resources/athena-prepared-statements.go b/resources/athena-prepared-statements.go new file mode 100644 index 00000000..0f0593d7 --- /dev/null +++ b/resources/athena-prepared-statements.go @@ -0,0 +1,80 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/athena" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type AthenaPreparedStatement struct { + svc *athena.Athena + workGroup *string + name *string +} + +func init() { + register("AthenaPreparedStatement", ListAthenaPreparedStatements) +} + +func ListAthenaPreparedStatements(sess *session.Session) ([]Resource, error) { + svc := athena.New(sess) + resources := []Resource{} + + workgroups, err := svc.ListWorkGroups(&athena.ListWorkGroupsInput{}) + if err != nil { + return nil, err + } + + for _, workgroup := range workgroups.WorkGroups { + params := &athena.ListPreparedStatementsInput{ + WorkGroup: workgroup.Name, + MaxResults: aws.Int64(50), + } + + for { + output, err := svc.ListPreparedStatements(params) + if err != nil { + return nil, err + } + + for _, statement := range output.PreparedStatements { + resources = append(resources, &AthenaPreparedStatement{ + svc: svc, + workGroup: workgroup.Name, + name: statement.StatementName, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + } + + return resources, nil +} + +func (f *AthenaPreparedStatement) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("StatementName", f.name) + properties.Set("WorkGroup", f.workGroup) + + return properties +} + +func (f *AthenaPreparedStatement) Remove() error { + + _, err := f.svc.DeletePreparedStatement(&athena.DeletePreparedStatementInput{ + StatementName: f.name, + WorkGroup: f.workGroup, + }) + + return err +} + +func (f *AthenaPreparedStatement) String() string { + return *f.name +} From dabb9ac4eb34d1f6eeb013f3e96c870a00ba369e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:59:46 +0200 Subject: [PATCH 115/135] Bump the golang group with 1 update (#1205) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 11742492..59dba23d 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.51.2 + github.com/aws/aws-sdk-go v1.51.12 github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index f7fc2e08..608f44a9 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.51.2 h1:Ruwgz5aqIXin5Yfcgc+PCzoqW5tEGb9aDL/JWDsre7k= -github.com/aws/aws-sdk-go v1.51.2/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.51.12 h1:DvuhIHZXwnjaR1/Gu19gUe1EGPw4J0qSJw4Qs/5PA8g= +github.com/aws/aws-sdk-go v1.51.12/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From ec40ba79aec03d88ec5ef177839cf866633cfb93 Mon Sep 17 00:00:00 2001 From: Philipp Trulson Date: Fri, 5 Apr 2024 11:43:35 +0200 Subject: [PATCH 116/135] Add manual trigger to workflow (#1208) --- .github/workflows/ci.yaml | 15 ++++++++------- .github/workflows/release.yaml | 16 ++++++++-------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 078944ac..a62b68ca 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -7,6 +7,7 @@ on: types: [opened, reopened, synchronize] schedule: - cron: '15 3 * * 0' + workflow_dispatch: jobs: build: @@ -14,9 +15,9 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' - name: Setup tools run: | go install golang.org/x/lint/golint@latest @@ -61,30 +62,30 @@ jobs: - name: Set up QEMU if: github.event_name != 'pull_request' id: qemu - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 with: platforms: arm64 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 with: install: true - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to Quay.io - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} - name: Build and push - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v5 with: context: . push: true diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 04a79068..d48a0f4e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -22,7 +22,7 @@ jobs: sed -r -i "s/aws-nuke:v[0-9]+\.[0-9]+\.[0-9]+/aws-nuke:${{ github.ref_name }}/" README.md sed -r -i "s/aws-nuke-v[0-9]+\.[0-9]+\.[0-9]+/aws-nuke-${{ github.ref_name }}/" README.md sed -r -i "s/\/v[0-9]+\.[0-9]+\.[0-9]+\//\/${{ github.ref_name }}\//" README.md - - uses: peter-evans/create-pull-request@v5 + - uses: peter-evans/create-pull-request@v6 name: Create Pull Request with: title: Update readme for ${{ github.ref_name }} release @@ -36,9 +36,9 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' - name: Checkout code uses: actions/checkout@v4 with: @@ -73,30 +73,30 @@ jobs: - name: Set up QEMU id: qemu - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 with: platforms: arm64 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 with: install: true - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to Quay.io - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} - name: Build and push - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v5 with: context: . push: true From 244c173ae0bd951bd37d949049065994c8e62420 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Wed, 24 Apr 2024 16:33:32 -0500 Subject: [PATCH 117/135] CL-508 Adding support for CloudWatch Insight Rules --- resources/cloudwatch-insight-rules.go | 66 +++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 resources/cloudwatch-insight-rules.go diff --git a/resources/cloudwatch-insight-rules.go b/resources/cloudwatch-insight-rules.go new file mode 100644 index 00000000..3b1519b9 --- /dev/null +++ b/resources/cloudwatch-insight-rules.go @@ -0,0 +1,66 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/cloudwatch" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CloudWatchInsightRule struct { + svc *cloudwatch.CloudWatch + name *string +} + +func init() { + register("CloudWatchInsightRule", ListCloudWatchInsightRules) +} + +func ListCloudWatchInsightRules(sess *session.Session) ([]Resource, error) { + svc := cloudwatch.New(sess) + resources := []Resource{} + + params := &cloudwatch.DescribeInsightRulesInput{ + MaxResults: aws.Int64(25), + } + + for { + output, err := svc.DescribeInsightRules(params) + if err != nil { + return nil, err + } + + for _, rules := range output.InsightRules { + resources = append(resources, &CloudWatchInsightRule{ + svc: svc, + name: rules.Name, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (f *CloudWatchInsightRule) Remove() error { + _, err := f.svc.DeleteInsightRules(&cloudwatch.DeleteInsightRulesInput{ + RuleNames: []*string{f.name}, + }) + + return err +} + +func (f *CloudWatchInsightRule) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", f.name) + return properties +} + +func (f *CloudWatchInsightRule) String() string { + return *f.name +} From 8dd7d66307e6cfa472e0786ae6a02da2316866b1 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Fri, 26 Apr 2024 14:03:00 -0500 Subject: [PATCH 118/135] Adding anomaly detection support. --- resources/cloudwatch-anomaly-detectors.go | 66 +++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 resources/cloudwatch-anomaly-detectors.go diff --git a/resources/cloudwatch-anomaly-detectors.go b/resources/cloudwatch-anomaly-detectors.go new file mode 100644 index 00000000..d39543df --- /dev/null +++ b/resources/cloudwatch-anomaly-detectors.go @@ -0,0 +1,66 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/cloudwatch" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type CloudWatchAnomalyDetector struct { + svc *cloudwatch.CloudWatch + detector *cloudwatch.AnomalyDetector +} + +func init() { + register("CloudWatchAnomalyDetector", ListCloudWatchAnomalyDetectors) +} + +func ListCloudWatchAnomalyDetectors(sess *session.Session) ([]Resource, error) { + svc := cloudwatch.New(sess) + resources := []Resource{} + + params := &cloudwatch.DescribeAnomalyDetectorsInput{ + MaxResults: aws.Int64(25), + } + + for { + output, err := svc.DescribeAnomalyDetectors(params) + if err != nil { + return nil, err + } + + for _, detector := range output.AnomalyDetectors { + resources = append(resources, &CloudWatchAnomalyDetector{ + svc: svc, + detector: detector, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (f *CloudWatchAnomalyDetector) Remove() error { + _, err := f.svc.DeleteAnomalyDetector(&cloudwatch.DeleteAnomalyDetectorInput{ + SingleMetricAnomalyDetector: f.detector.SingleMetricAnomalyDetector, + }) + + return err +} + +func (f *CloudWatchAnomalyDetector) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("MetricName", f.detector.SingleMetricAnomalyDetector.MetricName) + return properties +} + +func (f *CloudWatchAnomalyDetector) String() string { + return *f.detector.SingleMetricAnomalyDetector.MetricName +} From 83454e48100c10ccb72085424f4015c2363bd99a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:32:57 +0200 Subject: [PATCH 119/135] Bump the golang group across 1 directory with 2 updates (#1217) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 59dba23d..b77e81f1 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.51.12 + github.com/aws/aws-sdk-go v1.51.31 github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 @@ -13,7 +13,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.9.0 - golang.org/x/sync v0.6.0 + golang.org/x/sync v0.7.0 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index 608f44a9..458b818f 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.51.12 h1:DvuhIHZXwnjaR1/Gu19gUe1EGPw4J0qSJw4Qs/5PA8g= -github.com/aws/aws-sdk-go v1.51.12/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.51.31 h1:4TM+sNc+Dzs7wY1sJ0+J8i60c6rkgnKP1pvPx8ghsSY= +github.com/aws/aws-sdk-go v1.51.31/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -68,8 +68,8 @@ golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From decba486cbeda8a476cfb54dca1bb00332739ba0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 10:13:33 +0200 Subject: [PATCH 120/135] Bump github.com/aws/aws-sdk-go from 1.51.31 to 1.52.3 in the golang group (#1220) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b77e81f1..4a610aaa 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.51.31 + github.com/aws/aws-sdk-go v1.52.3 github.com/fatih/color v1.16.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 458b818f..ddb5e855 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.51.31 h1:4TM+sNc+Dzs7wY1sJ0+J8i60c6rkgnKP1pvPx8ghsSY= -github.com/aws/aws-sdk-go v1.51.31/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.52.3 h1:BNPJmHOXNoM/iBWJKrvaQvJOweRcp3KLpzdb65CfQwU= +github.com/aws/aws-sdk-go v1.52.3/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 97c004496e31f26987c6bf35f397cf5d430efff7 Mon Sep 17 00:00:00 2001 From: Sherd White Date: Wed, 8 May 2024 20:28:54 -0500 Subject: [PATCH 121/135] CL-880 Elastic Transcoder Preset support. --- resources/elastictranscoder-preset.go | 74 +++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 resources/elastictranscoder-preset.go diff --git a/resources/elastictranscoder-preset.go b/resources/elastictranscoder-preset.go new file mode 100644 index 00000000..da9356c6 --- /dev/null +++ b/resources/elastictranscoder-preset.go @@ -0,0 +1,74 @@ +package resources + +import ( + "fmt" + "strings" + + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/elastictranscoder" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type ElasticTranscoderPreset struct { + svc *elastictranscoder.ElasticTranscoder + presetID *string +} + +func init() { + register("ElasticTranscoderPreset", ListElasticTranscoderPresets) +} + +func ListElasticTranscoderPresets(sess *session.Session) ([]Resource, error) { + svc := elastictranscoder.New(sess) + resources := []Resource{} + + params := &elastictranscoder.ListPresetsInput{} + + for { + resp, err := svc.ListPresets(params) + if err != nil { + return nil, err + } + + for _, preset := range resp.Presets { + resources = append(resources, &ElasticTranscoderPreset{ + svc: svc, + presetID: preset.Id, + }) + } + + if resp.NextPageToken == nil { + break + } + + params.PageToken = resp.NextPageToken + } + + return resources, nil +} + +func (f *ElasticTranscoderPreset) Filter() error { + if strings.HasPrefix(*f.presetID, "1351620000001") { + return fmt.Errorf("cannot delete elastic transcoder system presets") + } + return nil +} + +func (f *ElasticTranscoderPreset) Remove() error { + + _, err := f.svc.DeletePreset(&elastictranscoder.DeletePresetInput{ + Id: f.presetID, + }) + + return err +} + +func (f *ElasticTranscoderPreset) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("PresetID", f.presetID) + return properties +} + +func (f *ElasticTranscoderPreset) String() string { + return *f.presetID +} From e527274f4d9c5c1bf73c510e7579359a754631df Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Mon, 27 May 2024 23:30:48 +0000 Subject: [PATCH 122/135] Add module to handle Glue security configurations Signed-off-by: Gabriela S. Soria --- resources/glue-securityconfigurations.go | 68 ++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 resources/glue-securityconfigurations.go diff --git a/resources/glue-securityconfigurations.go b/resources/glue-securityconfigurations.go new file mode 100644 index 00000000..9aaff171 --- /dev/null +++ b/resources/glue-securityconfigurations.go @@ -0,0 +1,68 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/glue" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type GlueSecurityConfiguration struct { + svc *glue.Glue + name *string +} + +func init() { + register("GlueSecurityConfiguration", ListGlueSecurityConfigurations) +} + +func ListGlueSecurityConfigurations(sess *session.Session) ([]Resource, error) { + svc := glue.New(sess) + resources := []Resource{} + + params := &glue.GetSecurityConfigurationsInput{ + MaxResults: aws.Int64(25), + } + + for { + output, err := svc.GetSecurityConfigurations(params) + if err != nil { + return nil, err + } + + for _, securityConfiguration := range output.SecurityConfigurations { + resources = append(resources, &GlueSecurityConfiguration{ + svc: svc, + name: securityConfiguration.Name, + }) + } + + // Check if there are more security configurations to fetch + if output.NextToken == nil || *output.NextToken == ""{ + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (f *GlueSecurityConfiguration) Remove() error { + _, err := f.svc.DeleteSecurityConfiguration(&glue.DeleteSecurityConfigurationInput{ + Name: f.name, + }) + + return err +} + +func (f *GlueSecurityConfiguration) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Name", f.name) + + return properties +} + +func (f *GlueSecurityConfiguration) String() string { + return *f.name +} From 7ab3cd206e34c761e69ba5f33f74b11e3b889793 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 May 2024 13:37:32 +0200 Subject: [PATCH 123/135] Bump the golang group across 1 directory with 2 updates (#1227) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 4a610aaa..efd77698 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.52.3 - github.com/fatih/color v1.16.0 + github.com/aws/aws-sdk-go v1.53.10 + github.com/fatih/color v1.17.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4 @@ -28,7 +28,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spf13/pflag v1.0.5 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/sys v0.14.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/tools v0.7.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) diff --git a/go.sum b/go.sum index ddb5e855..243b890e 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,12 @@ -github.com/aws/aws-sdk-go v1.52.3 h1:BNPJmHOXNoM/iBWJKrvaQvJOweRcp3KLpzdb65CfQwU= -github.com/aws/aws-sdk-go v1.52.3/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.53.10 h1:3enP5l5WtezT9Ql+XZqs56JBf5YUd/FEzTCg///OIGY= +github.com/aws/aws-sdk-go v1.53.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/gemnasium/logrus-graylog-hook/v3 v3.1.0 h1:SLtCnpI5ZZaz4l7RSatEhppB1BBhUEu+DqGANJzJdEA= github.com/gemnasium/logrus-graylog-hook/v3 v3.1.0/go.mod h1:wi1zWv9tIvyLSMLCAzgRP+YR24oLVQVBHfPPKjtht44= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= @@ -79,8 +79,8 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= From 9517b3609ab0009ff87ebff5be7fd518c305b2c8 Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Wed, 29 May 2024 16:40:43 +0000 Subject: [PATCH 124/135] Reformat the file Signed-off-by: Gabriela S. Soria --- resources/glue-securityconfigurations.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/glue-securityconfigurations.go b/resources/glue-securityconfigurations.go index 9aaff171..bc03635f 100644 --- a/resources/glue-securityconfigurations.go +++ b/resources/glue-securityconfigurations.go @@ -38,7 +38,7 @@ func ListGlueSecurityConfigurations(sess *session.Session) ([]Resource, error) { } // Check if there are more security configurations to fetch - if output.NextToken == nil || *output.NextToken == ""{ + if output.NextToken == nil || *output.NextToken == "" { break } From 4b8ea2ed049954127642d5ed068c61ce7be75221 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jun 2024 08:55:10 +0200 Subject: [PATCH 125/135] Bump github.com/aws/aws-sdk-go from 1.53.10 to 1.53.15 in the golang group (#1229) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index efd77698..2664a0f5 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.53.10 + github.com/aws/aws-sdk-go v1.53.15 github.com/fatih/color v1.17.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 243b890e..490f5245 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.53.10 h1:3enP5l5WtezT9Ql+XZqs56JBf5YUd/FEzTCg///OIGY= -github.com/aws/aws-sdk-go v1.53.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.53.15 h1:FtZmkg7xM8RfP2oY6p7xdKBYrRgkITk9yve2QV7N938= +github.com/aws/aws-sdk-go v1.53.15/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 18db9ccd147796d84e974643e99c8bb0b991ce6b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:19:27 +0200 Subject: [PATCH 126/135] Bump the golang group across 1 directory with 2 updates (#1238) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 14 +++++--------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 2664a0f5..0af0337e 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.53.15 + github.com/aws/aws-sdk-go v1.54.7 github.com/fatih/color v1.17.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 @@ -11,7 +11,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/rebuy-de/rebuy-go-sdk/v4 v4.5.1 github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.8.0 + github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.9.0 golang.org/x/sync v0.7.0 gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index 490f5245..4b53e37e 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,6 @@ -github.com/aws/aws-sdk-go v1.53.15 h1:FtZmkg7xM8RfP2oY6p7xdKBYrRgkITk9yve2QV7N938= -github.com/aws/aws-sdk-go v1.53.15/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/aws/aws-sdk-go v1.54.7 h1:k1wJ+NMOsXgq/Lsa0y1mS0DFoDeHFPcz2OjCq5H5Mjg= +github.com/aws/aws-sdk-go v1.54.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -44,8 +44,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -64,8 +64,6 @@ golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= @@ -84,8 +82,6 @@ golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= From e30c224709f115c0255932ffe9a3057d3a01eda4 Mon Sep 17 00:00:00 2001 From: "Gabriela S. Soria" Date: Sat, 6 Jul 2024 01:18:51 +0000 Subject: [PATCH 127/135] CL-627 | add module for dynamodb backups Signed-off-by: Gabriela S. Soria --- resources/dynamodb-backups.go | 73 +++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 resources/dynamodb-backups.go diff --git a/resources/dynamodb-backups.go b/resources/dynamodb-backups.go new file mode 100644 index 00000000..540046a4 --- /dev/null +++ b/resources/dynamodb-backups.go @@ -0,0 +1,73 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/dynamodb" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" +) + +type DynamoDBBackup struct { + svc *dynamodb.DynamoDB + id string +} + +func init() { + register("DynamoDBBackup", ListDynamoDBBackups) +} + +func ListDynamoDBBackups(sess *session.Session) ([]Resource, error) { + svc := dynamodb.New(sess) + + resources := make([]Resource, 0) + + var lastEvaluatedBackupArn *string + + for { + backupsResp, err := svc.ListBackups(&dynamodb.ListBackupsInput{ + ExclusiveStartBackupArn: lastEvaluatedBackupArn, + }) + if err != nil { + return nil, err + } + + for _, backup := range backupsResp.BackupSummaries { + resources = append(resources, &DynamoDBBackup{ + svc: svc, + id: *backup.BackupArn, + }) + } + + if backupsResp.LastEvaluatedBackupArn == nil { + break + } + + lastEvaluatedBackupArn = backupsResp.LastEvaluatedBackupArn + } + + return resources, nil +} + +func (i *DynamoDBBackup) Remove() error { + params := &dynamodb.DeleteBackupInput{ + BackupArn: aws.String(i.id), + } + + _, err := i.svc.DeleteBackup(params) + if err != nil { + return err + } + + return nil +} + +func (i *DynamoDBBackup) Properties() types.Properties { + properties := types.NewProperties() + properties.Set("Identifier", i.id) + + return properties +} + +func (i *DynamoDBBackup) String() string { + return i.id +} From c24e39364935ccb6397c3d87363e5e6a9b152944 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 11:08:15 +0200 Subject: [PATCH 128/135] Bump github.com/aws/aws-sdk-go from 1.54.7 to 1.54.19 in the golang group across 1 directory (#1246) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0af0337e..5aedbdbc 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rebuy-de/aws-nuke/v2 go 1.21 require ( - github.com/aws/aws-sdk-go v1.54.7 + github.com/aws/aws-sdk-go v1.54.19 github.com/fatih/color v1.17.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 4b53e37e..1cd1603e 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.54.7 h1:k1wJ+NMOsXgq/Lsa0y1mS0DFoDeHFPcz2OjCq5H5Mjg= -github.com/aws/aws-sdk-go v1.54.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= +github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From bc5b576365682946ed90e45bbd1c2da3d9e6201c Mon Sep 17 00:00:00 2001 From: "terraform-cluster-config[bot]" <72873023+terraform-cluster-config[bot]@users.noreply.github.com> Date: Wed, 17 Jul 2024 09:03:01 +0000 Subject: [PATCH 129/135] Add .editorconfig --- .editorconfig | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..64bd5cee --- /dev/null +++ b/.editorconfig @@ -0,0 +1,132 @@ +# Distributed via https://github.com/rebuy-de/terraform-cluster-config +# Modify only there, changes in project repos will be overwritten + +root = true + +[openapi-spec.yaml] +ij_formatter_enabled = false + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +max_line_length = 120 +tab_width = 4 +trim_trailing_whitespace = true +ij_continuation_indent_size = 8 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = true +ij_smart_tabs = false +ij_visual_guides = +ij_wrap_on_typing = false + +[{*.htm,*.html,*.sht,*.shtm,*.shtml}] +ij_html_attribute_wrap = off +ij_html_do_not_indent_children_of_tags = +ij_html_keep_blank_lines = 1 +ij_html_text_wrap = off + +[{*.cjs,*.js}] +ij_javascript_do_while_brace_force = always +ij_javascript_for_brace_force = always +ij_javascript_if_brace_force = always +ij_javascript_keep_blank_lines_in_code = 1 +ij_javascript_use_double_quotes = false +ij_javascript_while_brace_force = always + +[{*.ats,*.cts,*.mts,*.ts}] +ij_typescript_do_while_brace_force = always +ij_typescript_for_brace_force = always +ij_typescript_if_brace_force = always +ij_typescript_import_prefer_absolute_path = true +ij_typescript_keep_blank_lines_in_code = 1 +ij_typescript_space_before_function_left_parenth = false +ij_typescript_use_double_quotes = false +ij_typescript_while_brace_force = always + +[*.coffee] +indent_size = 2 + +[*.java] +ij_continuation_indent_size = 4 +ij_java_blank_lines_around_field = 1 +ij_java_blank_lines_around_initializer = 0 +ij_java_class_brace_style = next_line +ij_java_class_count_to_use_import_on_demand = 99 +ij_java_do_while_brace_force = always +ij_java_doc_add_blank_line_after_param_comments = true +ij_java_doc_add_blank_line_after_return = true +ij_java_for_brace_force = always +ij_java_if_brace_force = always +ij_java_keep_blank_lines_before_right_brace = 0 +ij_java_keep_blank_lines_in_code = 1 +ij_java_keep_blank_lines_in_declarations = 0 +ij_java_keep_simple_classes_in_one_line = true +ij_java_keep_simple_lambdas_in_one_line = true +ij_java_method_brace_style = next_line +ij_java_names_count_to_use_import_on_demand = 99 +ij_java_new_line_after_lparen_in_record_header = true +ij_java_packages_to_use_import_on_demand = +ij_java_record_components_wrap = on_every_item +ij_java_rparen_on_new_line_in_record_header = true +ij_java_while_brace_force = always + +[{*.kt,*.kts}] +ij_continuation_indent_size = 4 +ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL +ij_kotlin_name_count_to_use_star_import = 2147483647 +ij_kotlin_name_count_to_use_star_import_for_members = 2147483647 +ij_kotlin_packages_to_use_import_on_demand = + +[{*.ctp,*.hphp,*.inc,*.module,*.php,*.php4,*.php5,*.phtml}] +ij_php_align_multiline_parameters = false +ij_php_blank_lines_around_field = 1 +ij_php_blank_lines_before_return_statement = 1 +ij_php_comma_after_last_array_element = true +ij_php_force_short_declaration_array_style = true +ij_php_keep_blank_lines_before_right_brace = 0 +ij_php_keep_blank_lines_in_code = 1 +ij_php_keep_blank_lines_in_declarations = 0 +ij_php_keep_rparen_and_lbrace_on_one_line = true +ij_php_lower_case_boolean_const = true +ij_php_lower_case_null_const = true +ij_php_method_parameters_new_line_after_left_paren = true +ij_php_method_parameters_right_paren_on_new_line = true +ij_php_phpdoc_blank_line_before_tags = true +ij_php_phpdoc_blank_lines_around_parameters = true +ij_php_space_after_type_cast = true +ij_php_space_before_short_closure_left_parenthesis = true + +[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.rng,*.tld,*.wadl,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul,phpunit.xml.dist}] +ij_xml_space_inside_empty_tag = true + +[{*.tf,*.tfvars,*.hcl}] +tab_width = 2 +ij_continuation_indent_size = 4 + +[*.less] +tab_width = 2 +ij_continuation_indent_size = 2 + +[*.sass] +tab_width = 2 +ij_continuation_indent_size = 2 + +[*.scala] +ij_scala_do_while_brace_force = always +ij_scala_for_brace_force = always +ij_scala_if_brace_force = always +ij_scala_keep_blank_lines_before_right_brace = 0 +ij_scala_keep_blank_lines_in_code = 0 +ij_scala_keep_blank_lines_in_declarations = 0 +ij_scala_multiline_string_closing_quotes_on_new_line = false + +[*.scss] +ij_continuation_indent_size = 4 + +[{*.yaml,*.yml}] +ij_yaml_spaces_within_braces = false +ij_yaml_spaces_within_brackets = false From c1622c9d1d8f8e8b57738588675c804ec31524a0 Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Wed, 7 Aug 2024 08:25:45 -0700 Subject: [PATCH 130/135] add KinesisSignalingChannels module --- resources/kinesis-signaling-channels.go | 60 +++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 resources/kinesis-signaling-channels.go diff --git a/resources/kinesis-signaling-channels.go b/resources/kinesis-signaling-channels.go new file mode 100644 index 00000000..d1830f06 --- /dev/null +++ b/resources/kinesis-signaling-channels.go @@ -0,0 +1,60 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/kinesisvideo" +) + +type KinesisSignalingChannels struct { + svc *kinesisvideo.KinesisVideo + ChannelARN *string +} + +func init() { + register("KinesisSignalingChannels", ListKinesisSignalingChannels) +} + +func ListKinesisSignalingChannels(sess *session.Session) ([]Resource, error) { + svc := kinesisvideo.New(sess) + resources := []Resource{} + + params := &kinesisvideo.ListSignalingChannelsInput{ + MaxResults: aws.Int64(100), + } + + for { + output, err := svc.ListSignalingChannels(params) + if err != nil { + return nil, err + } + + for _, streamInfo := range output.ChannelInfoList { + resources = append(resources, &KinesisSignalingChannels{ + svc: svc, + ChannelARN: streamInfo.ChannelARN, + }) + } + + if output.NextToken == nil { + break + } + + params.NextToken = output.NextToken + } + + return resources, nil +} + +func (f *KinesisSignalingChannels) Remove() error { + + _, err := f.svc.DeleteSignalingChannel(&kinesisvideo.DeleteSignalingChannelInput{ + ChannelARN: f.ChannelARN, + }) + + return err +} + +func (f *KinesisSignalingChannels) String() string { + return *f.ChannelARN +} From 0856ebfb6cd8166b157cd9ce5b70f4eaa854f09a Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Wed, 11 Sep 2024 13:58:33 -0700 Subject: [PATCH 131/135] added bedrock agent alias module --- resources/bedrock-agentalias.go | 95 +++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 resources/bedrock-agentalias.go diff --git a/resources/bedrock-agentalias.go b/resources/bedrock-agentalias.go new file mode 100644 index 00000000..5607e61c --- /dev/null +++ b/resources/bedrock-agentalias.go @@ -0,0 +1,95 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/bedrockagent" +) + +type BedrockAgentAlias struct { + svc *bedrockagent.BedrockAgent + AgentId *string + AgentAliasId *string + AgentAliasName *string +} + +func init() { + register("BedrockAgentAlias", ListBedrockAgentAliases) +} + +func ListBedrockAgentAliases(sess *session.Session) ([]Resource, error) { + svc := bedrockagent.New(sess) + resources := []Resource{} + + agentIds, err := ListBedrockAgentIds(svc) + if err != nil { + return nil, err + } + + for _, agentId := range agentIds { + params := &bedrockagent.ListAgentAliasesInput{ + MaxResults: aws.Int64(100), + AgentId: aws.String(agentId), + } + for { + output, err := svc.ListAgentAliases(params) + if err != nil { + return nil, err + } + + for _, agentAliasInfo := range output.AgentAliasSummaries { + resources = append(resources, &BedrockAgentAlias{ + svc: svc, + AgentId: aws.String(agentId), + AgentAliasName: agentAliasInfo.AgentAliasName, + AgentAliasId: agentAliasInfo.AgentAliasId, + }) + } + + if output.NextToken == nil { + break + } + params.NextToken = output.NextToken + } + + } + + return resources, nil +} + +func ListBedrockAgentIds(svc *bedrockagent.BedrockAgent) ([]string, error) { + + agentIds := []string{} + params := &bedrockagent.ListAgentsInput{ + MaxResults: aws.Int64(100), + } + for { + output, err := svc.ListAgents(params) + if err != nil { + return nil, err + } + + for _, agent := range output.AgentSummaries { + agentIds = append(agentIds, *agent.AgentId) + } + + if output.NextToken == nil { + break + } + params.NextToken = output.NextToken + } + + return agentIds, nil +} + +func (f *BedrockAgentAlias) Remove() error { + _, err := f.svc.DeleteAgentAlias(&bedrockagent.DeleteAgentAliasInput{ + AgentAliasId: f.AgentAliasId, + AgentId: f.AgentId, + }) + return err +} + +func (f *BedrockAgentAlias) String() string { + return *f.AgentAliasName +} From 1a5034effa13595fa6ec2df1a37c01b75a127af0 Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Wed, 11 Sep 2024 13:58:51 -0700 Subject: [PATCH 132/135] added bedrock flow alias module --- resources/bedrock-flowalias.go | 95 ++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 resources/bedrock-flowalias.go diff --git a/resources/bedrock-flowalias.go b/resources/bedrock-flowalias.go new file mode 100644 index 00000000..e0914143 --- /dev/null +++ b/resources/bedrock-flowalias.go @@ -0,0 +1,95 @@ +package resources + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/bedrockagent" +) + +type BedrockFlowAlias struct { + svc *bedrockagent.BedrockAgent + FlowId *string + FlowAliasId *string + FlowAliasName *string +} + +func init() { + register("BedrockFlowAlias", ListBedrockFlowAliases) +} + +func ListBedrockFlowAliases(sess *session.Session) ([]Resource, error) { + svc := bedrockagent.New(sess) + resources := []Resource{} + + flowIds, err := ListBedrockFlowIds(svc) + if err != nil { + return nil, err + } + + for _, flowId := range flowIds { + params := &bedrockagent.ListFlowAliasesInput{ + MaxResults: aws.Int64(100), + FlowIdentifier: aws.String(flowId), + } + for { + output, err := svc.ListFlowAliases(params) + if err != nil { + return nil, err + } + + for _, flowAliasInfo := range output.FlowAliasSummaries { + resources = append(resources, &BedrockFlowAlias{ + svc: svc, + FlowId: flowAliasInfo.FlowId, + FlowAliasId: flowAliasInfo.Id, + FlowAliasName: flowAliasInfo.Name, + }) + } + + if output.NextToken == nil { + break + } + params.NextToken = output.NextToken + } + + } + + return resources, nil +} + +func ListBedrockFlowIds(svc *bedrockagent.BedrockAgent) ([]string, error) { + + flowIds := []string{} + params := &bedrockagent.ListFlowsInput{ + MaxResults: aws.Int64(100), + } + for { + output, err := svc.ListFlows(params) + if err != nil { + return nil, err + } + + for _, flow := range output.FlowSummaries { + flowIds = append(flowIds, *flow.Id) + } + + if output.NextToken == nil { + break + } + params.NextToken = output.NextToken + } + + return flowIds, nil +} + +func (f *BedrockFlowAlias) Remove() error { + _, err := f.svc.DeleteFlowAlias(&bedrockagent.DeleteFlowAliasInput{ + AliasIdentifier: f.FlowAliasId, + FlowIdentifier: f.FlowId, + }) + return err +} + +func (f *BedrockFlowAlias) String() string { + return *f.FlowAliasName +} From 5ea0b67aff036a46f0afa7d1a3dc8899771c7e6e Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Mon, 16 Sep 2024 09:39:32 -0700 Subject: [PATCH 133/135] added filters for aws managed aliases --- resources/bedrock-agentalias.go | 10 ++++++++++ resources/bedrock-flowalias.go | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/resources/bedrock-agentalias.go b/resources/bedrock-agentalias.go index 5607e61c..0ec47cb8 100644 --- a/resources/bedrock-agentalias.go +++ b/resources/bedrock-agentalias.go @@ -1,6 +1,9 @@ package resources import ( + "fmt" + "strings" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/bedrockagent" @@ -82,6 +85,13 @@ func ListBedrockAgentIds(svc *bedrockagent.BedrockAgent) ([]string, error) { return agentIds, nil } +func (f *BedrockAgentAlias) Filter() error { + if strings.HasPrefix(*f.AgentAliasName, "AgentTestAlias") { + return fmt.Errorf("cannot delete AWS managed Agent Alias") + } + return nil +} + func (f *BedrockAgentAlias) Remove() error { _, err := f.svc.DeleteAgentAlias(&bedrockagent.DeleteAgentAliasInput{ AgentAliasId: f.AgentAliasId, diff --git a/resources/bedrock-flowalias.go b/resources/bedrock-flowalias.go index e0914143..19623500 100644 --- a/resources/bedrock-flowalias.go +++ b/resources/bedrock-flowalias.go @@ -1,6 +1,9 @@ package resources import ( + "fmt" + "strings" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/bedrockagent" @@ -82,6 +85,13 @@ func ListBedrockFlowIds(svc *bedrockagent.BedrockAgent) ([]string, error) { return flowIds, nil } +func (f *BedrockFlowAlias) Filter() error { + if strings.HasPrefix(*f.FlowAliasName, "TSTALIASID") { + return fmt.Errorf("cannot delete AWS managed Flow Alias") + } + return nil +} + func (f *BedrockFlowAlias) Remove() error { _, err := f.svc.DeleteFlowAlias(&bedrockagent.DeleteFlowAliasInput{ AliasIdentifier: f.FlowAliasId, From 1e5142c557313859030a5c977afd3aeb36546988 Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Mon, 16 Sep 2024 09:52:48 -0700 Subject: [PATCH 134/135] remove agent alias filter --- resources/bedrock-agentalias.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/resources/bedrock-agentalias.go b/resources/bedrock-agentalias.go index 0ec47cb8..5607e61c 100644 --- a/resources/bedrock-agentalias.go +++ b/resources/bedrock-agentalias.go @@ -1,9 +1,6 @@ package resources import ( - "fmt" - "strings" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/bedrockagent" @@ -85,13 +82,6 @@ func ListBedrockAgentIds(svc *bedrockagent.BedrockAgent) ([]string, error) { return agentIds, nil } -func (f *BedrockAgentAlias) Filter() error { - if strings.HasPrefix(*f.AgentAliasName, "AgentTestAlias") { - return fmt.Errorf("cannot delete AWS managed Agent Alias") - } - return nil -} - func (f *BedrockAgentAlias) Remove() error { _, err := f.svc.DeleteAgentAlias(&bedrockagent.DeleteAgentAliasInput{ AgentAliasId: f.AgentAliasId, From 2e67160a8e57815d8236949f189724ef6a99ed9f Mon Sep 17 00:00:00 2001 From: Cory Bekker Date: Mon, 16 Sep 2024 10:49:51 -0700 Subject: [PATCH 135/135] added alias properties --- resources/bedrock-agentalias.go | 10 ++++++++++ resources/bedrock-flowalias.go | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/resources/bedrock-agentalias.go b/resources/bedrock-agentalias.go index 5607e61c..63e0edba 100644 --- a/resources/bedrock-agentalias.go +++ b/resources/bedrock-agentalias.go @@ -4,6 +4,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/bedrockagent" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" ) type BedrockAgentAlias struct { @@ -90,6 +91,15 @@ func (f *BedrockAgentAlias) Remove() error { return err } +func (f *BedrockAgentAlias) Properties() types.Properties { + properties := types.NewProperties(). + Set("AgentId", f.AgentId). + Set("AgentAliasId", f.AgentAliasId). + Set("AgentAliasName", f.AgentAliasName) + + return properties +} + func (f *BedrockAgentAlias) String() string { return *f.AgentAliasName } diff --git a/resources/bedrock-flowalias.go b/resources/bedrock-flowalias.go index 19623500..eca852ca 100644 --- a/resources/bedrock-flowalias.go +++ b/resources/bedrock-flowalias.go @@ -7,6 +7,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/bedrockagent" + "github.com/rebuy-de/aws-nuke/v2/pkg/types" ) type BedrockFlowAlias struct { @@ -100,6 +101,15 @@ func (f *BedrockFlowAlias) Remove() error { return err } +func (f *BedrockFlowAlias) Properties() types.Properties { + properties := types.NewProperties(). + Set("FlowId", f.FlowId). + Set("FlowAliasId", f.FlowAliasId). + Set("FlowAliasName", f.FlowAliasName) + + return properties +} + func (f *BedrockFlowAlias) String() string { return *f.FlowAliasName }