Search code examples
amazon-web-servicesdockeramazon-ec2amazon-ecs

Is it possible to start/stop docker contains on demand in AWS?


I'm trying to deploy a docker image to AWS's Elastic Container Service, and then run this as an EC2 instance (via Fargate). However, I believe I need to specify a minimum of 1 running instance in the TaskDefinition.

What I want to achieve though is basically to be able to spin up this container on demand, as it'll be used infrequently and then shut it down after. So the plan was to start/stop this via a lambda and redirect to the public IP (so within web request timeouts).

I've seen examples of how to do this using EC2, but none actually using Fargate. I don't believe I can define an EC2 task, based off of a docker image (if I can, this might be my solution?).

Does anyone know if it's possible to achieve this? If so could you provide some guidance on how I might approach it, and if you've any CloudFormation examples that would be brilliant.


Solution

  • There is almost not difference in defining ECS task for EC2 or Fargate. Only one difference is networking. With Fargate you have to use awsvpc networking.

    You can use lambda. But there is better idea to achieve your use case.

    To spin exactly one task, you have to set

    • Minimum instances: 0
    • Desired count: 1
    • Max instances: 1 or more

    Autoscaling solution

    However better idea than Lambda is to use Service autoscaling. The ECS Servce autoscaling requires metrics in cloudwatch. So you can push metric to cloudwatch to start task. Then compute your task and on the end of your computation put metrics to stop task.

    Manual solution

    Another solution can be switching desired count to 1 when you want to start task and to 0 when you want to stop task

    References: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-auto-scaling.html