def lambda_handler()

in blogs/ecs-canary-deployments-pipeline/shared_stack/lambda_functions/start_canary/main.py [0:0]


def lambda_handler(event, _context):
    """ Main handler. """

    if event['deployment']['new_version'] == 1:
        LOGGER.info("Detected its first revision of the app, hence settings weight to 100.")
        try:
            if event['Protocol'].lower() == 'http':
                spec={
                    'httpRoute': {
                        'action': {
                            'weightedTargets': [
                                {
                                    'virtualNode': event['MicroserviceName']+'-'+event['Sha'],
                                    'weight': 100
                                },
                            ]
                        },
                        "match": {
                                    "prefix": "/"
                                },
                        'retryPolicy': {
                            'httpRetryEvents': [
                                'server-error',
                                'client-error',
                                'gateway-error'
                            ],
                            'maxRetries': 2,
                            'perRetryTimeout': {
                                'unit': 'ms',
                                'value': 2000
                            }
                        }
                    }
                }
            else:
                spec={
                    'tcpRoute': {
                        'action': {
                            'weightedTargets': [
                                {
                                    'virtualNode': event['MicroserviceName']+'-'+event['Sha'],
                                    'weight': 100
                                },
                            ]
                        },
                        'timeout': {
                            'idle': {
                                'unit': 'ms',
                                'value': 2000
                            }
                        }
                    }
                }

            APPMESH_CLIENT.create_route(
                meshName=event['EnvironmentName'],
                routeName=event['MicroserviceName']+'-'+'route',
                spec=spec,
                virtualRouterName=event['MicroserviceName']+'-'+'vr'
            )
            return {
                    "new_vn_weight": 100
                }
        except ClientError as ex:
            LOGGER.error("Exception occured during creating a route for initial deployment")
            raise ex
    else:
        LOGGER.info("Executing the subsequent deployments")
        route = event['Protocol']+'Route'
        entries = APPMESH_CLIENT.describe_route(
            meshName=event['EnvironmentName'],
            routeName=event['MicroserviceName']+'-'+'route',
            virtualRouterName=event['MicroserviceName']+'-'+'vr'
        )['route']['spec'][route]['action']['weightedTargets']
        print(entries)
        for entry in entries:
            if entry['weight'] == 100:
                current_vn = entry['virtualNode']
                current_vn_weight = 100-int(event['PercentageStep'])
                current_vn_sha = entry['virtualNode'].split('-')[-1]
                new_vn_weight = 0+int(event['PercentageStep'])
                new_vn = event['MicroserviceName']+'-'+event['Sha']

                if _perform_canary(event, current_vn_weight, new_vn_weight, current_vn, new_vn):
                    LOGGER.info("Performing the Canary, new virtualNode weight is %s", new_vn_weight)
                    return {
                            "new_vn_weight":new_vn_weight,
                            "current_vn_weight":current_vn_weight,
                            "current_vn_sha":current_vn_sha
                        }
                else:
                    return {
                        "status":"FAIL"
                    }
            else:
                if entry['virtualNode'].endswith(event['Sha']):
                    new_vn_weight = 100 if (entry['weight']+int(event['PercentageStep'])) > 100 else (entry['weight']+int(event['PercentageStep']))
                    new_vn = entry['virtualNode']
                    current_vn_weight = 0 if (int(event['canary_results']['current_vn_weight'])-int(event['PercentageStep'])) < 0  else (int(event['canary_results']['current_vn_weight'])-int(event['PercentageStep']))
                    current_vn = event['MicroserviceName']+'-'+event['canary_results']['current_vn_sha']
                    if _perform_canary(event, current_vn_weight, new_vn_weight, current_vn, new_vn):
                        LOGGER.info("Performing the Canary, new virtualNode weight is %s", new_vn_weight)
                        return {
                            "new_vn_weight":new_vn_weight,
                            "current_vn_weight":current_vn_weight,
                            "current_vn_sha":event['canary_results']['current_vn_sha']
                        }
                    else:
                        return {
                            "status":"FAIL"
                        }