Deploy Amazon ECS services using a third-party controller - Amazon Elastic Container Service

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 the DAEMON 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
  1. 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.


    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.


    The number of instantiations of the specified task set task definition to place and keep running within the service.


    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.


    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.


    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).


    Specifies whether to use Amazon ECS managed tags for the tasks within the service. For more information, see Use tags for billing.


    Type: String


    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.


    The scheduling strategy to use. Services using an external deployment controller support only the REPLICA scheduling strategy.


    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.


    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" }
  2. Create an initial task set. The task set contains the following details about your service:


    The task definition for the tasks in the task set to use.


    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, the capacityProviderStrategy parameter must be omitted.


    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 Linux platform versions for Amazon ECS.


    Platform versions are not specified for tasks using the EC2 launch type.


    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 } ]

    When specifying a loadBalancer object, you must specify a targetGroupArn and omit the loadBalancerName parameters.


    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.


    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.


    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": "" }
  3. When service changes are needed, use the UpdateService, UpdateTaskSet, or CreateTaskSet API action depending on which parameters you're updating. If you created a task set, use the scale 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 contains tasksetA and you create a tasksetB, you might test the validity of tasksetB before wanting to transition production traffic to it. You could set the scale for both task sets to 100, and when you were ready to transition all production traffic to tasksetB, you could update the scale for tasksetA to 0 to scale it down.