2
2
package aws
3
3
4
4
import (
5
+ "context"
5
6
"encoding/json"
6
7
"fmt"
7
- "github.com/aws/aws-sdk-go/aws/arn"
8
- "github.com/aws/aws-sdk-go/service/ecs"
9
- "io/ioutil"
8
+ "io"
10
9
"log"
11
10
"net/http"
12
11
"os"
13
12
14
- "github.com/aws/aws-sdk-go/aws"
15
- "github.com/aws/aws-sdk-go/aws/credentials"
16
- "github.com/aws/aws-sdk-go/aws/defaults"
17
- "github.com/aws/aws-sdk-go/aws/ec2metadata"
18
- "github.com/aws/aws-sdk-go/aws/session"
19
- "github.com/aws/aws-sdk-go/service/ec2"
13
+ "github.com/aws/aws-sdk-go-v2/aws"
14
+ "github.com/aws/aws-sdk-go-v2/aws/arn"
15
+ "github.com/aws/aws-sdk-go-v2/config"
16
+ "github.com/aws/aws-sdk-go-v2/credentials"
17
+ "github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
18
+ "github.com/aws/aws-sdk-go-v2/service/ec2"
19
+ "github.com/aws/aws-sdk-go-v2/service/ec2/types"
20
+ "github.com/aws/aws-sdk-go-v2/service/ecs"
21
+ ecstypes "github.com/aws/aws-sdk-go-v2/service/ecs/types"
20
22
)
21
23
22
24
type Provider struct {}
@@ -61,11 +63,11 @@ func (p *Provider) Help() string {
61
63
62
64
func (p * Provider ) Addrs (args map [string ]string , l * log.Logger ) ([]string , error ) {
63
65
if args ["provider" ] != "aws" {
64
- return nil , fmt .Errorf ("discover-aws: invalid provider " + args ["provider" ])
66
+ return nil , fmt .Errorf ("%s" , " discover-aws: invalid provider "+ args ["provider" ])
65
67
}
66
68
67
69
if l == nil {
68
- l = log .New (ioutil .Discard , "" , 0 )
70
+ l = log .New (io .Discard , "" , 0 )
69
71
}
70
72
71
73
region := args ["region" ]
@@ -122,8 +124,8 @@ func (p *Provider) Addrs(args map[string]string, l *log.Logger) ([]string, error
122
124
}
123
125
} else {
124
126
l .Printf ("[INFO] discover-aws: Region not provided. Looking up region in ec2 metadata..." )
125
- ec2meta := ec2metadata .New (session . New () )
126
- identity , err := ec2meta .GetInstanceIdentityDocument ()
127
+ ec2meta := imds .New (imds. Options {} )
128
+ identity , err := ec2meta .GetInstanceIdentityDocument (context . TODO (), & imds. GetInstanceIdentityDocumentInput {} )
127
129
if err != nil {
128
130
return nil , fmt .Errorf ("discover-aws: GetInstanceIdentityDocument failed: %s" , err )
129
131
}
@@ -133,33 +135,36 @@ func (p *Provider) Addrs(args map[string]string, l *log.Logger) ([]string, error
133
135
l .Printf ("[INFO] discover-aws: Region is %s" , region )
134
136
135
137
l .Printf ("[DEBUG] discover-aws: Creating session..." )
136
- config := aws.Config {
137
- Region : & region ,
138
- Credentials : credentials .NewChainCredentials (
139
- []credentials.Provider {
140
- & credentials.StaticProvider {
141
- Value : credentials.Value {
142
- AccessKeyID : accessKey ,
143
- SecretAccessKey : secretKey ,
144
- SessionToken : sessionToken ,
145
- },
146
- },
147
- & credentials.EnvProvider {},
148
- & credentials.SharedCredentialsProvider {},
149
- defaults .RemoteCredProvider (* (defaults .Config ()), defaults .Handlers ()),
150
- }),
151
- }
152
- if endpoint != "" {
153
- l .Printf ("[INFO] discover-aws: Endpoint is %s" , endpoint )
154
- config .Endpoint = & endpoint
138
+ var cfg aws.Config
139
+ var err error
140
+ if accessKey != "" && secretKey != "" {
141
+ log .Println ("Using static credentials provider" )
142
+ staticCreds := credentials .NewStaticCredentialsProvider (accessKey , secretKey , sessionToken )
143
+ cfg , err = config .LoadDefaultConfig (context .TODO (), config .WithRegion (region ),
144
+ config .WithCredentialsProvider (aws .NewCredentialsCache (staticCreds )))
145
+ if err != nil {
146
+ l .Printf ("unable to load SDK config with Static Provider, %v" , err )
147
+ }
148
+ } else {
149
+ log .Println ("Using default credential chain" )
150
+ cfg , err = config .LoadDefaultConfig (context .TODO (),
151
+ config .WithRegion (region ), // Specify your region
152
+ )
153
+ if err != nil {
154
+ return nil , fmt .Errorf ("unable to load SDK config with default credential chain, %s" , err )
155
+ }
155
156
}
156
157
157
158
// Split here for ec2 vs ecs decision tree
158
159
if service == "ecs" {
159
- svc := ecs .New (session .New (), & config )
160
+ svc := ecs .NewFromConfig (cfg , func (o * ecs.Options ) {
161
+ if endpoint != "" {
162
+ o .BaseEndpoint = aws .String (endpoint )
163
+ }
164
+ })
160
165
161
166
log .Printf ("[INFO] discover-aws: Filter ECS tasks with %s=%s" , tagKey , tagValue )
162
- var clusterArns []* string
167
+ var clusterArns []string
163
168
164
169
// If an ECS Cluster Name (ARN) was specified, dont lookup all the cluster arns
165
170
if ecsCluster == "" {
@@ -169,12 +174,12 @@ func (p *Provider) Addrs(args map[string]string, l *log.Logger) ([]string, error
169
174
}
170
175
clusterArns = arns
171
176
} else {
172
- clusterArns = []* string {& ecsCluster }
177
+ clusterArns = []string {ecsCluster }
173
178
}
174
179
175
180
var taskIps []string
176
181
for _ , clusterArn := range clusterArns {
177
- taskArns , err := getEcsTasks (svc , clusterArn , & ecsFamily )
182
+ taskArns , err := getEcsTasks (svc , & clusterArn , & ecsFamily )
178
183
if err != nil {
179
184
return nil , fmt .Errorf ("discover-aws: Failed to get ECS Tasks: %s" , err )
180
185
}
@@ -185,7 +190,7 @@ func (p *Provider) Addrs(args map[string]string, l *log.Logger) ([]string, error
185
190
pageLimit := 100
186
191
for i := 0 ; i < len (taskArns ); i += pageLimit {
187
192
taskGroup := taskArns [i :min (i + pageLimit , len (taskArns ))]
188
- ecsTaskIps , err := getEcsTaskIps (svc , clusterArn , taskGroup , & tagKey , & tagValue )
193
+ ecsTaskIps , err := getEcsTaskIps (svc , & clusterArn , taskGroup , & tagKey , & tagValue )
189
194
if err != nil {
190
195
return nil , fmt .Errorf ("discover-aws: Failed to get ECS Task IPs: %s" , err )
191
196
}
@@ -199,18 +204,22 @@ func (p *Provider) Addrs(args map[string]string, l *log.Logger) ([]string, error
199
204
200
205
// When not using ECS continue with the default EC2 search
201
206
202
- svc := ec2 .New (session .New (), & config )
207
+ svc := ec2 .NewFromConfig (cfg , func (o * ec2.Options ) {
208
+ if endpoint != "" {
209
+ o .BaseEndpoint = aws .String (endpoint )
210
+ }
211
+ })
203
212
204
213
l .Printf ("[INFO] discover-aws: Filter instances with %s=%s" , tagKey , tagValue )
205
- resp , err := svc .DescribeInstances (& ec2.DescribeInstancesInput {
206
- Filters : []* ec2 .Filter {
207
- & ec2. Filter {
214
+ resp , err := svc .DescribeInstances (context . TODO (), & ec2.DescribeInstancesInput {
215
+ Filters : []types .Filter {
216
+ {
208
217
Name : aws .String ("tag:" + tagKey ),
209
- Values : []* string {aws . String ( tagValue ) },
218
+ Values : []string {tagValue },
210
219
},
211
- & ec2. Filter {
220
+ {
212
221
Name : aws .String ("instance-state-name" ),
213
- Values : []* string {aws . String ( "running" ) },
222
+ Values : []string {"running" },
214
223
},
215
224
},
216
225
})
@@ -276,18 +285,17 @@ func min(a, b int) int {
276
285
return b
277
286
}
278
287
279
- func getEcsClusters (svc * ecs.ECS ) ([]* string , error ) {
280
- pageNum := 0
281
- var clusterArns []* string
282
- err := svc .ListClustersPages (& ecs.ListClustersInput {}, func (page * ecs.ListClustersOutput , lastPage bool ) bool {
283
- pageNum ++
284
- clusterArns = append (clusterArns , page .ClusterArns ... )
285
- log .Printf ("[DEBUG] discover-aws: Retrieved %d TaskArns from page %d" , len (clusterArns ), pageNum )
286
- return ! lastPage // return false to exit page function
287
- })
288
+ func getEcsClusters (svc * ecs.Client ) ([]string , error ) {
289
+ var clusterArns []string
290
+ paginator := ecs .NewListClustersPaginator (svc , & ecs.ListClustersInput {})
288
291
289
- if err != nil {
290
- return nil , fmt .Errorf ("ListClusters failed: %s" , err )
292
+ for paginator .HasMorePages () {
293
+ page , err := paginator .NextPage (context .TODO ())
294
+ if err != nil {
295
+ return nil , fmt .Errorf ("ListClusters failed: %s" , err )
296
+ }
297
+ clusterArns = append (clusterArns , page .ClusterArns ... )
298
+ log .Printf ("[DEBUG] discover-aws: Retrieved %d ClusterArns" , len (clusterArns ))
291
299
}
292
300
293
301
return clusterArns , nil
@@ -304,7 +312,7 @@ func getECSTaskMetadata() (ECSTaskMeta, error) {
304
312
if err != nil {
305
313
return metadataResp , fmt .Errorf ("calling metadata uri: %s" , err )
306
314
}
307
- respBytes , err := ioutil .ReadAll (resp .Body )
315
+ respBytes , err := io .ReadAll (resp .Body )
308
316
if err != nil {
309
317
return metadataResp , fmt .Errorf ("reading metadata uri response body: %s" , err )
310
318
}
@@ -325,36 +333,37 @@ func getEcsTaskRegion(e ECSTaskMeta) (string, error) {
325
333
return a .Region , nil
326
334
}
327
335
328
- func getEcsTasks (svc * ecs.ECS , clusterArn * string , family * string ) ([]* string , error ) {
329
- var taskArns []* string
336
+ func getEcsTasks (svc * ecs.Client , clusterArn * string , family * string ) ([]string , error ) {
337
+ var taskArns []string
330
338
lti := ecs.ListTasksInput {
331
339
Cluster : clusterArn ,
332
- DesiredStatus : aws . String ( "RUNNING" ) ,
340
+ DesiredStatus : ecstypes . DesiredStatusRunning ,
333
341
}
334
342
if * family != "" {
335
343
lti .Family = family
336
344
}
337
345
346
+ paginator := ecs .NewListTasksPaginator (svc , & lti )
347
+
338
348
pageNum := 0
339
- err := svc .ListTasksPages (& lti , func (page * ecs.ListTasksOutput , lastPage bool ) bool {
349
+ for paginator .HasMorePages () {
350
+ page , err := paginator .NextPage (context .TODO ())
351
+ if err != nil {
352
+ return nil , fmt .Errorf ("ListTasks failed: %w" , err )
353
+ }
340
354
pageNum ++
341
355
taskArns = append (taskArns , page .TaskArns ... )
342
356
log .Printf ("[DEBUG] discover-aws: Retrieved %d TaskArns from page %d" , len (taskArns ), pageNum )
343
- return ! lastPage // return false to exit page function
344
- })
345
-
346
- if err != nil {
347
- return nil , fmt .Errorf ("ListTasks failed: %s" , err )
348
357
}
349
358
350
359
return taskArns , nil
351
360
}
352
361
353
- func getEcsTaskIps (svc * ecs.ECS , clusterArn * string , taskArns []* string , tagKey * string , tagValue * string ) ([]string , error ) {
362
+ func getEcsTaskIps (svc * ecs.Client , clusterArn * string , taskArns []string , tagKey * string , tagValue * string ) ([]string , error ) {
354
363
// Describe all the tasks listed for this cluster
355
- taskDescriptions , err := svc .DescribeTasks (& ecs.DescribeTasksInput {
364
+ taskDescriptions , err := svc .DescribeTasks (context . TODO (), & ecs.DescribeTasksInput {
356
365
Cluster : clusterArn ,
357
- Include : []* string { aws . String ( ecs . TaskFieldTags ) },
366
+ Include : []ecstypes. TaskField { ecstypes . TaskFieldTags },
358
367
Tasks : taskArns ,
359
368
})
360
369
@@ -376,7 +385,7 @@ func getEcsTaskIps(svc *ecs.ECS, clusterArn *string, taskArns []*string, tagKey
376
385
377
386
if * taskDescription .DesiredStatus == "RUNNING" {
378
387
log .Printf ("[INFO] discover-aws: Found Running Instance: %s" , * taskDescription .TaskArn )
379
- ip := getIpFromTaskDescription (taskDescription )
388
+ ip := getIpFromTaskDescription (& taskDescription )
380
389
381
390
if ip != nil {
382
391
log .Printf ("[DEBUG] discover-aws: Found Private IP: %s" , * ip )
@@ -394,7 +403,7 @@ func getEcsTaskIps(svc *ecs.ECS, clusterArn *string, taskArns []*string, tagKey
394
403
return ipList , nil
395
404
}
396
405
397
- func getIpFromTaskDescription (taskDesc * ecs .Task ) * string {
406
+ func getIpFromTaskDescription (taskDesc * ecstypes .Task ) * string {
398
407
log .Printf ("[DEBUG] discover-aws: Searching %d attachments for IPs" , len (taskDesc .Attachments ))
399
408
for _ , attachment := range taskDesc .Attachments {
400
409
0 commit comments