@wanews/pulumi-wait-for-ecs-deploy v0.3.1
wait-for-ecs-deploy
Provides a pulumi resource which waits for an ECS deployment to complete. Once the deployment completes, it checks whether the deployment was successful.
If a deployment error is detected, a pulumi error is raised.
Usage
This module requires an ECS service with circuit breaker enabled.
import * as aws from '@pulumi/aws'
import { WaitForEcsDeployment } from '@wanews/pulumi-wait-for-ecs-deploy'
const cluster = new aws.ecs.Cluster('cluster', {
//...
})
const taskDef = new aws.ecs.TaskDefinition('taskDef', {
//...
})
const service = new aws.ecs.Service('service', {
cluster: cluster.arn,
taskDefinition: taskDef.arn,
deploymentController: {
type: 'ECS',
},
deploymentCircuitBreaker: {
enable: true,
rollback: true,
},
})
const deployment = new WaitForEcsDeployment('wait-for-deployment', {
clusterName: cluster.name,
serviceName: service.name,
desiredTaskDef: taskDef.arn,
awsRegion: 'ap-southeast-2', // optional
assumeRole: 'arn:aws:iam::12345678:role/myRole', // optional
})
pulumi.all([d.status, d.failureMessage]).apply(([status, failureMessage]) => {
console.log(`deployment completed with status ${status}: ${failureMessage}`)
})The WaitForEcsDeployment resource will wait for the ECS deployment to complete, and then return status to COMPLETE or FAILED.
By default, it will fail after three minutes and treat the deployment as failed.
Known issues
- Some failure modes are not yet supported by circuit breakers. This includes tasks that fail to launch (eg
CMD /bin/false). However, since they never become healthy, the deployment never succeeds. This module includes a timeout (default: 3 minutes); once the timeout is reached, a deployment is treated as failed.
Tests
Run yarn nx test wait-for-ecs-deploy to execute the unit tests via Jest.
These tests use
Under the hood
Each ECS service has two deployments:
ACTIVE: if a deployment is in progress, this is the deploymentPRIMARY: this is the deployment currently receiving traffic
When ecs.CreateService or ecs.UpdateService is called:
- a new deployment is created
- each task in the
PRIMARYdeployment is replaced by a new task in theACTIVEdeployment - once the new task becomes healthy, the task in
PRIMARYis torn down - finally, once all tasks are replaced, the
ACTIVEdeployment becomes the newPRIMARYdeployment.
If a new task does not become healthy at step 3, then it is deleted and recreated. By default, this happends undefinitely until a replacement task becomes healthy. However, if circuit breaker is enabled, then when too many tasks fail to become healthy, then the ACTIVE deployment is stopped. If rollback is enabled, the last healthy deployment is re-deployed.
This module uses ecs.DescribeServices to detect errors that occur during a deployment.
A successful deployment is where all deployments are COMPLETED:
{
"services": [
{
"deployments": [
{
"status": "PRIMARY",
"taskDefinition": "arn:aws:ecs:ap-southeast-2:291971919224:task-definition/news-thewest-pr713-web-app-task-definition:3",
"rolloutState": "COMPLETED",
"rolloutStateReason": "ECS deployment ecs-svc/6405940160831029548 completed."
}
]
}
]
}A failed deployment has rolloutState: FAILED:
{
"services": [
{
"deployments": [
{
"status": "ACTIVE",
"taskDefinition": "arn:aws:ecs:ap-southeast-2:291971919224:task-definition/news-thewest-pr713-web-app-task-definition:3",
"rolloutState": "FAILED",
"rolloutStateReason": "ECS deployment circuit breaker: tasks failed to start."
}
]
}
]
}If rollbacks are enabled, it will also show the task is being rolled back:
{
"services": [
{
"deployments": [
{
"status": "PRIMARY",
"taskDefinition": "arn:aws:ecs:ap-southeast-2:291971919224:task-definition/news-thewest-pr713-web-app-task-definition:2",
"rolloutState": "IN_PROGRESS",
"rolloutStateReason": "ECS deployment circuit breaker: rolling back to deploymentId ecs-svc/6405940160831029548."
},
{
"status": "ACTIVE",
"taskDefinition": "arn:aws:ecs:ap-southeast-2:291971919224:task-definition/news-thewest-pr713-web-app-task-definition:3",
"rolloutState": "IN_PROGRESS",
"rolloutStateReason": "ECS deployment ecs-svc/1281894607538416024 in progress."
}
]
}
]
}Once the rollback is complete, it will show that the previous version is once again the PRIMARY deployment:
{
"services": [
{
"deployments": [
{
"status": "PRIMARY",
"taskDefinition": "arn:aws:ecs:ap-southeast-2:291971919224:task-definition/news-thewest-pr713-web-app-task-definition:2",
"rolloutState": "COMPLETED",
"rolloutStateReason": "ECS deployment ecs-svc/6405940160831029548 completed."
}
]
}
]
}However, the rollback can be detected by examining the taskDefinition in the deployment; in this case, revision 3 was deployed, but the last successful deployment is revision 2.