Amazon ECS Scheduler Driver

The Amazon EC2 Container Service (Amazon ECS) Scheduler Driver is an initial proof of concept of how we could start integrating Apache Mesos with ECS. This proof of concept demonstrates how Mesos schedulers (frameworks) could schedule workloads on ECS. It demonstrates the potential for Amazon ECS to integrate with the Mesos ecosystem, which would allow you to use Mesos schedulers like Marathon and Chronos to launch tasks on Amazon ECS. This is an example of what can be done with Amazon ECS, and is not recommended for production use. We are working with the Mesos community to develop a more robust integration between Apache Mesos and Amazon ECS.

Building

Run mvn package in the root directory, a jar will be produced in the target/ directory.

Alternatively, run mvn install to install the package to your local Maven repository.

Integrating with a Mesos scheduler

If you followed the instructions to mvn install above, you should be able to modify the dependencies of your project to depend on

<groupId>com.amazonaws</groupId>
<artifactId>amazon-ecs-scheduler-driver</artifactId>
<version>0.1</version>

If you are planning to use the .jar file instead, you'll need to ensure it is on the classpath of your Scheduler and instead add an AWS SDK dependency to the scheduler.

Finally, you'll need to modify the instantiation of the MesosSchedulerDriver in whichever scheduler you're using to instead instantiate the ECSSchedulerDriver instead.

Using your Amazon ECS powered Mesos Scheduler

The ECSSchedulerDriver will interpret the command typically given when scheduling jobs with Mesos and instead interpret this as your TaskDefinition family:revision. For example, if Chronos or Marathon are given the command=sleep360:1, a TaskDefinition which sleeps for 5 minutes and then exits, the ECSSchedulerDriver will issue commands to Amazon ECS to run that family:revision.

The ECSSchedulerDriver expects the Task Definition to have been registered already.

Declaring Resource Constraints(CPU, Memory, Ports)

Mesos and Amazon ECS account for resources differently. With Mesos, CPU usage is a floating point number, so if you wanted to run a task which used half of a CPU, you'd ask for cpu=0.5. With Amazon ECS this is typically performed by asking for cpu=512 instead as Amazon ECS gives each cpu 1024 units rather than 1. With the ECSSchedulerDriver you should declare your constraints with the Mesos style of 0.5 meaning half a cpu, and the ECSSchedulerDriver will convert this for you. Be aware, the TaskDefinition resource constraints should be equivalent to what you place in your scheduler. For resources like memory, both systems count in megabytes, and for ports, you would declare the fixed ports that must be reserved.

A Marathon Example

After adding a dependency on the ECSSchedulerDriver and properly instantiating it instead of the MesosScheedulerDriver as stated above, you can begin starting your Marathon managed Amazon ECS tasks. An example Task Definition is below.

aws ecs describe-task-definition --task-definition nginx:2
{
    "taskDefinition": {
        "taskDefinitionArn": "arn:aws:ecs:us-east-1:***:task-definition/nginx:2",
        "containerDefinitions": [
            {
                "environment": [],
                "name": "nginx",
                "image": "nginx",
                "cpu": 100,
                "portMappings": [
                    {
                        "containerPort": 80,
                        "hostPort": 80
                    }
                ],
                "memory": 100,
                "essential": true
            }
        ],
        "family": "nginx",
        "revision": 2
    }
}

In order to run this command, you must use the new Docker portion of Marathon. The Marathon UI, doesn't seem to support this yet, so you'll use the command line and issue a command to the local Marathon. The command below will ask Marathon to keep 1 copy of the nginx:2 task running with matching resource constraints as what exists in the Task Definition. Once created, management of the scaling of this nginx task is done through the Marathon UI.

curl -i -H "Content-Type: application/json" -d '
{
  "id": "nginx",
  "cmd": "nginx:2",
  "cpus": 0.1,
  "mem": 100.0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "ignore",
      "network": "BRIDGE",
      "portMappings": [
        {
          "containerPort":80,
          "hostPort":80
        }
      ]
    }
  }
}
' http://localhost:8080/v2/apps

Additional Configuration

The following environment variables are available to configure your ECSSchedulerDriver. Because it uses the AWS SDK to communicate with Amazon ECS, any configuration for the SDK passed through key files or environment variables can also be used.

Environment Key Example Value(s) Description Default Value
AWS_ECS_CLUSTER clusterName The cluster this ECSSchedulerDriver should manage. default
AWS_ECS_ENDPOINT https://ecs.us-east-1.amazonaws.com The Amazon ECS endpoint to use. https://ecs.us-east-1.amazonaws.com