Add option to keep only healthy ECS tasks
This commit is contained in:
parent
d6b69e1347
commit
df99a9fb57
6 changed files with 63 additions and 26 deletions
|
@ -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 }}`)```_
|
||||
|
|
|
@ -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```)
|
||||
|
|
|
@ -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```)
|
||||
|
|
|
@ -206,6 +206,7 @@
|
|||
accessKeyID = "foobar"
|
||||
secretAccessKey = "foobar"
|
||||
ecsAnywhere = true
|
||||
healthyTasksOnly = true
|
||||
[providers.consul]
|
||||
rootKey = "foobar"
|
||||
endpoints = ["foobar", "foobar"]
|
||||
|
|
|
@ -224,6 +224,7 @@ providers:
|
|||
accessKeyID: foobar
|
||||
secretAccessKey: foobar
|
||||
ecsAnywhere: true
|
||||
healthyTasksOnly: true
|
||||
consul:
|
||||
rootKey: foobar
|
||||
endpoints:
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue