diff --git a/docs/content/providers/ecs.md b/docs/content/providers/ecs.md index ba5e41088..926404b59 100644 --- a/docs/content/providers/ecs.md +++ b/docs/content/providers/ecs.md @@ -301,7 +301,8 @@ _Optional_ If `region` is not provided, it is resolved from the EC2 metadata endpoint for EC2 tasks. In a FARGATE context it is resolved from the `AWS_REGION` environment variable. -If `accessKeyID` and `secretAccessKey` are not provided, credentials are resolved in the following order: +If `accessKeyID` and `secretAccessKey` are not provided, credentials are resolved in the order specified by the +[default credential chain of AWS SDK for Go V2](https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/configure-gosdk.html#specifying-credentials): - Using the environment variables `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, and `AWS_SESSION_TOKEN`. - Using shared credentials, determined by `AWS_PROFILE` and `AWS_SHARED_CREDENTIALS_FILE`, defaults to `default` and `~/.aws/credentials`. diff --git a/go.mod b/go.mod index 797e20249..67626418e 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,13 @@ require ( github.com/ExpediaDotCom/haystack-client-go v0.0.0-20190315171017-e7edbdf53a61 // No tag on the repo. github.com/Masterminds/sprig/v3 v3.2.3 github.com/abbot/go-http-auth v0.0.0-00010101000000-000000000000 - github.com/aws/aws-sdk-go v1.44.327 + github.com/aws/aws-sdk-go-v2 v1.36.2 + github.com/aws/aws-sdk-go-v2/config v1.28.7 + github.com/aws/aws-sdk-go-v2/credentials v1.17.48 + github.com/aws/aws-sdk-go-v2/service/ec2 v1.203.1 + github.com/aws/aws-sdk-go-v2/service/ecs v1.53.15 + github.com/aws/aws-sdk-go-v2/service/ssm v1.56.13 + github.com/aws/smithy-go v1.22.2 github.com/cenkalti/backoff/v4 v4.3.0 github.com/containous/alice v0.0.0-20181107144136-d83ebdd94cbd // No tag on the repo. github.com/coreos/go-systemd/v22 v22.5.0 @@ -126,21 +132,17 @@ require ( github.com/aliyun/alibaba-cloud-sdk-go v1.63.72 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c // indirect - github.com/aws/aws-sdk-go-v2 v1.32.7 // indirect - github.com/aws/aws-sdk-go-v2/config v1.28.7 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.48 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.33 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.14 // indirect github.com/aws/aws-sdk-go-v2/service/lightsail v1.42.8 // indirect github.com/aws/aws-sdk-go-v2/service/route53 v1.46.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 // indirect - github.com/aws/smithy-go v1.22.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.11 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.9 // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect diff --git a/go.sum b/go.sum index a2c41a772..29407ea7f 100644 --- a/go.sum +++ b/go.sum @@ -184,41 +184,45 @@ github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c/go.mod h1:ufUuZ+z github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/aws/aws-sdk-go v1.44.327 h1:ZS8oO4+7MOBLhkdwIhgtVeDzCeWOlTfKJS7EgggbIEY= -github.com/aws/aws-sdk-go v1.44.327/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2 v1.32.7 h1:ky5o35oENWi0JYWUZkB7WYvVPP+bcRF5/Iq7JWSb5Rw= -github.com/aws/aws-sdk-go-v2 v1.32.7/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2 v1.36.2 h1:Ub6I4lq/71+tPb/atswvToaLGVMxKZvjYDVOWEExOcU= +github.com/aws/aws-sdk-go-v2 v1.36.2/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= github.com/aws/aws-sdk-go-v2/config v1.28.7 h1:GduUnoTXlhkgnxTD93g1nv4tVPILbdNQOzav+Wpg7AE= github.com/aws/aws-sdk-go-v2/config v1.28.7/go.mod h1:vZGX6GVkIE8uECSUHB6MWAUsd4ZcG2Yq/dMa4refR3M= github.com/aws/aws-sdk-go-v2/credentials v1.17.48 h1:IYdLD1qTJ0zanRavulofmqut4afs45mOWEI+MzZtTfQ= github.com/aws/aws-sdk-go-v2/credentials v1.17.48/go.mod h1:tOscxHN3CGmuX9idQ3+qbkzrjVIx32lqDSU1/0d/qXs= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 h1:kqOrpojG71DxJm/KDPO+Z/y1phm1JlC8/iT+5XRmAn8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22/go.mod h1:NtSFajXVVL8TA2QNngagVZmUtXciyrHOt7xgz4faS/M= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 h1:I/5wmGMffY4happ8NOCuIUEWGUvvFp5NSeQcXl9RHcI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26/go.mod h1:FR8f4turZtNy6baO0KJ5FJUmXH/cSkI9fOngs0yl6mA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 h1:zXFLuEuMMUOvEARXFUVJdfqZ4bvvSgdGRq/ATcrQxzM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26/go.mod h1:3o2Wpy0bogG1kyOPrgkXA8pgIfEEv0+m19O9D5+W8y8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.33 h1:knLyPMw3r3JsU8MFHWctE4/e2qWbPaxDYLlohPvnY8c= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.33/go.mod h1:EBp2HQ3f+XCB+5J+IoEbGhoV7CpJbnrsd4asNXmTL0A= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.33 h1:K0+Ne08zqti8J9jwENxZ5NoUyBnaFDTu3apwQJWrwwA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.33/go.mod h1:K97stwwzaWzmqxO8yLGHhClbVW1tC6VT1pDLk1pGrq4= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 h1:8eUsivBQzZHqe/3FE+cqwfH+0p5Jo8PFM/QYQSmeZ+M= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7/go.mod h1:kLPQvGUmxn/fqiCrDeohwG33bq2pQpGeY62yRO6Nrh0= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.203.1 h1:ZgY9zeVAe+54Qa7o1GXKRNTez79lffCeJSSinhl+qec= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.203.1/go.mod h1:0naMk66LtdeTmE+1CWQTKwtzOQ2t8mavOhMhR0Pv1m0= +github.com/aws/aws-sdk-go-v2/service/ecs v1.53.15 h1:uH0DMwDjLGgjjYMk3M1MXHggk37trTiJIvwyJNP17Ig= +github.com/aws/aws-sdk-go-v2/service/ecs v1.53.15/go.mod h1:49tE5yYdlAHqZIO8u5+u9Xy9k8IaV0v5cstZrjnX5+c= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.14 h1:2scbY6//jy/s8+5vGrk7l1+UtHl0h9A4MjOO2k/TM2E= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.14/go.mod h1:bRpZPHZpSe5YRHmPfK3h1M7UBFCn2szHzyx0rw04zro= github.com/aws/aws-sdk-go-v2/service/lightsail v1.42.8 h1:+lmJoqxuUoPlSfGk5JYQQivd9YFjUvRZR6RPY+Wcx48= github.com/aws/aws-sdk-go-v2/service/lightsail v1.42.8/go.mod h1:Gg8/myP4+rgRi4+j9gQdbOEnMtwMAUUIeXo+nKCFVj8= github.com/aws/aws-sdk-go-v2/service/route53 v1.46.4 h1:0jMtawybbfpFEIMy4wvfyW2Z4YLr7mnuzT0fhR67Nrc= github.com/aws/aws-sdk-go-v2/service/route53 v1.46.4/go.mod h1:xlMODgumb0Pp8bzfpojqelDrf8SL9rb5ovwmwKJl+oU= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 h1:CvuUmnXI7ebaUAhbJcDy9YQx8wHR69eZ9I7q5hszt/g= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.8/go.mod h1:XDeGv1opzwm8ubxddF0cgqkZWsyOtw4lr6dxwmb6YQg= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 h1:F2rBfNAL5UyswqoeWv9zs74N/NanhK16ydHW1pahX6E= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7/go.mod h1:JfyQ0g2JG8+Krq0EuZNnRwX0mU0HrwY/tG6JNfcqh4k= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 h1:Xgv/hyNgvLda/M9l9qxXc4UFSgppnRczLxlMs5Ae/QY= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.3/go.mod h1:5Gn+d+VaaRgsjewpMvGazt0WfcFO+Md4wLOuBfGR9Bc= +github.com/aws/aws-sdk-go-v2/service/ssm v1.56.13 h1:JfPeW7F6Y+VqBg6p+8zQv4wlgceguYu5ZT0USEGZ89g= +github.com/aws/aws-sdk-go-v2/service/ssm v1.56.13/go.mod h1:EonGQFn66wZkJJrrKXrryrxoS3V30rcHvaWvc6oGHCI= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.11 h1:kuIyu4fTT38Kj7YCC7ouNbVZSSpqkZ+LzIfhCr6Dg+I= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.11/go.mod h1:Ro744S4fKiCCuZECXgOi760TiYylUM8ZBf6OGiZzJtY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10 h1:l+dgv/64iVlQ3WsBbnn+JSbkj01jIi+SM0wYsj3y/hY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10/go.mod h1:Fzsj6lZEb8AkTE5S68OhcbBqeWPsR8RnGuKPr8Todl8= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.9 h1:BRVDbewN6VZcwr+FBOszDKvYeXY1kJ+GGMCcpghlw0U= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.9/go.mod h1:f6vjfZER1M17Fokn0IzssOTMT2N8ZSq+7jnNF0tArvw= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= -github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= +github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -1591,7 +1595,6 @@ golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 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.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -1741,7 +1744,6 @@ golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXR golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/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/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= diff --git a/pkg/provider/ecs/builder_test.go b/pkg/provider/ecs/builder_test.go index 9dd17a995..6d43644aa 100644 --- a/pkg/provider/ecs/builder_test.go +++ b/pkg/provider/ecs/builder_test.go @@ -1,10 +1,13 @@ package ecs -import "github.com/aws/aws-sdk-go/service/ecs" +import ( + ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types" + ecstypes "github.com/aws/aws-sdk-go-v2/service/ecs/types" +) func instance(ops ...func(*ecsInstance)) ecsInstance { e := &ecsInstance{ - containerDefinition: &ecs.ContainerDefinition{}, + containerDefinition: &ecstypes.ContainerDefinition{}, } for _, op := range ops { @@ -36,7 +39,7 @@ func iMachine(opts ...func(*machine)) func(*ecsInstance) { } } -func mState(state string) func(*machine) { +func mState(state ec2types.InstanceStateName) func(*machine) { return func(m *machine) { m.state = state } @@ -48,7 +51,7 @@ func mPrivateIP(ip string) func(*machine) { } } -func mHealthStatus(status string) func(*machine) { +func mHealthStatus(status ecstypes.HealthStatus) func(*machine) { return func(m *machine) { m.healthStatus = status } @@ -64,10 +67,10 @@ func mPorts(opts ...func(*portMapping)) func(*machine) { } } -func mPort(containerPort, hostPort int32, protocol string) func(*portMapping) { +func mPort(containerPort, hostPort int32, protocol ecstypes.TransportProtocol) func(*portMapping) { return func(pm *portMapping) { - pm.containerPort = int64(containerPort) - pm.hostPort = int64(hostPort) + pm.containerPort = containerPort + pm.hostPort = hostPort pm.protocol = protocol } } diff --git a/pkg/provider/ecs/config.go b/pkg/provider/ecs/config.go index 297abf01b..94898575b 100644 --- a/pkg/provider/ecs/config.go +++ b/pkg/provider/ecs/config.go @@ -6,9 +6,9 @@ import ( "fmt" "net" "strconv" - "strings" - "github.com/aws/aws-sdk-go/service/ec2" + ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types" + ecstypes "github.com/aws/aws-sdk-go-v2/service/ecs/types" "github.com/docker/go-connections/nat" "github.com/traefik/traefik/v2/pkg/config/dynamic" "github.com/traefik/traefik/v2/pkg/config/label" @@ -163,12 +163,12 @@ func (p *Provider) filterInstance(ctx context.Context, instance ecsInstance) boo return false } - if strings.ToLower(instance.machine.state) != ec2.InstanceStateNameRunning { + if instance.machine.state != ec2types.InstanceStateNameRunning { logger.Debugf("Filtering ecs instance with an incorrect state %s (%s) (state = %s)", instance.Name, instance.ID, instance.machine.state) return false } - if instance.machine.healthStatus == "UNHEALTHY" { + if instance.machine.healthStatus == ecstypes.HealthStatusUnhealthy { logger.Debugf("Filtering unhealthy ecs instance %s (%s)", instance.Name, instance.ID) return false } @@ -293,9 +293,9 @@ func (p *Provider) getIPPort(instance ecsInstance, serverPort string) (string, s func getPort(instance ecsInstance, serverPort string) string { if len(serverPort) > 0 { for _, port := range instance.machine.ports { - containerPort := strconv.FormatInt(port.containerPort, 10) + containerPort := strconv.FormatInt(int64(port.containerPort), 10) if serverPort == containerPort { - return strconv.FormatInt(port.hostPort, 10) + return strconv.FormatInt(int64(port.hostPort), 10) } } @@ -304,7 +304,7 @@ func getPort(instance ecsInstance, serverPort string) string { var ports []nat.Port for _, port := range instance.machine.ports { - natPort, err := nat.NewPort(port.protocol, strconv.FormatInt(port.hostPort, 10)) + natPort, err := nat.NewPort(string(port.protocol), strconv.FormatInt(int64(port.hostPort), 10)) if err != nil { continue } diff --git a/pkg/provider/ecs/config_test.go b/pkg/provider/ecs/config_test.go index 39764d679..6f72344cf 100644 --- a/pkg/provider/ecs/config_test.go +++ b/pkg/provider/ecs/config_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/aws/aws-sdk-go/service/ec2" + ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types" + ecstypes "github.com/aws/aws-sdk-go-v2/service/ecs/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/traefik/traefik/v2/pkg/config/dynamic" @@ -29,10 +30,10 @@ func TestDefaultRule(t *testing.T) { id("1"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("10.0.0.1"), mPorts( - mPort(0, 1337, "TCP"), + mPort(0, 1337, ecstypes.TransportProtocolTcp), ), ), ), @@ -83,10 +84,10 @@ func TestDefaultRule(t *testing.T) { name("Test"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -139,10 +140,10 @@ func TestDefaultRule(t *testing.T) { "traefik.domain": "foo.bar", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -193,10 +194,10 @@ func TestDefaultRule(t *testing.T) { name("Test"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -241,10 +242,10 @@ func TestDefaultRule(t *testing.T) { name("Test"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -289,10 +290,10 @@ func TestDefaultRule(t *testing.T) { name("Test"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -380,10 +381,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.test": "", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -418,10 +419,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.tcp.services.test": "", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -456,10 +457,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.udp.services.test": "", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -492,10 +493,10 @@ func Test_buildConfiguration(t *testing.T) { name("Test"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -545,10 +546,10 @@ func Test_buildConfiguration(t *testing.T) { name("Test"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -556,10 +557,10 @@ func Test_buildConfiguration(t *testing.T) { name("Test2"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -625,10 +626,10 @@ func Test_buildConfiguration(t *testing.T) { name("Test"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -637,10 +638,10 @@ func Test_buildConfiguration(t *testing.T) { name("Test"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -695,10 +696,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -752,10 +753,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.service": "Service1", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -806,10 +807,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.rule": "Host(`foo.com`)", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -861,10 +862,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -917,10 +918,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service2.loadbalancer.passhostheader": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -977,10 +978,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.service": "Service1", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1032,10 +1033,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1046,10 +1047,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "false", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1091,10 +1092,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "false", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1105,10 +1106,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1119,10 +1120,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1164,10 +1165,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1178,10 +1179,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1236,10 +1237,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.middlewares.Middleware1.inflightreq.amount": "42", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1298,10 +1299,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.middlewares.Middleware1.inflightreq.amount": "42", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1312,10 +1313,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.middlewares.Middleware1.inflightreq.amount": "42", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1377,10 +1378,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.middlewares.Middleware1.inflightreq.amount": "42", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1391,10 +1392,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.middlewares.Middleware1.inflightreq.amount": "41", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1450,10 +1451,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.middlewares.Middleware1.inflightreq.amount": "42", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1464,10 +1465,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.middlewares.Middleware1.inflightreq.amount": "41", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1478,10 +1479,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.middlewares.Middleware1.inflightreq.amount": "40", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.3"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1540,10 +1541,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.rule": "Host(`foo.com`)", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1554,10 +1555,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.rule": "Host(`bar.com`)", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1607,10 +1608,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.rule": "Host(`foo.com`)", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1621,10 +1622,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.rule": "Host(`bar.com`)", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1635,10 +1636,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.rule": "Host(`foobar.com`)", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.3"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1691,10 +1692,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.rule": "Host(`foo.com`)", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1706,10 +1707,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.rule": "Host(`foo.com`)", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1763,10 +1764,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.rule": "Host(`foo.com`)", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1776,10 +1777,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Router1.rule": "Host(`foo.com`)", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1835,10 +1836,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.wrong.label": "42", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -1891,10 +1892,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.LoadBalancer.server.port": "80", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(80, 8080, "tcp"), + mPort(80, 8080, ecstypes.TransportProtocolTcp), ), ), ), @@ -1947,10 +1948,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.LoadBalancer.server.port": "8040", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(80, 8080, "tcp"), + mPort(80, 8080, ecstypes.TransportProtocolTcp), ), ), ), @@ -2007,11 +2008,11 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service2.LoadBalancer.server.port": "4444", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(4444, 32123, "tcp"), - mPort(4445, 32124, "tcp"), + mPort(4444, 32123, ecstypes.TransportProtocolTcp), + mPort(4445, 32124, ecstypes.TransportProtocolTcp), ), ), ), @@ -2077,10 +2078,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service2.LoadBalancer.server.port": "8080", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2134,7 +2135,7 @@ func Test_buildConfiguration(t *testing.T) { name("Test"), labels(map[string]string{}), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts(), ), @@ -2170,7 +2171,7 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.middlewares.Middleware1.inflightreq.amount": "42", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts(), ), @@ -2206,10 +2207,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.enable": "false", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2244,11 +2245,11 @@ func Test_buildConfiguration(t *testing.T) { "traefik.enable": "false", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), - mHealthStatus("UNHEALTHY"), + mHealthStatus(ecstypes.HealthStatusUnhealthy), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2283,10 +2284,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.enable": "false", }), iMachine( - mState(ec2.InstanceStateNamePending), + mState(ec2types.InstanceStateNamePending), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2321,10 +2322,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.tags": "foo", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2360,10 +2361,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.tags": "foo", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2417,10 +2418,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.routers.Test.middlewares": "Middleware1", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2484,10 +2485,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.tcp.routers.Test.middlewares": "Middleware1", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2546,10 +2547,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.tcp.routers.foo.tls": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2601,10 +2602,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.udp.routers.foo.entrypoints": "mydns", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "udp"), + mPort(0, 80, ecstypes.TransportProtocolUdp), ), ), ), @@ -2654,10 +2655,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.tcp.routers.foo.tls": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2705,10 +2706,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.tcp.services.foo.loadbalancer.server.port": "80", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(80, 8080, "tcp"), + mPort(80, 8080, ecstypes.TransportProtocolTcp), ), ), ), @@ -2763,10 +2764,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.udp.services.foo.loadbalancer.server.port": "80", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(80, 8080, "udp"), + mPort(80, 8080, ecstypes.TransportProtocolUdp), ), ), ), @@ -2818,10 +2819,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2834,10 +2835,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.passhostheader": "true", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.2"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2910,10 +2911,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.udp.services.foo.loadbalancer.server.port": "8080", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), @@ -2959,10 +2960,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.tcp.services.foo.loadbalancer.terminationdelay": "200", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(80, 8080, "tcp"), + mPort(80, 8080, ecstypes.TransportProtocolTcp), ), ), ), @@ -3010,10 +3011,10 @@ func Test_buildConfiguration(t *testing.T) { "traefik.tls.stores.default.defaultgeneratedcert.domain.sans": "foobar, fiibar", }), iMachine( - mState(ec2.InstanceStateNameRunning), + mState(ec2types.InstanceStateNameRunning), mPrivateIP("127.0.0.1"), mPorts( - mPort(0, 80, "tcp"), + mPort(0, 80, ecstypes.TransportProtocolTcp), ), ), ), diff --git a/pkg/provider/ecs/ecs.go b/pkg/provider/ecs/ecs.go index 81b83eb74..3310236c9 100644 --- a/pkg/provider/ecs/ecs.go +++ b/pkg/provider/ecs/ecs.go @@ -3,21 +3,22 @@ package ecs import ( "context" "fmt" - "os" + "iter" + "slices" "strings" "text/template" "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/credentials/stscreds" - "github.com/aws/aws-sdk-go/aws/defaults" - "github.com/aws/aws-sdk-go/aws/ec2metadata" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/ec2" - "github.com/aws/aws-sdk-go/service/ecs" - "github.com/aws/aws-sdk-go/service/ssm" - "github.com/aws/aws-sdk-go/service/sts" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/ec2" + ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types" + "github.com/aws/aws-sdk-go-v2/service/ecs" + ecstypes "github.com/aws/aws-sdk-go-v2/service/ecs/types" + "github.com/aws/aws-sdk-go-v2/service/ssm" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" + "github.com/aws/smithy-go/logging" "github.com/cenkalti/backoff/v4" "github.com/patrickmn/go-cache" "github.com/traefik/traefik/v2/pkg/config/dynamic" @@ -47,29 +48,29 @@ type Provider struct { type ecsInstance struct { Name string ID string - containerDefinition *ecs.ContainerDefinition + containerDefinition *ecstypes.ContainerDefinition machine *machine Labels map[string]string ExtraConf configuration } type portMapping struct { - containerPort int64 - hostPort int64 - protocol string + containerPort int32 + hostPort int32 + protocol ecstypes.TransportProtocol } type machine struct { - state string + state ec2types.InstanceStateName privateIP string ports []portMapping - healthStatus string + healthStatus ecstypes.HealthStatus } type awsClient struct { - ecs *ecs.ECS - ec2 *ec2.EC2 - ssm *ssm.SSM + ecs *ecs.Client + ec2 *ec2.Client + ssm *ssm.Client } // DefaultTemplateRule The default template for the default rule. @@ -100,56 +101,40 @@ func (p *Provider) Init() error { return nil } -func (p *Provider) createClient(logger log.Logger) (*awsClient, error) { - sess, err := session.NewSessionWithOptions(session.Options{ - SharedConfigState: session.SharedConfigEnable, - }) +func (p *Provider) createClient(ctx context.Context, logger log.Logger) (*awsClient, error) { + optFns := []func(*config.LoadOptions) error{ + config.WithLogger(logging.LoggerFunc(func(_ logging.Classification, format string, args ...interface{}) { + logger.Debugf(format, args...) + })), + } + if p.Region != "" { + optFns = append(optFns, config.WithRegion(p.Region)) + } else { + logger.Infoln("No region provided, will retrieve region from the EC2 Metadata service") + optFns = append(optFns, config.WithEC2IMDSRegion()) + } + + if p.AccessKeyID != "" && p.SecretAccessKey != "" { + // From https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/configure-gosdk.html#specify-credentials-programmatically: + // "If you explicitly provide credentials, as in this example, the SDK uses only those credentials." + // this makes sure that user-defined credentials always have the highest priority + staticCreds := aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(p.AccessKeyID, p.SecretAccessKey, "")) + optFns = append(optFns, config.WithCredentialsProvider(staticCreds)) + + // If the access key and secret access key are not provided, config.LoadDefaultConfig + // will look for the credentials in the default credential chain. + // See https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/configure-gosdk.html#specifying-credentials. + } + + cfg, err := config.LoadDefaultConfig(ctx, optFns...) if err != nil { return nil, err } - ec2meta := ec2metadata.New(sess) - if p.Region == "" && ec2meta.Available() { - logger.Infoln("No region provided, querying instance metadata endpoint...") - identity, err := ec2meta.GetInstanceIdentityDocument() - if err != nil { - return nil, err - } - p.Region = identity.Region - } - - cfg := aws.NewConfig(). - WithCredentials(credentials.NewChainCredentials([]credentials.Provider{ - &credentials.StaticProvider{ - Value: credentials.Value{ - AccessKeyID: p.AccessKeyID, - SecretAccessKey: p.SecretAccessKey, - }, - }, - &credentials.EnvProvider{}, - &credentials.SharedCredentialsProvider{}, - defaults.RemoteCredProvider(*(defaults.Config()), defaults.Handlers()), - stscreds.NewWebIdentityRoleProviderWithOptions( - sts.New(sess), - os.Getenv("AWS_ROLE_ARN"), - "", - stscreds.FetchTokenPath(os.Getenv("AWS_WEB_IDENTITY_TOKEN_FILE")), - ), - })) - - // Set the region if it is defined by the user or resolved from the EC2 metadata. - if p.Region != "" { - cfg.Region = &p.Region - } - - cfg.WithLogger(aws.LoggerFunc(func(args ...interface{}) { - logger.Debug(args...) - })) - return &awsClient{ - ecs.New(sess, cfg), - ec2.New(sess, cfg), - ssm.New(sess, cfg), + ecs.NewFromConfig(cfg), + ec2.NewFromConfig(cfg), + ssm.NewFromConfig(cfg), }, nil } @@ -160,7 +145,7 @@ func (p *Provider) Provide(configurationChan chan<- dynamic.Message, pool *safe. logger := log.FromContext(ctxLog) operation := func() error { - awsClient, err := p.createClient(logger) + awsClient, err := p.createClient(ctxLog, logger) if err != nil { return fmt.Errorf("unable to create AWS client: %w", err) } @@ -218,28 +203,19 @@ func (p *Provider) loadConfiguration(ctx context.Context, client *awsClient, con func (p *Provider) listInstances(ctx context.Context, client *awsClient) ([]ecsInstance, error) { logger := log.FromContext(ctx) - var clustersArn []*string var clusters []string if p.AutoDiscoverClusters { input := &ecs.ListClustersInput{} - for { - result, err := client.ecs.ListClusters(input) + + paginator := ecs.NewListClustersPaginator(client.ecs, input) + for paginator.HasMorePages() { + page, err := paginator.NextPage(ctx) if err != nil { return nil, err } - if result != nil { - clustersArn = append(clustersArn, result.ClusterArns...) - input.NextToken = result.NextToken - if result.NextToken == nil { - break - } - } else { - break - } - } - for _, cArn := range clustersArn { - clusters = append(clusters, *cArn) + + clusters = append(clusters, page.ClusterArns...) } } else { clusters = p.Clusters @@ -251,13 +227,19 @@ func (p *Provider) listInstances(ctx context.Context, client *awsClient) ([]ecsI for _, c := range clusters { input := &ecs.ListTasksInput{ Cluster: &c, - DesiredStatus: aws.String(ecs.DesiredStatusRunning), + DesiredStatus: ecstypes.DesiredStatusRunning, } - tasks := make(map[string]*ecs.Task) - err := client.ecs.ListTasksPagesWithContext(ctx, input, func(page *ecs.ListTasksOutput, lastPage bool) bool { + tasks := make(map[string]ecstypes.Task) + + paginator := ecs.NewListTasksPaginator(client.ecs, input) + for paginator.HasMorePages() { + page, err := paginator.NextPage(ctx) + if err != nil { + return nil, fmt.Errorf("listing tasks: %w", err) + } if len(page.TaskArns) > 0 { - resp, err := client.ecs.DescribeTasksWithContext(ctx, &ecs.DescribeTasksInput{ + resp, err := client.ecs.DescribeTasks(ctx, &ecs.DescribeTasksInput{ Tasks: page.TaskArns, Cluster: &c, }) @@ -265,16 +247,12 @@ func (p *Provider) listInstances(ctx context.Context, client *awsClient) ([]ecsI logger.Errorf("Unable to describe tasks for %v", page.TaskArns) } else { for _, t := range resp.Tasks { - if aws.StringValue(t.LastStatus) == ecs.DesiredStatusRunning { - tasks[aws.StringValue(t.TaskArn)] = t + if aws.ToString(t.LastStatus) == string(ecstypes.DesiredStatusRunning) { + tasks[aws.ToString(t.TaskArn)] = t } } } } - return !lastPage - }) - if err != nil { - return nil, fmt.Errorf("listing tasks: %w", err) } // Skip to the next cluster if there are no tasks found on @@ -288,7 +266,7 @@ func (p *Provider) listInstances(ctx context.Context, client *awsClient) ([]ecsI return nil, err } - miInstances := make(map[string]*ssm.InstanceInformation) + miInstances := make(map[string]ssmtypes.InstanceInformation) if p.ECSAnywhere { // Try looking up for instances on ECS Anywhere miInstances, err = p.lookupMiInstances(ctx, client, &c, tasks) @@ -303,74 +281,67 @@ func (p *Provider) listInstances(ctx context.Context, client *awsClient) ([]ecsI } for key, task := range tasks { - containerInstance := ec2Instances[aws.StringValue(task.ContainerInstanceArn)] + containerInstance, hasContainerInstance := ec2Instances[aws.ToString(task.ContainerInstanceArn)] taskDef := taskDefinitions[key] for _, container := range task.Containers { - var containerDefinition *ecs.ContainerDefinition + var containerDefinition *ecstypes.ContainerDefinition for _, def := range taskDef.ContainerDefinitions { - if aws.StringValue(container.Name) == aws.StringValue(def.Name) { - containerDefinition = def + if aws.ToString(container.Name) == aws.ToString(def.Name) { + containerDefinition = &def break } } if containerDefinition == nil { - logger.Debugf("Unable to find container definition for %s", aws.StringValue(container.Name)) + logger.Debugf("Unable to find container definition for %s", aws.ToString(container.Name)) continue } var mach *machine - if aws.StringValue(taskDef.NetworkMode) == "awsvpc" && len(task.Attachments) != 0 { + if taskDef.NetworkMode == ecstypes.NetworkModeAwsvpc && len(task.Attachments) != 0 { if len(container.NetworkInterfaces) == 0 { - logger.Errorf("Skip container %s: no network interfaces", aws.StringValue(container.Name)) + logger.Errorf("Skip container %s: no network interfaces", aws.ToString(container.Name)) continue } var ports []portMapping for _, mapping := range containerDefinition.PortMappings { - if mapping != nil { - protocol := "TCP" - if aws.StringValue(mapping.Protocol) == "udp" { - protocol = "UDP" - } - - ports = append(ports, portMapping{ - hostPort: aws.Int64Value(mapping.HostPort), - containerPort: aws.Int64Value(mapping.ContainerPort), - protocol: protocol, - }) - } + ports = append(ports, portMapping{ + hostPort: aws.ToInt32(mapping.HostPort), + containerPort: aws.ToInt32(mapping.ContainerPort), + protocol: mapping.Protocol, + }) } mach = &machine{ - privateIP: aws.StringValue(container.NetworkInterfaces[0].PrivateIpv4Address), + privateIP: aws.ToString(container.NetworkInterfaces[0].PrivateIpv4Address), ports: ports, - state: aws.StringValue(task.LastStatus), - healthStatus: aws.StringValue(task.HealthStatus), + state: ec2types.InstanceStateName(strings.ToLower(aws.ToString(task.LastStatus))), + healthStatus: task.HealthStatus, } } else { - miContainerInstance := miInstances[aws.StringValue(task.ContainerInstanceArn)] - if containerInstance == nil && miContainerInstance == nil { - logger.Errorf("Unable to find container instance information for %s", aws.StringValue(container.Name)) + miContainerInstance, hasMiContainerInstance := miInstances[aws.ToString(task.ContainerInstanceArn)] + if !hasContainerInstance && !hasMiContainerInstance { + logger.Errorf("Unable to find container instance information for %s", aws.ToString(container.Name)) continue } var ports []portMapping for _, mapping := range container.NetworkBindings { - if mapping != nil { - ports = append(ports, portMapping{ - hostPort: aws.Int64Value(mapping.HostPort), - containerPort: aws.Int64Value(mapping.ContainerPort), - }) - } + ports = append(ports, portMapping{ + hostPort: aws.ToInt32(mapping.HostPort), + containerPort: aws.ToInt32(mapping.ContainerPort), + protocol: mapping.Protocol, + }) } - var privateIPAddress, stateName string - if containerInstance != nil { - privateIPAddress = aws.StringValue(containerInstance.PrivateIpAddress) - stateName = aws.StringValue(containerInstance.State.Name) - } else if miContainerInstance != nil { - privateIPAddress = aws.StringValue(miContainerInstance.IPAddress) - stateName = aws.StringValue(task.LastStatus) + var privateIPAddress string + var stateName ec2types.InstanceStateName + if hasContainerInstance { + privateIPAddress = aws.ToString(containerInstance.PrivateIpAddress) + stateName = containerInstance.State.Name + } else if hasMiContainerInstance { + privateIPAddress = aws.ToString(miContainerInstance.IPAddress) + stateName = ec2types.InstanceStateName(strings.ToLower(aws.ToString(task.LastStatus))) } mach = &machine{ @@ -381,11 +352,11 @@ func (p *Provider) listInstances(ctx context.Context, client *awsClient) ([]ecsI } instance := ecsInstance{ - Name: fmt.Sprintf("%s-%s", strings.Replace(aws.StringValue(task.Group), ":", "-", 1), *container.Name), + Name: fmt.Sprintf("%s-%s", strings.Replace(aws.ToString(task.Group), ":", "-", 1), aws.ToString(container.Name)), ID: key[len(key)-12:], containerDefinition: containerDefinition, machine: mach, - Labels: aws.StringValueMap(containerDefinition.DockerLabels), + Labels: containerDefinition.DockerLabels, } extraConf, err := p.getConfiguration(instance) @@ -403,21 +374,21 @@ func (p *Provider) listInstances(ctx context.Context, client *awsClient) ([]ecsI return instances, nil } -func (p *Provider) lookupMiInstances(ctx context.Context, client *awsClient, clusterName *string, ecsDatas map[string]*ecs.Task) (map[string]*ssm.InstanceInformation, error) { +func (p *Provider) lookupMiInstances(ctx context.Context, client *awsClient, clusterName *string, ecsDatas map[string]ecstypes.Task) (map[string]ssmtypes.InstanceInformation, error) { instanceIDs := make(map[string]string) - miInstances := make(map[string]*ssm.InstanceInformation) + miInstances := make(map[string]ssmtypes.InstanceInformation) - var containerInstancesArns []*string - var instanceArns []*string + var containerInstancesArns []string + var instanceArns []string for _, task := range ecsDatas { if task.ContainerInstanceArn != nil { - containerInstancesArns = append(containerInstancesArns, task.ContainerInstanceArn) + containerInstancesArns = append(containerInstancesArns, *task.ContainerInstanceArn) } } - for _, arns := range p.chunkIDs(containerInstancesArns) { - resp, err := client.ecs.DescribeContainerInstancesWithContext(ctx, &ecs.DescribeContainerInstancesInput{ + for arns := range chunkIDs(containerInstancesArns) { + resp, err := client.ecs.DescribeContainerInstances(ctx, &ecs.DescribeContainerInstancesInput{ ContainerInstances: arns, Cluster: clusterName, }) @@ -426,23 +397,21 @@ func (p *Provider) lookupMiInstances(ctx context.Context, client *awsClient, clu } for _, container := range resp.ContainerInstances { - instanceIDs[aws.StringValue(container.Ec2InstanceId)] = aws.StringValue(container.ContainerInstanceArn) + instanceIDs[aws.ToString(container.Ec2InstanceId)] = aws.ToString(container.ContainerInstanceArn) // Disallow EC2 Instance IDs // This prevents considering EC2 instances in ECS // and getting InvalidInstanceID.Malformed error when calling the describe-instances endpoint. - if !strings.HasPrefix(aws.StringValue(container.Ec2InstanceId), "mi-") { - continue + if strings.HasPrefix(aws.ToString(container.Ec2InstanceId), "mi-") { + instanceArns = append(instanceArns, *container.Ec2InstanceId) } - - instanceArns = append(instanceArns, container.Ec2InstanceId) } } if len(instanceArns) > 0 { - for _, ids := range p.chunkIDs(instanceArns) { + for ids := range chunkIDs(instanceArns) { input := &ssm.DescribeInstanceInformationInput{ - Filters: []*ssm.InstanceInformationStringFilter{ + Filters: []ssmtypes.InstanceInformationStringFilter{ { Key: aws.String("InstanceIds"), Values: ids, @@ -450,18 +419,18 @@ func (p *Provider) lookupMiInstances(ctx context.Context, client *awsClient, clu }, } - err := client.ssm.DescribeInstanceInformationPagesWithContext(ctx, input, func(page *ssm.DescribeInstanceInformationOutput, lastPage bool) bool { - if len(page.InstanceInformationList) > 0 { - for _, i := range page.InstanceInformationList { - if i.InstanceId != nil { - miInstances[instanceIDs[aws.StringValue(i.InstanceId)]] = i - } + paginator := ssm.NewDescribeInstanceInformationPaginator(client.ssm, input) + for paginator.HasMorePages() { + page, err := paginator.NextPage(ctx) + if err != nil { + return nil, fmt.Errorf("describing instances: %w", err) + } + + for _, i := range page.InstanceInformationList { + if i.InstanceId != nil { + miInstances[instanceIDs[aws.ToString(i.InstanceId)]] = i } } - return !lastPage - }) - if err != nil { - return nil, fmt.Errorf("describing instances: %w", err) } } } @@ -469,21 +438,21 @@ func (p *Provider) lookupMiInstances(ctx context.Context, client *awsClient, clu return miInstances, nil } -func (p *Provider) lookupEc2Instances(ctx context.Context, client *awsClient, clusterName *string, ecsDatas map[string]*ecs.Task) (map[string]*ec2.Instance, error) { +func (p *Provider) lookupEc2Instances(ctx context.Context, client *awsClient, clusterName *string, ecsDatas map[string]ecstypes.Task) (map[string]ec2types.Instance, error) { instanceIDs := make(map[string]string) - ec2Instances := make(map[string]*ec2.Instance) + ec2Instances := make(map[string]ec2types.Instance) - var containerInstancesArns []*string - var instanceArns []*string + var containerInstancesArns []string + var instanceArns []string for _, task := range ecsDatas { if task.ContainerInstanceArn != nil { - containerInstancesArns = append(containerInstancesArns, task.ContainerInstanceArn) + containerInstancesArns = append(containerInstancesArns, *task.ContainerInstanceArn) } } - for _, arns := range p.chunkIDs(containerInstancesArns) { - resp, err := client.ecs.DescribeContainerInstancesWithContext(ctx, &ecs.DescribeContainerInstancesInput{ + for arns := range chunkIDs(containerInstancesArns) { + resp, err := client.ecs.DescribeContainerInstances(ctx, &ecs.DescribeContainerInstancesInput{ ContainerInstances: arns, Cluster: clusterName, }) @@ -492,38 +461,38 @@ func (p *Provider) lookupEc2Instances(ctx context.Context, client *awsClient, cl } for _, container := range resp.ContainerInstances { - instanceIDs[aws.StringValue(container.Ec2InstanceId)] = aws.StringValue(container.ContainerInstanceArn) + instanceIDs[aws.ToString(container.Ec2InstanceId)] = aws.ToString(container.ContainerInstanceArn) // Disallow Instance IDs of the form mi-* // This prevents considering external instances in ECS Anywhere setups // and getting InvalidInstanceID.Malformed error when calling the describe-instances endpoint. - if strings.HasPrefix(aws.StringValue(container.Ec2InstanceId), "mi-") { + if strings.HasPrefix(aws.ToString(container.Ec2InstanceId), "mi-") { continue } - - instanceArns = append(instanceArns, container.Ec2InstanceId) + if container.Ec2InstanceId != nil { + instanceArns = append(instanceArns, *container.Ec2InstanceId) + } } } if len(instanceArns) > 0 { - for _, ids := range p.chunkIDs(instanceArns) { + for ids := range chunkIDs(instanceArns) { input := &ec2.DescribeInstancesInput{ InstanceIds: ids, } - err := client.ec2.DescribeInstancesPagesWithContext(ctx, input, func(page *ec2.DescribeInstancesOutput, lastPage bool) bool { - if len(page.Reservations) > 0 { - for _, r := range page.Reservations { - for _, i := range r.Instances { - if i.InstanceId != nil { - ec2Instances[instanceIDs[aws.StringValue(i.InstanceId)]] = i - } + paginator := ec2.NewDescribeInstancesPaginator(client.ec2, input) + for paginator.HasMorePages() { + page, err := paginator.NextPage(ctx) + if err != nil { + return nil, fmt.Errorf("describing instances: %w", err) + } + for _, r := range page.Reservations { + for _, i := range r.Instances { + if i.InstanceId != nil { + ec2Instances[instanceIDs[aws.ToString(i.InstanceId)]] = i } } } - return !lastPage - }) - if err != nil { - return nil, fmt.Errorf("describing instances: %w", err) } } } @@ -531,16 +500,16 @@ func (p *Provider) lookupEc2Instances(ctx context.Context, client *awsClient, cl return ec2Instances, nil } -func (p *Provider) lookupTaskDefinitions(ctx context.Context, client *awsClient, taskDefArns map[string]*ecs.Task) (map[string]*ecs.TaskDefinition, error) { +func (p *Provider) lookupTaskDefinitions(ctx context.Context, client *awsClient, taskDefArns map[string]ecstypes.Task) (map[string]*ecstypes.TaskDefinition, error) { logger := log.FromContext(ctx) - taskDef := make(map[string]*ecs.TaskDefinition) + taskDef := make(map[string]*ecstypes.TaskDefinition) for arn, task := range taskDefArns { if definition, ok := existingTaskDefCache.Get(arn); ok { - taskDef[arn] = definition.(*ecs.TaskDefinition) + taskDef[arn] = definition.(*ecstypes.TaskDefinition) logger.Debugf("Found cached task definition for %s. Skipping the call", arn) } else { - resp, err := client.ecs.DescribeTaskDefinitionWithContext(ctx, &ecs.DescribeTaskDefinitionInput{ + resp, err := client.ecs.DescribeTaskDefinition(ctx, &ecs.DescribeTaskDefinitionInput{ TaskDefinition: task.TaskDefinitionArn, }) if err != nil { @@ -556,16 +525,6 @@ func (p *Provider) lookupTaskDefinitions(ctx context.Context, client *awsClient, // chunkIDs ECS expects no more than 100 parameters be passed to a API call; // thus, pack each string into an array capped at 100 elements. -func (p *Provider) chunkIDs(ids []*string) [][]*string { - var chunked [][]*string - for i := 0; i < len(ids); i += 100 { - var sliceEnd int - if i+100 < len(ids) { - sliceEnd = i + 100 - } else { - sliceEnd = len(ids) - } - chunked = append(chunked, ids[i:sliceEnd]) - } - return chunked +func chunkIDs(ids []string) iter.Seq[[]string] { + return slices.Chunk(ids, 100) } diff --git a/pkg/provider/ecs/ecs_test.go b/pkg/provider/ecs/ecs_test.go index b05bd2165..1f5f58d5e 100644 --- a/pkg/provider/ecs/ecs_test.go +++ b/pkg/provider/ecs/ecs_test.go @@ -3,13 +3,10 @@ package ecs import ( "testing" - "github.com/aws/aws-sdk-go/aws" "github.com/stretchr/testify/assert" ) func TestChunkIDs(t *testing.T) { - provider := &Provider{} - testCases := []struct { desc string count int @@ -71,13 +68,13 @@ func TestChunkIDs(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() - var IDs []*string + var IDs []string for range test.count { - IDs = append(IDs, aws.String("a")) + IDs = append(IDs, "a") } var outCount []int - for _, el := range provider.chunkIDs(IDs) { + for el := range chunkIDs(IDs) { outCount = append(outCount, len(el)) }