Post

Using the AWS waiter

Using the waiter to wait for something to happen in your lambda

The AWS SDK provides a number of waiters that allow you to block your code while waiting for a process to complete. One that we make use of in our managed ECS container rollout is the services_stable waiter. This will wait for a defined amount of time for an ECS service to become stable, or raise an exception.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# bring in the boto3 import
import boto3
import botocore

# create a session object
session = boto3.session.Session()

# create an ECS client
ecs = session.client('ecs')

# trigger an update to the service
ecs.update_service(cluster='myCluster',
  service='myService',
  taskDefinition='myServiceTaskDefinition:10')

# create a waiter
waiter = ecs.get_waiter('services_stable')

try:
	logger.info('waiting for myService to become stable')

	# call the wait method passing in an array of services you want to wait for
	waiter.wait(cluster='myCluster', services=['myService'])

except botocore.exceptions.WaitError as wex:
	logger.error('The service 'myService' didn't become stable. {}'.format(wex))

The Boto3 documentation has the available waiters for each service that supports them, for example the ecs waiters can be found here

By default, the ServicesStable waiter will check every 15 seconds for 40 attempts. You can pass overrides into the wait call if required;

1
2
3
waiter.wait(cluster_name='myCluster',
						services=['myService'],
					  WaiterConfig={'Delay': 30, 'MaxAttempts': 10})

This will wait for 5 minutes (300 seconds) for the service to become stable before throwing a botocore.exceptions.WaitError if not successful.

If you’re waiting for a large number of services, its worth noting that you can only pass 10 services at a time, so you’ll need to chunk them.

This post is licensed under CC BY 4.0 by the author.