in lambda/index_get.py [0:0]
def handler(event, context):
LOGGER.debug("Got event " + json.dumps(event))
cluster_id = event['pathParameters']['scalableTargetDimensionId']
LOGGER.info("Getting status for cluster " + cluster_id)
try:
LOGGER.debug("Getting current value of desired size param")
param_name = "DesiredSize-" + cluster_id
r = ssm.get_parameter( Name= param_name)
desired_count = int(r['Parameter']['Value'])
LOGGER.debug("Got current value of desired size param : {0}".format(str(desired_count)))
LOGGER.debug("Getting cluster status")
r = docdb.describe_db_clusters( DBClusterIdentifier=cluster_id)
cluster_info = r['DBClusters'][0]
readers = []
for member in cluster_info['DBClusterMembers']:
member_id = member['DBInstanceIdentifier']
member_type = member['IsClusterWriter']
if member_type == False:
readers.append(member_id)
LOGGER.debug("Found {0} readers".format(str(len(readers))))
LOGGER.debug("Getting cluster instance status")
r = docdb.describe_db_instances(Filters=[{'Name':'db-cluster-id','Values': [cluster_id]}])
instances = r['DBInstances']
num_available = 0
num_pending = 0
num_failed = 0
for i in instances:
instance_id = i['DBInstanceIdentifier']
if instance_id in readers:
instance_status = i['DBInstanceStatus']
if instance_status == 'available':
num_available = num_available + 1
if instance_status in ['creating', 'deleting', 'starting', 'stopping']:
num_pending = num_pending + 1
if instance_status == 'failed':
num_failed = num_failed + 1
LOGGER.debug("Found {0} readers available, {1} pending, and {2} failed".format(str(num_available), str(num_pending), str(num_failed)))
scalingStatus = 'Successful' # Pending, InProgress, Failed
if num_available != desired_count:
scalingStatus = 'Pending'
if num_pending > 0:
scalingStatus = 'InProgress'
if num_failed > 0:
scalingStatus = 'Failed'
LOGGER.info("Scaling status: {0}".format(scalingStatus))
responseBody = {
"actualCapacity": float(num_available),
"desiredCapacity": float(desired_count),
"dimensionName": cluster_id,
"resourceName": cluster_id,
"scalableTargetDimensionId": cluster_id,
"scalingStatus": scalingStatus,
"version": "1.0"
}
response = {
'statusCode': 200,
'headers': {"content-type": "application/json"},
'body': json.dumps(responseBody)
}
LOGGER.debug("Response: " + json.dumps(response))
return response
except Exception as e:
trc = traceback.format_exc()
response = {
'statusCode': 404,
'body': str(e)
}
LOGGER.debug("Response: " + json.dumps(response))
return response