forked from ekristen/aws-nuke
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathelbv2-alb.go
158 lines (131 loc) · 3.91 KB
/
elbv2-alb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package resources
import (
"context"
"errors"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/elbv2"
"github.com/ekristen/libnuke/pkg/registry"
"github.com/ekristen/libnuke/pkg/resource"
libsettings "github.com/ekristen/libnuke/pkg/settings"
"github.com/ekristen/libnuke/pkg/types"
"github.com/ekristen/aws-nuke/v3/pkg/nuke"
)
const ELBv2Resource = "ELBv2"
func init() {
registry.Register(®istry.Registration{
Name: ELBv2Resource,
Scope: nuke.Account,
Resource: &ELBv2LoadBalancer{},
Lister: &ELBv2Lister{},
Settings: []string{
"DisableDeletionProtection",
},
})
}
type ELBv2Lister struct{}
func (l *ELBv2Lister) List(_ context.Context, o interface{}) ([]resource.Resource, error) {
opts := o.(*nuke.ListerOpts)
svc := elbv2.New(opts.Session)
var tagReqELBv2ARNs []*string
elbv2ARNToRsc := make(map[string]*elbv2.LoadBalancer)
err := svc.DescribeLoadBalancersPages(nil,
func(page *elbv2.DescribeLoadBalancersOutput, lastPage bool) bool {
for _, elbv2lb := range page.LoadBalancers {
tagReqELBv2ARNs = append(tagReqELBv2ARNs, elbv2lb.LoadBalancerArn)
elbv2ARNToRsc[*elbv2lb.LoadBalancerArn] = elbv2lb
}
return !lastPage
})
if err != nil {
return nil, err
}
// Tags for ELBv2s 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
resources := make([]resource.Resource, 0)
for len(tagReqELBv2ARNs) > 0 {
requestElements := len(tagReqELBv2ARNs)
if requestElements > 20 {
requestElements = 20
}
tagResp, err := svc.DescribeTags(&elbv2.DescribeTagsInput{
ResourceArns: tagReqELBv2ARNs[:requestElements],
})
if err != nil {
return nil, err
}
for _, elbv2TagInfo := range tagResp.TagDescriptions {
elb := elbv2ARNToRsc[*elbv2TagInfo.ResourceArn]
resources = append(resources, &ELBv2LoadBalancer{
svc: svc,
ARN: elb.LoadBalancerArn,
Name: elb.LoadBalancerName,
CreatedTime: elb.CreatedTime,
Tags: elbv2TagInfo.Tags,
})
}
// Remove the elements that were queried
tagReqELBv2ARNs = tagReqELBv2ARNs[requestElements:]
}
return resources, nil
}
type ELBv2LoadBalancer struct {
svc *elbv2.ELBV2
settings *libsettings.Setting
ARN *string `description:"ARN of the load balancer"`
Name *string `description:"Name of the load balancer"`
CreatedTime *time.Time `description:"Creation time of the load balancer"`
Tags []*elbv2.Tag
}
func (r *ELBv2LoadBalancer) Settings(setting *libsettings.Setting) {
r.settings = setting
}
func (r *ELBv2LoadBalancer) Remove(_ context.Context) error {
params := &elbv2.DeleteLoadBalancerInput{
LoadBalancerArn: r.ARN,
}
if _, err := r.svc.DeleteLoadBalancer(params); err != nil {
if r.settings.GetBool("DisableDeletionProtection") {
var awsErr awserr.Error
ok := errors.As(err, &awsErr)
if ok && awsErr.Code() == "OperationNotPermitted" &&
awsErr.Message() == "Load balancer '"+*r.ARN+"' cannot be deleted because deletion protection is enabled" {
err = r.DisableProtection()
if err != nil {
return err
}
_, err := r.svc.DeleteLoadBalancer(params)
if err != nil {
return err
}
return nil
}
}
return err
}
return nil
}
func (r *ELBv2LoadBalancer) DisableProtection() error {
params := &elbv2.ModifyLoadBalancerAttributesInput{
LoadBalancerArn: r.ARN,
Attributes: []*elbv2.LoadBalancerAttribute{
{
Key: aws.String("deletion_protection.enabled"),
Value: aws.String("false"),
},
},
}
_, err := r.svc.ModifyLoadBalancerAttributes(params)
if err != nil {
return err
}
return nil
}
func (r *ELBv2LoadBalancer) Properties() types.Properties {
return types.NewPropertiesFromStruct(r)
}
func (r *ELBv2LoadBalancer) String() string {
return *r.Name
}