Deploy Amazon ECS services using a third-party controller
The external deployment type allows you to use any
third-party deployment controller for full control over the deployment process for
an Amazon ECS service. The details for your service are managed by either the service
management API actions (CreateService
, UpdateService
, and
DeleteService
) or the task set management API actions
(CreateTaskSet
, UpdateTaskSet
,
UpdateServicePrimaryTaskSet
, and DeleteTaskSet
). Each
API action manages a subset of the service definition parameters.
The UpdateService
API action updates the desired count and health
check grace period parameters for a service. If the launch type, platform version,
load balancer details, network configuration, or task definition need to be updated,
you must create a new task set.
The UpdateTaskSet
API action updates only the scale parameter for a
task set.
The UpdateServicePrimaryTaskSet
API action modifies which task set in
a service is the primary task set. When you call the DescribeServices
API action, it returns all fields specified for a primary task set. If the primary
task set for a service is updated, any task set parameter values that exist on the
new primary task set that differ from the old primary task set in a service are
updated to the new value when a new primary task set is defined. If no primary task
set is defined for a service, when describing the service, the task set fields are
null.
External deployment considerations
Consider the following when using the external deployment type:
-
The supported load balancer types are either an Application Load Balancer or a Network Load Balancer.
-
The Fargate launch type or
EXTERNAL
deployment controller types don't support theDAEMON
scheduling strategy.
External deployment workflow
The following is the basic workflow for managing an external deployment on Amazon ECS.
To manage an Amazon ECS service using an external deployment controller
-
Create an Amazon ECS service. The only required parameter is the service name. You can specify the following parameters when creating a service using an external deployment controller. All other service parameters are specified when creating a task set within the service.
serviceName
-
Type: String
Required: Yes
The name of your service. Up to 255 letters (uppercase and lowercase), numbers, hyphens, and underscores are allowed. Service names must be unique within a cluster, but you can have similarly named services in multiple clusters within a Region or across multiple Regions.
desiredCount
-
The number of instantiations of the specified task set task definition to place and keep running within the service.
deploymentConfiguration
-
Optional deployment parameters that control how many tasks run during a deployment and the ordering of stopping and starting tasks.
-
Type: Array of objects
Required: No
The metadata that you apply to the service to help you categorize and organize them. Each tag consists of a key and an optional value, both of which you define. When a service is deleted, the tags are deleted as well. A maximum of 50 tags can be applied to the service. For more information, see Tagging Amazon ECS resources.
key
-
Type: String
Length Constraints: Minimum length of 1. Maximum length of 128.
Required: No
One part of a key-value pair that make up a tag. A key is a general label that acts like a category for more specific tag values.
value
-
Type: String
Length Constraints: Minimum length of 0. Maximum length of 256.
Required: No
The optional part of a key-value pair that make up a tag. A value acts as a descriptor within a tag category (key).
enableECSManagedTags
-
Specifies whether to use Amazon ECS managed tags for the tasks within the service. For more information, see Use tags for billing.
propagateTags
-
Type: String
Valid values:
TASK_DEFINITION
|SERVICE
Required: No
Specifies whether to copy the tags from the task definition or the service to the tasks in the service. If no value is specified, the tags are not copied. Tags can only be copied to the tasks within the service during service creation. To add tags to a task after service creation or task creation, use the
TagResource
API action. schedulingStrategy
-
The scheduling strategy to use. Services using an external deployment controller support only the
REPLICA
scheduling strategy. placementConstraints
-
An array of placement constraint objects to use for tasks in your service. You can specify a maximum of 10 constraints per task (this limit includes constraints in the task definition and those specified at run time). If you are using the Fargate launch type, task placement constraints aren't supported.
placementStrategy
-
The placement strategy objects to use for tasks in your service. You can specify a maximum of four strategy rules per service.
The following is an example service definition for creating a service using an external deployment controller.
{ "cluster": "", "serviceName": "", "desiredCount": 0, "role": "", "deploymentConfiguration": { "maximumPercent": 0, "minimumHealthyPercent": 0 }, "placementConstraints": [ { "type": "distinctInstance", "expression": "" } ], "placementStrategy": [ { "type": "binpack", "field": "" } ], "schedulingStrategy": "REPLICA", "deploymentController": { "type": "EXTERNAL" }, "tags": [ { "key": "", "value": "" } ], "enableECSManagedTags": true, "propagateTags": "TASK_DEFINITION" }
-
Create an initial task set. The task set contains the following details about your service:
taskDefinition
-
The task definition for the tasks in the task set to use.
launchType
-
Type: String
Valid values:
EC2
|FARGATE
|EXTERNAL
Required: No
The launch type on which to run your service. If a launch type is not specified, the default
capacityProviderStrategy
is used by default. For more information, see Amazon ECS launch types.If a
launchType
is specified, thecapacityProviderStrategy
parameter must be omitted. platformVersion
-
Type: String
Required: No
The platform version on which your tasks in the service are running. A platform version is only specified for tasks using the Fargate launch type. If one is not specified, the latest version (
LATEST
) is used by default.AWS Fargate platform versions are used to refer to a specific runtime environment for the Fargate task infrastructure. When specifying the
LATEST
platform version when running a task or creating a service, you get the most current platform version available for your tasks. When you scale up your service, those tasks receive the platform version that was specified on the service's current deployment. For more information, see Fargate platform versions for Amazon ECS.Note
Platform versions are not specified for tasks using the EC2 launch type.
loadBalancers
-
A load balancer object representing the load balancer to use with your service. When using an external deployment controller, only Application Load Balancers and Network Load Balancers are supported. If you're using an Application Load Balancer, only one Application Load Balancer target group is allowed per task set.
The following snippet shows an example
loadBalancer
object to use."loadBalancers": [ { "targetGroupArn": "", "containerName": "", "containerPort": 0 } ]
Note
When specifying a
loadBalancer
object, you must specify atargetGroupArn
and omit theloadBalancerName
parameters. networkConfiguration
-
The network configuration for the service. This parameter is required for task definitions that use the
awsvpc
network mode to receive their own elastic network interface, and it's not supported for other network modes. For more information about networking for the Fargate launch type, see Amazon ECS task networking options for the Fargate launch type. serviceRegistries
-
The details of the service discovery registries to assign to this service. For more information, see Use service discovery to connect Amazon ECS services with DNS names.
scale
-
A floating-point percentage of the desired number of tasks to place and keep running in the task set. The value is specified as a percent total of a service's
desiredCount
. Accepted values are numbers between 0 and 100.
The following is a JSON example for creating a task set for an external deployment controller.
{ "service": "", "cluster": "", "externalId": "", "taskDefinition": "", "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "" ], "securityGroups": [ "" ], "assignPublicIp": "DISABLED" } }, "loadBalancers": [ { "targetGroupArn": "", "containerName": "", "containerPort": 0 } ], "serviceRegistries": [ { "registryArn": "", "port": 0, "containerName": "", "containerPort": 0 } ], "launchType": "EC2", "capacityProviderStrategy": [ { "capacityProvider": "", "weight": 0, "base": 0 } ], "platformVersion": "", "scale": { "value": null, "unit": "PERCENT" }, "clientToken": "" }
-
When service changes are needed, use the
UpdateService
,UpdateTaskSet
, orCreateTaskSet
API action depending on which parameters you're updating. If you created a task set, use thescale
parameter for each task set in a service to determine how many tasks to keep running in the service. For example, if you have a service that containstasksetA
and you create atasksetB
, you might test the validity oftasksetB
before wanting to transition production traffic to it. You could set thescale
for both task sets to100
, and when you were ready to transition all production traffic totasksetB
, you could update thescale
fortasksetA
to0
to scale it down.