0 votes
1 view
in AWS by (12.8k points)

I'm currently attempting to set up a simple CI that will rebuild my project, create a new docker image, push the new image to an amazon ecr repo, create a new revision of an existing task definition with the latest docker image, update a running service with the new revision of the task definition, and finally stop the existing task running the old revision and start one running the new revision.

Everything is working fine except for starting the new revision of the task.

From a bash script, the final command I call is:

aws ecs update-service --cluster "$CLUSTER" --service "$SERVICE" --task-definition "$TASK_DEFINITION":"$REVISION"

This results in an event error of:

(service rj-api-service) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance bbbc23d5-1a09-45e7-b344-e68cc408e683) is already using a port required by your task.

And this makes sense because the container I am replacing is exactly sthe same as the new one and will be running on the same port, it just contains the latest version of my application.

I was under the impression the update-service command would stop the existing task, and start the new one, but it looks like it starts the new one first, and if it succeeds stops the old one.

What is the best practice for handling this? Should I stop the old task first? Should I just delete the service in my script first and recreate the entire service each update?

Currently I only need 1 instance of the task running, but I don't want to box my self in if I need this to be able to auto scale to multiple instances. Any suggestions on the best way to address this?

1 Answer

0 votes
by (18.6k points)

ECS is trying to allocate your new task revision without actually stopping the current task to avoid any downtime event. That is why you are getting that message.

For this to work seamlessly, you need to have enough free resources in your cluster, so as to maintain and keep the two tasks up and running.

For this, you have two options:

1. You can either Scale up the Cluster by adding new instances. That way you will have enough free resources.

2. or, you can change your service configuration so that it doesn't perform the kind of deployment where the new task is getting allocated without stopping the current task. You can change the configuration so that only one task is allowed at a time.

To change the configurations, you will have to set the following values in their respective fields:

  • Minimum healthy percent: 0
  • Maximum percent: 100
Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...