diff --git a/docs/content/providers/ecs.md b/docs/content/providers/ecs.md index 31e5e324d..a9d006456 100644 --- a/docs/content/providers/ecs.md +++ b/docs/content/providers/ecs.md @@ -169,6 +169,30 @@ providers: # ... ``` +### `healthyTasksOnly` + +_Optional, Default=false_ + +Determines whether Traefik discovers only healthy tasks (`HEALTHY` healthStatus). + +```yaml tab="File (YAML)" +providers: + ecs: + healthyTasksOnly: true + # ... +``` + +```toml tab="File (TOML)" +[providers.ecs] + healthyTasksOnly = true + # ... +``` + +```bash tab="CLI" +--providers.ecs.healthyTasksOnly=true +# ... +``` + ### `defaultRule` _Optional, Default=```Host(`{{ normalize .Name }}`)```_ diff --git a/docs/content/reference/static-configuration/cli-ref.md b/docs/content/reference/static-configuration/cli-ref.md index d1c60130b..ef9f2a125 100644 --- a/docs/content/reference/static-configuration/cli-ref.md +++ b/docs/content/reference/static-configuration/cli-ref.md @@ -559,13 +559,13 @@ Watch Docker Swarm events. (Default: ```true```) Enable AWS ECS backend with default settings. (Default: ```false```) `--providers.ecs.accesskeyid`: -The AWS credentials access key to use for making requests +AWS credentials access key ID to use for making requests. `--providers.ecs.autodiscoverclusters`: -Auto discover cluster (Default: ```false```) +Auto discover cluster. (Default: ```false```) `--providers.ecs.clusters`: -ECS Clusters name (Default: ```default```) +ECS Cluster names. (Default: ```default```) `--providers.ecs.constraints`: Constraints is an expression that Traefik matches against the container's labels to determine whether to create any route for that container. @@ -574,19 +574,22 @@ Constraints is an expression that Traefik matches against the container's labels Default rule. (Default: ```Host(`{{ normalize .Name }}`)```) `--providers.ecs.ecsanywhere`: -Enable ECS Anywhere support (Default: ```false```) +Enable ECS Anywhere support. (Default: ```false```) `--providers.ecs.exposedbydefault`: -Expose services by default (Default: ```true```) +Expose services by default. (Default: ```true```) + +`--providers.ecs.healthytasksonly`: +Determines whether to discover only healthy tasks. (Default: ```false```) `--providers.ecs.refreshseconds`: -Polling interval (in seconds) (Default: ```15```) +Polling interval (in seconds). (Default: ```15```) `--providers.ecs.region`: -The AWS region to use for requests +AWS region to use for requests. `--providers.ecs.secretaccesskey`: -The AWS credentials access key to use for making requests +AWS credentials access key to use for making requests. `--providers.etcd`: Enable Etcd backend with default settings. (Default: ```false```) diff --git a/docs/content/reference/static-configuration/env-ref.md b/docs/content/reference/static-configuration/env-ref.md index 5b2313d21..18c54f58e 100644 --- a/docs/content/reference/static-configuration/env-ref.md +++ b/docs/content/reference/static-configuration/env-ref.md @@ -559,13 +559,13 @@ Watch Docker Swarm events. (Default: ```true```) Enable AWS ECS backend with default settings. (Default: ```false```) `TRAEFIK_PROVIDERS_ECS_ACCESSKEYID`: -The AWS credentials access key to use for making requests +AWS credentials access key ID to use for making requests. `TRAEFIK_PROVIDERS_ECS_AUTODISCOVERCLUSTERS`: -Auto discover cluster (Default: ```false```) +Auto discover cluster. (Default: ```false```) `TRAEFIK_PROVIDERS_ECS_CLUSTERS`: -ECS Clusters name (Default: ```default```) +ECS Cluster names. (Default: ```default```) `TRAEFIK_PROVIDERS_ECS_CONSTRAINTS`: Constraints is an expression that Traefik matches against the container's labels to determine whether to create any route for that container. @@ -574,19 +574,22 @@ Constraints is an expression that Traefik matches against the container's labels Default rule. (Default: ```Host(`{{ normalize .Name }}`)```) `TRAEFIK_PROVIDERS_ECS_ECSANYWHERE`: -Enable ECS Anywhere support (Default: ```false```) +Enable ECS Anywhere support. (Default: ```false```) `TRAEFIK_PROVIDERS_ECS_EXPOSEDBYDEFAULT`: -Expose services by default (Default: ```true```) +Expose services by default. (Default: ```true```) + +`TRAEFIK_PROVIDERS_ECS_HEALTHYTASKSONLY`: +Determines whether to discover only healthy tasks. (Default: ```false```) `TRAEFIK_PROVIDERS_ECS_REFRESHSECONDS`: -Polling interval (in seconds) (Default: ```15```) +Polling interval (in seconds). (Default: ```15```) `TRAEFIK_PROVIDERS_ECS_REGION`: -The AWS region to use for requests +AWS region to use for requests. `TRAEFIK_PROVIDERS_ECS_SECRETACCESSKEY`: -The AWS credentials access key to use for making requests +AWS credentials access key to use for making requests. `TRAEFIK_PROVIDERS_ETCD`: Enable Etcd backend with default settings. (Default: ```false```) diff --git a/docs/content/reference/static-configuration/file.toml b/docs/content/reference/static-configuration/file.toml index 33297ecc9..20af99cc3 100644 --- a/docs/content/reference/static-configuration/file.toml +++ b/docs/content/reference/static-configuration/file.toml @@ -206,6 +206,7 @@ accessKeyID = "foobar" secretAccessKey = "foobar" ecsAnywhere = true + healthyTasksOnly = true [providers.consul] rootKey = "foobar" endpoints = ["foobar", "foobar"] diff --git a/docs/content/reference/static-configuration/file.yaml b/docs/content/reference/static-configuration/file.yaml index fc9363f85..ba5c35cb9 100644 --- a/docs/content/reference/static-configuration/file.yaml +++ b/docs/content/reference/static-configuration/file.yaml @@ -224,6 +224,7 @@ providers: accessKeyID: foobar secretAccessKey: foobar ecsAnywhere: true + healthyTasksOnly: true consul: rootKey: foobar endpoints: diff --git a/pkg/provider/ecs/ecs.go b/pkg/provider/ecs/ecs.go index 1958723db..fa7d2185a 100644 --- a/pkg/provider/ecs/ecs.go +++ b/pkg/provider/ecs/ecs.go @@ -27,17 +27,18 @@ import ( // Provider holds configurations of the provider. type Provider struct { Constraints string `description:"Constraints is an expression that Traefik matches against the container's labels to determine whether to create any route for that container." json:"constraints,omitempty" toml:"constraints,omitempty" yaml:"constraints,omitempty" export:"true"` - ExposedByDefault bool `description:"Expose services by default" json:"exposedByDefault,omitempty" toml:"exposedByDefault,omitempty" yaml:"exposedByDefault,omitempty" export:"true"` - RefreshSeconds int `description:"Polling interval (in seconds)" json:"refreshSeconds,omitempty" toml:"refreshSeconds,omitempty" yaml:"refreshSeconds,omitempty" export:"true"` + ExposedByDefault bool `description:"Expose services by default." json:"exposedByDefault,omitempty" toml:"exposedByDefault,omitempty" yaml:"exposedByDefault,omitempty" export:"true"` + RefreshSeconds int `description:"Polling interval (in seconds)." json:"refreshSeconds,omitempty" toml:"refreshSeconds,omitempty" yaml:"refreshSeconds,omitempty" export:"true"` DefaultRule string `description:"Default rule." json:"defaultRule,omitempty" toml:"defaultRule,omitempty" yaml:"defaultRule,omitempty"` // Provider lookup parameters. - Clusters []string `description:"ECS Clusters name" json:"clusters,omitempty" toml:"clusters,omitempty" yaml:"clusters,omitempty" export:"true"` - AutoDiscoverClusters bool `description:"Auto discover cluster" json:"autoDiscoverClusters,omitempty" toml:"autoDiscoverClusters,omitempty" yaml:"autoDiscoverClusters,omitempty" export:"true"` - ECSAnywhere bool `description:"Enable ECS Anywhere support" json:"ecsAnywhere,omitempty" toml:"ecsAnywhere,omitempty" yaml:"ecsAnywhere,omitempty" export:"true"` - Region string `description:"The AWS region to use for requests" json:"region,omitempty" toml:"region,omitempty" yaml:"region,omitempty" export:"true"` - AccessKeyID string `description:"The AWS credentials access key to use for making requests" json:"accessKeyID,omitempty" toml:"accessKeyID,omitempty" yaml:"accessKeyID,omitempty" loggable:"false"` - SecretAccessKey string `description:"The AWS credentials access key to use for making requests" json:"secretAccessKey,omitempty" toml:"secretAccessKey,omitempty" yaml:"secretAccessKey,omitempty" loggable:"false"` + Clusters []string `description:"ECS Cluster names." json:"clusters,omitempty" toml:"clusters,omitempty" yaml:"clusters,omitempty" export:"true"` + AutoDiscoverClusters bool `description:"Auto discover cluster." json:"autoDiscoverClusters,omitempty" toml:"autoDiscoverClusters,omitempty" yaml:"autoDiscoverClusters,omitempty" export:"true"` + HealthyTasksOnly bool `description:"Determines whether to discover only healthy tasks." json:"healthyTasksOnly,omitempty" toml:"healthyTasksOnly,omitempty" yaml:"healthyTasksOnly,omitempty" export:"true"` + ECSAnywhere bool `description:"Enable ECS Anywhere support." json:"ecsAnywhere,omitempty" toml:"ecsAnywhere,omitempty" yaml:"ecsAnywhere,omitempty" export:"true"` + Region string `description:"AWS region to use for requests." json:"region,omitempty" toml:"region,omitempty" yaml:"region,omitempty" export:"true"` + AccessKeyID string `description:"AWS credentials access key ID to use for making requests." json:"accessKeyID,omitempty" toml:"accessKeyID,omitempty" yaml:"accessKeyID,omitempty" loggable:"false"` + SecretAccessKey string `description:"AWS credentials access key to use for making requests." json:"secretAccessKey,omitempty" toml:"secretAccessKey,omitempty" yaml:"secretAccessKey,omitempty" loggable:"false"` defaultRuleTpl *template.Template } @@ -81,6 +82,7 @@ var ( func (p *Provider) SetDefaults() { p.Clusters = []string{"default"} p.AutoDiscoverClusters = false + p.HealthyTasksOnly = false p.ExposedByDefault = true p.RefreshSeconds = 15 p.DefaultRule = DefaultTemplateRule @@ -258,9 +260,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 p.HealthyTasksOnly && aws.StringValue(t.HealthStatus) != ecs.HealthStatusHealthy { + logger.Debugf("Skipping unhealthy task %s", aws.StringValue(t.TaskArn)) + continue } + + tasks[aws.StringValue(t.TaskArn)] = t } } }