Skip to content

Commit b598367

Browse files
Merge branch 'oreilly-main' into Update-comprehend-detection-filters
2 parents dd94ae0 + cf3c7e4 commit b598367

File tree

8 files changed

+232
-76
lines changed

8 files changed

+232
-76
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Golang CI
22

33
on:
44
push:
5-
branches: [main]
5+
branches: [oreilly-main]
66
pull_request:
77
types: [opened, reopened, synchronize]
88
schedule:

.github/workflows/release.yaml

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,8 @@ name: Publish release artifacts
33
on:
44
release:
55
types: [created]
6-
permissions:
7-
contents: write
8-
pull-requests: write
96

107
jobs:
11-
update_readme:
12-
name: Update Readme
13-
runs-on: ubuntu-22.04
14-
steps:
15-
- name: Checkout code
16-
uses: actions/checkout@v3
17-
with:
18-
fetch-depth: 0
19-
ref: main
20-
- name: Update versions in readme
21-
run: |
22-
sed -r -i "s/aws-nuke:v[0-9]+\.[0-9]+\.[0-9]+/aws-nuke:${{ github.ref_name }}/" README.md
23-
sed -r -i "s/aws-nuke-v[0-9]+\.[0-9]+\.[0-9]+/aws-nuke-${{ github.ref_name }}/" README.md
24-
sed -r -i "s/\/v[0-9]+\.[0-9]+\.[0-9]+\//\/${{ github.ref_name }}\//" README.md
25-
- uses: peter-evans/create-pull-request@v5
26-
name: Create Pull Request
27-
with:
28-
title: Update readme for ${{ github.ref_name }} release
29-
commit-message: Update readme for ${{ github.ref_name }} release
30-
body: Updating version references in the readme to ${{ github.ref_name }}
31-
branch: update-readme-${{ github.ref_name }}
32-
delete-branch: true
338

349
release:
3510
name: Publish binaries
@@ -56,49 +31,3 @@ jobs:
5631
tag: ${{ github.ref }}
5732
overwrite: true
5833
file_glob: true
59-
60-
docker_build:
61-
runs-on: ubuntu-22.04
62-
name: Docker Build
63-
64-
steps:
65-
- uses: actions/checkout@v3
66-
with:
67-
fetch-depth: 0
68-
69-
- name: Generate image tags
70-
shell: bash
71-
run: echo "tags=quay.io/rebuy/aws-nuke:${GITHUB_REF#refs/tags/},docker.io/rebuy/aws-nuke:${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
72-
id: generate_tags
73-
74-
- name: Set up QEMU
75-
id: qemu
76-
uses: docker/setup-qemu-action@v2
77-
with:
78-
platforms: arm64
79-
80-
- name: Set up Docker Buildx
81-
uses: docker/setup-buildx-action@v2
82-
with:
83-
install: true
84-
85-
- name: Login to Docker Hub
86-
uses: docker/login-action@v2
87-
with:
88-
username: ${{ secrets.DOCKER_USERNAME }}
89-
password: ${{ secrets.DOCKER_PASSWORD }}
90-
91-
- name: Login to Quay.io
92-
uses: docker/login-action@v2
93-
with:
94-
registry: quay.io
95-
username: ${{ secrets.QUAY_USERNAME }}
96-
password: ${{ secrets.QUAY_PASSWORD }}
97-
98-
- name: Build and push
99-
uses: docker/build-push-action@v3
100-
with:
101-
context: .
102-
push: true
103-
tags: ${{ steps.generate_tags.outputs.tags }}
104-
platforms: linux/amd64,linux/arm64

cmd/nuke.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,16 @@ func (n *Nuke) Run() error {
6363
return err
6464
}
6565

