diff --git a/autogen/gentemplates/gen.go b/autogen/gentemplates/gen.go index 40eb18681..43c63f861 100644 --- a/autogen/gentemplates/gen.go +++ b/autogen/gentemplates/gen.go @@ -762,7 +762,7 @@ var _templatesEcsV1Tmpl = []byte(`[backends] {{end}} {{range $index, $i := $instances }} - [backends."backend-{{ $i.Name }}".servers."server-{{ $i.Name }}{{ $i.ID }}"] + [backends."backend-{{ $serviceName }}".servers."server-{{ $i.Name }}{{ $i.ID }}"] url = "{{ getProtocol $i }}://{{ getHost $i }}:{{ getPort $i }}" weight = {{ getWeight $i }} {{end}} diff --git a/provider/ecs/config.go b/provider/ecs/config.go index 2f602da2d..50e6cfce1 100644 --- a/provider/ecs/config.go +++ b/provider/ecs/config.go @@ -19,11 +19,12 @@ import ( func (p *Provider) buildConfigurationV2(instances []ecsInstance) (*types.Configuration, error) { services := make(map[string][]ecsInstance) for _, instance := range instances { + backendName := getBackendName(instance) if p.filterInstance(instance) { - if serviceInstances, ok := services[instance.Name]; ok { - services[instance.Name] = append(serviceInstances, instance) + if serviceInstances, ok := services[backendName]; ok { + services[backendName] = append(serviceInstances, instance) } else { - services[instance.Name] = []ecsInstance{instance} + services[backendName] = []ecsInstance{instance} } } } @@ -98,6 +99,13 @@ func (p *Provider) filterInstance(i ecsInstance) bool { return true } +func getBackendName(i ecsInstance) string { + if value := label.GetStringValue(i.TraefikLabels, label.TraefikBackend, ""); len(value) > 0 { + return value + } + return i.Name +} + func (p *Provider) getFrontendRule(i ecsInstance) string { domain := label.GetStringValue(i.TraefikLabels, label.TraefikDomain, p.Domain) defaultRule := "Host:" + strings.ToLower(strings.Replace(i.Name, "_", "-", -1)) + "." + domain @@ -120,9 +128,10 @@ func filterFrontends(instances []ecsInstance) []ecsInstance { byName := make(map[string]struct{}) return fun.Filter(func(i ecsInstance) bool { - _, found := byName[i.Name] + backendName := getBackendName(i) + _, found := byName[backendName] if !found { - byName[i.Name] = struct{}{} + byName[backendName] = struct{}{} } return !found }, instances).([]ecsInstance) diff --git a/provider/ecs/config_test.go b/provider/ecs/config_test.go index ad132871a..e86f8d4e5 100644 --- a/provider/ecs/config_test.go +++ b/provider/ecs/config_test.go @@ -201,7 +201,7 @@ func TestBuildConfiguration(t *testing.T) { }, expected: &types.Configuration{ Backends: map[string]*types.Backend{ - "backend-testing-instance": { + "backend-foobar": { Servers: map[string]types.Server{ "server-testing-instance-6": { URL: "https://10.0.0.1:666", @@ -243,14 +243,345 @@ func TestBuildConfiguration(t *testing.T) { }, }, Frontends: map[string]*types.Frontend{ - "frontend-testing-instance": { + "frontend-foobar": { EntryPoints: []string{ "http", "https", }, - Backend: "backend-testing-instance", + Backend: "backend-foobar", Routes: map[string]types.Route{ - "route-frontend-testing-instance": { + "route-frontend-foobar": { + Rule: "Host:traefik.io", + }, + }, + PassHostHeader: true, + PassTLSCert: true, + Priority: 666, + BasicAuth: []string{ + "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/", + "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0", + }, + WhiteList: &types.WhiteList{ + SourceRange: []string{"10.10.10.10"}, + UseXForwardedFor: true, + }, + Headers: &types.Headers{ + CustomRequestHeaders: map[string]string{ + "Access-Control-Allow-Methods": "POST,GET,OPTIONS", + "Content-Type": "application/json; charset=utf-8", + }, + CustomResponseHeaders: map[string]string{ + "Access-Control-Allow-Methods": "POST,GET,OPTIONS", + "Content-Type": "application/json; charset=utf-8", + }, + AllowedHosts: []string{ + "foo", + "bar", + "bor", + }, + HostsProxyHeaders: []string{ + "foo", + "bar", + "bor", + }, + SSLRedirect: true, + SSLTemporaryRedirect: true, + SSLForceHost: true, + SSLHost: "foo", + SSLProxyHeaders: map[string]string{ + "Access-Control-Allow-Methods": "POST,GET,OPTIONS", + "Content-Type": "application/json; charset=utf-8", + }, + STSSeconds: 666, + STSIncludeSubdomains: true, + STSPreload: true, + ForceSTSHeader: true, + FrameDeny: true, + CustomFrameOptionsValue: "foo", + ContentTypeNosniff: true, + BrowserXSSFilter: true, + CustomBrowserXSSValue: "foo", + ContentSecurityPolicy: "foo", + PublicKey: "foo", + ReferrerPolicy: "foo", + IsDevelopment: true, + }, + Errors: map[string]*types.ErrorPage{ + "bar": { + Status: []string{ + "500", + "600", + }, + Backend: "backend-foobar", + Query: "bar_query", + }, + "foo": { + Status: []string{ + "404", + }, + Backend: "backend-foobar", + Query: "foo_query", + }, + }, + RateLimit: &types.RateLimit{ + RateSet: map[string]*types.Rate{ + "bar": { + Period: flaeg.Duration(3 * time.Second), + Average: 6, + Burst: 9, + }, + "foo": { + Period: flaeg.Duration(6 * time.Second), + Average: 12, + Burst: 18, + }, + }, + ExtractorFunc: "client.ip", + }, + Redirect: &types.Redirect{ + EntryPoint: "https", + Regex: "", + Replacement: "", + Permanent: true, + }, + }, + }, + }, + }, + { + desc: "Containers with same backend name", + instances: []ecsInstance{ + { + Name: "testing-instance-v1", + ID: "6", + containerDefinition: &ecs.ContainerDefinition{ + DockerLabels: map[string]*string{ + label.TraefikPort: aws.String("666"), + label.TraefikProtocol: aws.String("https"), + label.TraefikWeight: aws.String("12"), + + label.TraefikBackend: aws.String("foobar"), + + label.TraefikBackendCircuitBreakerExpression: aws.String("NetworkErrorRatio() > 0.5"), + label.TraefikBackendHealthCheckScheme: aws.String("http"), + label.TraefikBackendHealthCheckPath: aws.String("/health"), + label.TraefikBackendHealthCheckPort: aws.String("880"), + label.TraefikBackendHealthCheckInterval: aws.String("6"), + label.TraefikBackendHealthCheckHostname: aws.String("foo.com"), + label.TraefikBackendHealthCheckHeaders: aws.String("Foo:bar || Bar:foo"), + label.TraefikBackendLoadBalancerMethod: aws.String("drr"), + label.TraefikBackendLoadBalancerSticky: aws.String("true"), + label.TraefikBackendLoadBalancerStickiness: aws.String("true"), + label.TraefikBackendLoadBalancerStickinessCookieName: aws.String("chocolate"), + label.TraefikBackendMaxConnAmount: aws.String("666"), + label.TraefikBackendMaxConnExtractorFunc: aws.String("client.ip"), + label.TraefikBackendBufferingMaxResponseBodyBytes: aws.String("10485760"), + label.TraefikBackendBufferingMemResponseBodyBytes: aws.String("2097152"), + label.TraefikBackendBufferingMaxRequestBodyBytes: aws.String("10485760"), + label.TraefikBackendBufferingMemRequestBodyBytes: aws.String("2097152"), + label.TraefikBackendBufferingRetryExpression: aws.String("IsNetworkError() && Attempts() <= 2"), + + label.TraefikFrontendAuthBasic: aws.String("test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/,test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"), + label.TraefikFrontendEntryPoints: aws.String("http,https"), + label.TraefikFrontendPassHostHeader: aws.String("true"), + label.TraefikFrontendPassTLSCert: aws.String("true"), + label.TraefikFrontendPriority: aws.String("666"), + label.TraefikFrontendRedirectEntryPoint: aws.String("https"), + label.TraefikFrontendRedirectRegex: aws.String("nope"), + label.TraefikFrontendRedirectReplacement: aws.String("nope"), + label.TraefikFrontendRedirectPermanent: aws.String("true"), + label.TraefikFrontendRule: aws.String("Host:traefik.io"), + label.TraefikFrontendWhiteListSourceRange: aws.String("10.10.10.10"), + label.TraefikFrontendWhiteListUseXForwardedFor: aws.String("true"), + + label.TraefikFrontendRequestHeaders: aws.String("Access-Control-Allow-Methods:POST,GET,OPTIONS || Content-type: application/json; charset=utf-8"), + label.TraefikFrontendResponseHeaders: aws.String("Access-Control-Allow-Methods:POST,GET,OPTIONS || Content-type: application/json; charset=utf-8"), + label.TraefikFrontendSSLProxyHeaders: aws.String("Access-Control-Allow-Methods:POST,GET,OPTIONS || Content-type: application/json; charset=utf-8"), + label.TraefikFrontendAllowedHosts: aws.String("foo,bar,bor"), + label.TraefikFrontendHostsProxyHeaders: aws.String("foo,bar,bor"), + label.TraefikFrontendSSLHost: aws.String("foo"), + label.TraefikFrontendCustomFrameOptionsValue: aws.String("foo"), + label.TraefikFrontendContentSecurityPolicy: aws.String("foo"), + label.TraefikFrontendPublicKey: aws.String("foo"), + label.TraefikFrontendReferrerPolicy: aws.String("foo"), + label.TraefikFrontendCustomBrowserXSSValue: aws.String("foo"), + label.TraefikFrontendSTSSeconds: aws.String("666"), + label.TraefikFrontendSSLForceHost: aws.String("true"), + label.TraefikFrontendSSLRedirect: aws.String("true"), + label.TraefikFrontendSSLTemporaryRedirect: aws.String("true"), + label.TraefikFrontendSTSIncludeSubdomains: aws.String("true"), + label.TraefikFrontendSTSPreload: aws.String("true"), + label.TraefikFrontendForceSTSHeader: aws.String("true"), + label.TraefikFrontendFrameDeny: aws.String("true"), + label.TraefikFrontendContentTypeNosniff: aws.String("true"), + label.TraefikFrontendBrowserXSSFilter: aws.String("true"), + label.TraefikFrontendIsDevelopment: aws.String("true"), + + label.Prefix + label.BaseFrontendErrorPage + "foo." + label.SuffixErrorPageStatus: aws.String("404"), + label.Prefix + label.BaseFrontendErrorPage + "foo." + label.SuffixErrorPageBackend: aws.String("foobar"), + label.Prefix + label.BaseFrontendErrorPage + "foo." + label.SuffixErrorPageQuery: aws.String("foo_query"), + label.Prefix + label.BaseFrontendErrorPage + "bar." + label.SuffixErrorPageStatus: aws.String("500,600"), + label.Prefix + label.BaseFrontendErrorPage + "bar." + label.SuffixErrorPageBackend: aws.String("foobar"), + label.Prefix + label.BaseFrontendErrorPage + "bar." + label.SuffixErrorPageQuery: aws.String("bar_query"), + + label.TraefikFrontendRateLimitExtractorFunc: aws.String("client.ip"), + label.Prefix + label.BaseFrontendRateLimit + "foo." + label.SuffixRateLimitPeriod: aws.String("6"), + label.Prefix + label.BaseFrontendRateLimit + "foo." + label.SuffixRateLimitAverage: aws.String("12"), + label.Prefix + label.BaseFrontendRateLimit + "foo." + label.SuffixRateLimitBurst: aws.String("18"), + label.Prefix + label.BaseFrontendRateLimit + "bar." + label.SuffixRateLimitPeriod: aws.String("3"), + label.Prefix + label.BaseFrontendRateLimit + "bar." + label.SuffixRateLimitAverage: aws.String("6"), + label.Prefix + label.BaseFrontendRateLimit + "bar." + label.SuffixRateLimitBurst: aws.String("9"), + }}, + machine: &machine{ + state: ec2.InstanceStateNameRunning, + privateIP: "10.0.0.1", + port: 1337, + }, + }, + { + Name: "testing-instance-v2", + ID: "6", + containerDefinition: &ecs.ContainerDefinition{ + DockerLabels: map[string]*string{ + label.TraefikPort: aws.String("555"), + label.TraefikProtocol: aws.String("https"), + label.TraefikWeight: aws.String("15"), + + label.TraefikBackend: aws.String("foobar"), + + label.TraefikBackendCircuitBreakerExpression: aws.String("NetworkErrorRatio() > 0.5"), + label.TraefikBackendHealthCheckScheme: aws.String("http"), + label.TraefikBackendHealthCheckPath: aws.String("/health"), + label.TraefikBackendHealthCheckPort: aws.String("880"), + label.TraefikBackendHealthCheckInterval: aws.String("6"), + label.TraefikBackendHealthCheckHostname: aws.String("bar.com"), + label.TraefikBackendHealthCheckHeaders: aws.String("Foo:bar || Bar:foo"), + label.TraefikBackendLoadBalancerMethod: aws.String("drr"), + label.TraefikBackendLoadBalancerSticky: aws.String("true"), + label.TraefikBackendLoadBalancerStickiness: aws.String("true"), + label.TraefikBackendLoadBalancerStickinessCookieName: aws.String("chocolate"), + label.TraefikBackendMaxConnAmount: aws.String("666"), + label.TraefikBackendMaxConnExtractorFunc: aws.String("client.ip"), + label.TraefikBackendBufferingMaxResponseBodyBytes: aws.String("10485760"), + label.TraefikBackendBufferingMemResponseBodyBytes: aws.String("2097152"), + label.TraefikBackendBufferingMaxRequestBodyBytes: aws.String("10485760"), + label.TraefikBackendBufferingMemRequestBodyBytes: aws.String("2097152"), + label.TraefikBackendBufferingRetryExpression: aws.String("IsNetworkError() && Attempts() <= 2"), + + label.TraefikFrontendAuthBasic: aws.String("test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/,test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"), + label.TraefikFrontendEntryPoints: aws.String("http,https"), + label.TraefikFrontendPassHostHeader: aws.String("true"), + label.TraefikFrontendPassTLSCert: aws.String("true"), + label.TraefikFrontendPriority: aws.String("666"), + label.TraefikFrontendRedirectEntryPoint: aws.String("https"), + label.TraefikFrontendRedirectRegex: aws.String("nope"), + label.TraefikFrontendRedirectReplacement: aws.String("nope"), + label.TraefikFrontendRedirectPermanent: aws.String("true"), + label.TraefikFrontendRule: aws.String("Host:traefik.io"), + label.TraefikFrontendWhiteListSourceRange: aws.String("10.10.10.10"), + label.TraefikFrontendWhiteListUseXForwardedFor: aws.String("true"), + + label.TraefikFrontendRequestHeaders: aws.String("Access-Control-Allow-Methods:POST,GET,OPTIONS || Content-type: application/json; charset=utf-8"), + label.TraefikFrontendResponseHeaders: aws.String("Access-Control-Allow-Methods:POST,GET,OPTIONS || Content-type: application/json; charset=utf-8"), + label.TraefikFrontendSSLProxyHeaders: aws.String("Access-Control-Allow-Methods:POST,GET,OPTIONS || Content-type: application/json; charset=utf-8"), + label.TraefikFrontendAllowedHosts: aws.String("foo,bar,bor"), + label.TraefikFrontendHostsProxyHeaders: aws.String("foo,bar,bor"), + label.TraefikFrontendSSLHost: aws.String("foo"), + label.TraefikFrontendCustomFrameOptionsValue: aws.String("foo"), + label.TraefikFrontendContentSecurityPolicy: aws.String("foo"), + label.TraefikFrontendPublicKey: aws.String("foo"), + label.TraefikFrontendReferrerPolicy: aws.String("foo"), + label.TraefikFrontendCustomBrowserXSSValue: aws.String("foo"), + label.TraefikFrontendSTSSeconds: aws.String("666"), + label.TraefikFrontendSSLForceHost: aws.String("true"), + label.TraefikFrontendSSLRedirect: aws.String("true"), + label.TraefikFrontendSSLTemporaryRedirect: aws.String("true"), + label.TraefikFrontendSTSIncludeSubdomains: aws.String("true"), + label.TraefikFrontendSTSPreload: aws.String("true"), + label.TraefikFrontendForceSTSHeader: aws.String("true"), + label.TraefikFrontendFrameDeny: aws.String("true"), + label.TraefikFrontendContentTypeNosniff: aws.String("true"), + label.TraefikFrontendBrowserXSSFilter: aws.String("true"), + label.TraefikFrontendIsDevelopment: aws.String("true"), + + label.Prefix + label.BaseFrontendErrorPage + "foo." + label.SuffixErrorPageStatus: aws.String("404"), + label.Prefix + label.BaseFrontendErrorPage + "foo." + label.SuffixErrorPageBackend: aws.String("foobar"), + label.Prefix + label.BaseFrontendErrorPage + "foo." + label.SuffixErrorPageQuery: aws.String("foo_query"), + label.Prefix + label.BaseFrontendErrorPage + "bar." + label.SuffixErrorPageStatus: aws.String("500,600"), + label.Prefix + label.BaseFrontendErrorPage + "bar." + label.SuffixErrorPageBackend: aws.String("foobar"), + label.Prefix + label.BaseFrontendErrorPage + "bar." + label.SuffixErrorPageQuery: aws.String("bar_query"), + + label.TraefikFrontendRateLimitExtractorFunc: aws.String("client.ip"), + label.Prefix + label.BaseFrontendRateLimit + "foo." + label.SuffixRateLimitPeriod: aws.String("6"), + label.Prefix + label.BaseFrontendRateLimit + "foo." + label.SuffixRateLimitAverage: aws.String("12"), + label.Prefix + label.BaseFrontendRateLimit + "foo." + label.SuffixRateLimitBurst: aws.String("18"), + label.Prefix + label.BaseFrontendRateLimit + "bar." + label.SuffixRateLimitPeriod: aws.String("3"), + label.Prefix + label.BaseFrontendRateLimit + "bar." + label.SuffixRateLimitAverage: aws.String("6"), + label.Prefix + label.BaseFrontendRateLimit + "bar." + label.SuffixRateLimitBurst: aws.String("9"), + }}, + machine: &machine{ + state: ec2.InstanceStateNameRunning, + privateIP: "10.2.2.1", + port: 1337, + }, + }, + }, + expected: &types.Configuration{ + Backends: map[string]*types.Backend{ + "backend-foobar": { + Servers: map[string]types.Server{ + "server-testing-instance-v1-6": { + URL: "https://10.0.0.1:666", + Weight: 12, + }, + "server-testing-instance-v2-6": { + URL: "https://10.2.2.1:555", + Weight: 15, + }, + }, + CircuitBreaker: &types.CircuitBreaker{ + Expression: "NetworkErrorRatio() > 0.5", + }, + LoadBalancer: &types.LoadBalancer{ + Method: "drr", + Sticky: true, + Stickiness: &types.Stickiness{ + CookieName: "chocolate", + }, + }, + MaxConn: &types.MaxConn{ + Amount: 666, + ExtractorFunc: "client.ip", + }, + HealthCheck: &types.HealthCheck{ + Scheme: "http", + Path: "/health", + Port: 880, + Interval: "6", + Hostname: "foo.com", + Headers: map[string]string{ + "Foo": "bar", + "Bar": "foo", + }, + }, + Buffering: &types.Buffering{ + MaxResponseBodyBytes: 10485760, + MemResponseBodyBytes: 2097152, + MaxRequestBodyBytes: 10485760, + MemRequestBodyBytes: 2097152, + RetryExpression: "IsNetworkError() && Attempts() <= 2", + }, + }, + }, + Frontends: map[string]*types.Frontend{ + "frontend-foobar": { + EntryPoints: []string{ + "http", + "https", + }, + Backend: "backend-foobar", + Routes: map[string]types.Route{ + "route-frontend-foobar": { Rule: "Host:traefik.io", }, }, diff --git a/provider/ecs/deprecated_config.go b/provider/ecs/deprecated_config.go index 8407d73f1..8fe7ad02b 100644 --- a/provider/ecs/deprecated_config.go +++ b/provider/ecs/deprecated_config.go @@ -5,6 +5,7 @@ import ( "strings" "text/template" + "github.com/BurntSushi/ty/fun" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/ec2" "github.com/containous/traefik/log" @@ -17,11 +18,12 @@ import ( func (p *Provider) buildConfigurationV1(instances []ecsInstance) (*types.Configuration, error) { services := make(map[string][]ecsInstance) for _, instance := range instances { + backendName := getBackendNameV1(instance) if p.filterInstanceV1(instance) { - if serviceInstances, ok := services[instance.Name]; ok { - services[instance.Name] = append(serviceInstances, instance) + if serviceInstances, ok := services[backendName]; ok { + services[backendName] = append(serviceInstances, instance) } else { - services[instance.Name] = []ecsInstance{instance} + services[backendName] = []ecsInstance{instance} } } } @@ -42,7 +44,7 @@ func (p *Provider) buildConfigurationV1(instances []ecsInstance) (*types.Configu "getHealthCheckInterval": getFuncFirstStringValueV1(label.TraefikBackendHealthCheckInterval, ""), // Frontend functions - "filterFrontends": filterFrontends, + "filterFrontends": filterFrontendsV1, "getFrontendRule": p.getFrontendRule, "getPassHostHeader": getFuncBoolValueV1(label.TraefikFrontendPassHostHeader, label.DefaultPassHostHeader), "getPassTLSCert": getFuncBoolValueV1(label.TraefikFrontendPassTLSCert, label.DefaultPassTLSCert), @@ -58,6 +60,26 @@ func (p *Provider) buildConfigurationV1(instances []ecsInstance) (*types.Configu }) } +// Deprecated +func getBackendNameV1(i ecsInstance) string { + return getStringValueV1(i, label.TraefikBackend, i.Name) +} + +// Deprecated +func filterFrontendsV1(instances []ecsInstance) []ecsInstance { + byName := make(map[string]struct{}) + + return fun.Filter(func(i ecsInstance) bool { + backendName := getBackendName(i) + _, found := byName[backendName] + if !found { + byName[backendName] = struct{}{} + } + return !found + }, instances).([]ecsInstance) +} + +// Deprecated func (p *Provider) filterInstanceV1(i ecsInstance) bool { if i.machine == nil { log.Debug("Filtering ecs instance with nil machine") diff --git a/provider/ecs/deprecated_config_test.go b/provider/ecs/deprecated_config_test.go index 8f9bfbd5f..3f8267673 100644 --- a/provider/ecs/deprecated_config_test.go +++ b/provider/ecs/deprecated_config_test.go @@ -148,7 +148,7 @@ func TestBuildConfigurationV1(t *testing.T) { }, expected: &types.Configuration{ Backends: map[string]*types.Backend{ - "backend-testing-instance": { + "backend-foobar": { Servers: map[string]types.Server{ "server-testing-instance6": { URL: "https://10.0.0.1:666", @@ -169,14 +169,124 @@ func TestBuildConfigurationV1(t *testing.T) { }, }, Frontends: map[string]*types.Frontend{ - "frontend-testing-instance": { + "frontend-foobar": { EntryPoints: []string{ "http", "https", }, - Backend: "backend-testing-instance", + Backend: "backend-foobar", Routes: map[string]types.Route{ - "route-frontend-testing-instance": { + "route-frontend-foobar": { + Rule: "Host:traefik.io", + }, + }, + PassHostHeader: true, + Priority: 666, + BasicAuth: []string{ + "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/", + "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0", + }, + }, + }, + }, + }, { + desc: "Containers with same backend name", + instances: []ecsInstance{ + { + Name: "testing-instance", + ID: "6", + containerDefinition: &ecs.ContainerDefinition{ + DockerLabels: map[string]*string{ + label.TraefikPort: aws.String("666"), + label.TraefikProtocol: aws.String("https"), + label.TraefikWeight: aws.String("12"), + + label.TraefikBackend: aws.String("foobar"), + + label.TraefikBackendHealthCheckPath: aws.String("/health"), + label.TraefikBackendHealthCheckInterval: aws.String("6"), + label.TraefikBackendLoadBalancerMethod: aws.String("drr"), + label.TraefikBackendLoadBalancerSticky: aws.String("true"), + label.TraefikBackendLoadBalancerStickiness: aws.String("true"), + label.TraefikBackendLoadBalancerStickinessCookieName: aws.String("chocolate"), + + label.TraefikFrontendAuthBasic: aws.String("test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/,test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"), + label.TraefikFrontendEntryPoints: aws.String("http,https"), + label.TraefikFrontendPassHostHeader: aws.String("true"), + label.TraefikFrontendPriority: aws.String("666"), + label.TraefikFrontendRule: aws.String("Host:traefik.io"), + }}, + machine: &machine{ + state: ec2.InstanceStateNameRunning, + privateIP: "10.0.0.1", + port: 1337, + }, + }, { + Name: "testing-instance-v2", + ID: "6", + containerDefinition: &ecs.ContainerDefinition{ + DockerLabels: map[string]*string{ + label.TraefikPort: aws.String("555"), + label.TraefikProtocol: aws.String("https"), + label.TraefikWeight: aws.String("12"), + + label.TraefikBackend: aws.String("foobar"), + + label.TraefikBackendHealthCheckPath: aws.String("/health"), + label.TraefikBackendHealthCheckInterval: aws.String("6"), + label.TraefikBackendLoadBalancerMethod: aws.String("drr"), + label.TraefikBackendLoadBalancerSticky: aws.String("true"), + label.TraefikBackendLoadBalancerStickiness: aws.String("true"), + label.TraefikBackendLoadBalancerStickinessCookieName: aws.String("chocolate"), + + label.TraefikFrontendAuthBasic: aws.String("test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/,test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"), + label.TraefikFrontendEntryPoints: aws.String("http,https"), + label.TraefikFrontendPassHostHeader: aws.String("true"), + label.TraefikFrontendPriority: aws.String("666"), + label.TraefikFrontendRule: aws.String("Host:traefik.io"), + }}, + machine: &machine{ + state: ec2.InstanceStateNameRunning, + privateIP: "10.0.0.2", + port: 1337, + }, + }, + }, + expected: &types.Configuration{ + Backends: map[string]*types.Backend{ + "backend-foobar": { + Servers: map[string]types.Server{ + "server-testing-instance6": { + URL: "https://10.0.0.1:666", + Weight: 12, + }, + "server-testing-instance-v26": { + URL: "https://10.0.0.2:555", + Weight: 12, + }, + }, + LoadBalancer: &types.LoadBalancer{ + Method: "drr", + Sticky: true, + Stickiness: &types.Stickiness{ + CookieName: "chocolate", + }, + }, + HealthCheck: &types.HealthCheck{ + Path: "/health", + Interval: "6", + }, + }, + }, + Frontends: map[string]*types.Frontend{ + "frontend-foobar": { + EntryPoints: []string{ + "http", + "https", + }, + Backend: "backend-foobar", + Routes: map[string]types.Route{ + "route-frontend-foobar": { Rule: "Host:traefik.io", }, }, diff --git a/templates/ecs-v1.tmpl b/templates/ecs-v1.tmpl index e8b33c3f6..edb16643b 100644 --- a/templates/ecs-v1.tmpl +++ b/templates/ecs-v1.tmpl @@ -16,7 +16,7 @@ {{end}} {{range $index, $i := $instances }} - [backends."backend-{{ $i.Name }}".servers."server-{{ $i.Name }}{{ $i.ID }}"] + [backends."backend-{{ $serviceName }}".servers."server-{{ $i.Name }}{{ $i.ID }}"] url = "{{ getProtocol $i }}://{{ getHost $i }}:{{ getPort $i }}" weight = {{ getWeight $i }} {{end}}