66+
if n.items.Count(ItemStateFailed) > 0 && n.items.Count(ItemStateNew) == 0 {
67+
for _, item := range n.items {
68+
if item.State != ItemStateFailed {
69+
continue
70+
}
71+
logrus.Error(fmt.Sprintf("%s. %s.", item.Type, item.Reason))
72+
}
73+
return fmt.Errorf("failed")
74+
}
75+
6676
if n.items.Count(ItemStateNew) == 0 {
6777
fmt.Println("No resource to delete.")
6878
return nil
@@ -249,9 +259,14 @@ func (n *Nuke) HandleQueue() {
249259
n.HandleRemove(item)
250260
item.Print()
251261
case ItemStateFailed:
252-
n.HandleRemove(item)
253-
n.HandleWait(item, listCache)
254-
item.Print()
262+
// item.Resource will be nil if an exception was thrown while retrieving cloudControl
263+
// resourceType's items (I.E resourceTypes lister()), however we still pass down the
264+
// reason and state so we aren't ignoring these exceptions.
265+
if item.Resource != nil {
266+
n.HandleRemove(item)
267+
n.HandleWait(item, listCache)
268+
item.Print()
269+
}
255270
case ItemStatePending:
256271
n.HandleWait(item, listCache)
257272
item.State = ItemStateWaiting

cmd/scan.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"runtime/debug"
77

8+
"github.com/aws/aws-sdk-go/aws/awserr"
89
"github.com/rebuy-de/aws-nuke/v2/pkg/awsutil"
910
"github.com/rebuy-de/aws-nuke/v2/pkg/util"
1011
"github.com/rebuy-de/aws-nuke/v2/resources"
@@ -72,6 +73,20 @@ func (s *scanner) list(region *Region, resourceType string) {
7273
return
7374
}
7475

76+
awsErr, ok := err.(awserr.Error)
77+
if ok && awsErr.Code() == "ThrottlingException" {
78+
s.items <- &Item{
79+
Region: region,
80+
Resource: nil,
81+
State: ItemStateFailed,
82+
Reason: err.Error(),
83+
Type: resourceType,
84+
}
85+
dump := util.Indent(fmt.Sprintf("%v", err), " ")
86+
log.Errorf("Listing %s failed:\n%s", resourceType, dump)
87+
return
88+
}
89+
7590
dump := util.Indent(fmt.Sprintf("%v", err), " ")
7691
log.Errorf("Listing %s failed:\n%s", resourceType, dump)
7792
return

resources/cloudcontrol.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ func init() {
4141
registerCloudControl("AWS::NetworkFirewall::RuleGroup")
4242
}
4343

44+
const CloudControlAPiMaxRetries = 5
45+
4446
func NewListCloudControlResource(typeName string) func(*session.Session) ([]Resource, error) {
4547
return func(sess *session.Session) ([]Resource, error) {
46-
svc := cloudcontrolapi.New(sess)
48+
svc := cloudcontrolapi.New(sess, &aws.Config{MaxRetries: aws.Int(CloudControlAPiMaxRetries)})
4749

4850
params := &cloudcontrolapi.ListResourcesInput{
4951
TypeName: aws.String(typeName),
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package resources
2+
3+
import (
4+
"time"
5+
6+
"github.com/aws/aws-sdk-go/aws/session"
7+
"github.com/aws/aws-sdk-go/service/opensearchservice"
8+
"github.com/rebuy-de/aws-nuke/v2/pkg/types"
9+
)
10+
11+
type OSPackage struct {
12+
svc *opensearchservice.OpenSearchService
13+
packageID *string
14+
packageName *string
15+
createdTime *time.Time
16+
}
17+
18+
func init() {
19+
register("OSPackage", ListOSPackages)
20+
}
21+
22+
func ListOSPackages(sess *session.Session) ([]Resource, error) {
23+
svc := opensearchservice.New(sess)
24+
25+
listResp, err := svc.DescribePackages(&opensearchservice.DescribePackagesInput{})
26+
if err != nil {
27+
return nil, err
28+
}
29+
30+
resources := make([]Resource, 0)
31+
32+
for _, pkg := range listResp.PackageDetailsList {
33+
resources = append(resources, &OSPackage{
34+
svc: svc,
35+
packageID: pkg.PackageID,
36+
packageName: pkg.PackageName,
37+
createdTime: pkg.CreatedAt,
38+
})
39+
}
40+
41+
return resources, nil
42+
}
43+
44+
func (o *OSPackage) Remove() error {
45+
_, err := o.svc.DeletePackage(&opensearchservice.DeletePackageInput{
46+
PackageID: o.packageID,
47+
})
48+
49+
return err
50+
}
51+
52+
func (o *OSPackage) Properties() types.Properties {
53+
properties := types.NewProperties()
54+
properties.Set("PackageID", o.packageID)
55+
properties.Set("PackageName", o.packageName)
56+
properties.Set("CreatedTime", o.createdTime.Format(time.RFC3339))
57+
return properties
58+
}
59+
60+
func (o *OSPackage) String() string {
61+
return *o.packageID
62+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package resources
2+
3+
import (
4+
"github.com/aws/aws-sdk-go/aws/session"
5+
"github.com/aws/aws-sdk-go/service/opensearchservice"
6+
"github.com/rebuy-de/aws-nuke/v2/pkg/types"
7+
)
8+
9+
type OSVPCEndpoint struct {
10+
svc *opensearchservice.OpenSearchService
11+
vpcEndpointId *string
12+
}
13+
14+
func init() {
15+
register("OSVPCEndpoint", ListOSVPCEndpoints)
16+
}
17+
18+
func ListOSVPCEndpoints(sess *session.Session) ([]Resource, error) {
19+
svc := opensearchservice.New(sess)
20+
21+
vpcEndpointIds, err := getOpenSearchVpcEndpointIds(svc)
22+
if err != nil {
23+
return nil, err
24+
}
25+
26+
listResp, err := svc.DescribeVpcEndpoints(&opensearchservice.DescribeVpcEndpointsInput{
27+
VpcEndpointIds: vpcEndpointIds,
28+
})
29+
if err != nil {
30+
return nil, err
31+
}
32+
33+
resources := make([]Resource, 0)
34+
35+
for _, vpcEndpoint := range listResp.VpcEndpoints {
36+
resources = append(resources, &OSVPCEndpoint{
37+
svc: svc,
38+
vpcEndpointId: vpcEndpoint.VpcEndpointId,
39+
})
40+
}
41+
42+
return resources, nil
43+
}
44+
45+
func getOpenSearchVpcEndpointIds(svc *opensearchservice.OpenSearchService) ([]*string, error) {
46+
vpcEndpointIds := make([]*string, 0)
47+
48+
listResp, err := svc.ListVpcEndpoints(&opensearchservice.ListVpcEndpointsInput{})
49+
if err != nil {
50+
return nil, err
51+
}
52+
53+
for _, vpcEndpoint := range listResp.VpcEndpointSummaryList {
54+
vpcEndpointIds = append(vpcEndpointIds, vpcEndpoint.VpcEndpointId)
55+
}
56+
57+
return vpcEndpointIds, nil
58+
}
59+
60+
func (o *OSVPCEndpoint) Remove() error {
61+
_, err := o.svc.DeleteVpcEndpoint(&opensearchservice.DeleteVpcEndpointInput{
62+
VpcEndpointId: o.vpcEndpointId,
63+
})
64+
65+
return err
66+
}
67+
68+
func (o *OSVPCEndpoint) Properties() types.Properties {
69+
properties := types.NewProperties()
70+
properties.Set("VpcEndpointId", o.vpcEndpointId)
71+
return properties
72+
}
73+
74+
func (o *OSVPCEndpoint) String() string {
75+
return *o.vpcEndpointId
76+
}

resources/polly-lexicons.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package resources
2+
3+
import (
4+
"github.com/aws/aws-sdk-go/aws/session"
5+
"github.com/aws/aws-sdk-go/service/polly"
6+
"github.com/rebuy-de/aws-nuke/v2/pkg/types"
7+
)
8+
9+
type PollyLexicon struct {
10+
svc *polly.Polly
11+
name *string
12+
attributes *polly.LexiconAttributes
13+
}
14+
15+
func init() {
16+
register("PollyLexicons", ListPollyLexicons)
17+
}
18+
19+
func ListPollyLexicons(sess *session.Session) ([]Resource, error) {
20+
svc := polly.New(sess)
21+
resources := []Resource{}
22+
23+
listLexiconsInput := &polly.ListLexiconsInput{}
24+
25+
listOutput, err := svc.ListLexicons(listLexiconsInput)
26+
if err != nil {
27+
return nil, err
28+
}
29+
for _, lexicon := range listOutput.Lexicons {
30+
resources = append(resources, &PollyLexicon{
31+
svc: svc,
32+
name: lexicon.Name,
33+
attributes: lexicon.Attributes,
34+
})
35+
}
36+
return resources, nil
37+
}
38+
39+
func (lexicon *PollyLexicon) Remove() error {
40+
deleteInput := &polly.DeleteLexiconInput{
41+
Name: lexicon.name,
42+
}
43+
_, err := lexicon.svc.DeleteLexicon(deleteInput)
44+
return err
45+
}
46+
47+
func (lexicon *PollyLexicon) Properties() types.Properties {
48+
properties := types.NewProperties()
49+
properties.Set("Name", lexicon.name)
50+
properties.Set("Alphabet", lexicon.attributes.Alphabet)
51+
properties.Set("LanguageCode", lexicon.attributes.LanguageCode)
52+
properties.Set("LastModified", lexicon.attributes.LastModified)
53+
properties.Set("LexemesCount", lexicon.attributes.LexemesCount)
54+
properties.Set("LexiconArn", lexicon.attributes.LexiconArn)
55+
properties.Set("Size", lexicon.attributes.Size)
56+
return properties
57+
}

0 commit comments

Comments
 (0)