При использовании лямбды для генерации атрибутов elbv2 (в частности, имени) при получении ошибки от лямбды это имя длиннее 32 символов - PullRequest
0 голосов
/ 05 ноября 2018

Я создаю шаблон CloudFormation, который использует функцию Lambda для генерации имени балансировщика нагрузки, созданного шаблоном.

При запуске функции происходит сбой со следующей ошибкой:

Не удалось проверить атрибуты ELB arn: aws-us-gov: эластичная балансировка нагрузки: us-gov-west-1: 273838691273: loadbalancer / app / dev-fu-WALB-18VHO2DJ4MHK / c69c48fd3464de01. Произошла ошибка (ValidationError) при вызове операции DescribeLoadBalancers: имя балансировщика нагрузки 'arn: aws-us-gov: эластичное распределение нагрузки: us-gov-west-1: 273838691273: loadbalancer / app / dev-fu-WALB-18VHO2DJ4MHK / c69c48f34 'не может быть длиннее 32 символов.

Это явно тянет арн, а не имя elbv2.

Я открыл билет с AWS безрезультатно, а также с компанией, которая написала сценарий ... те же результаты.

Я приложил скрипт, и любая помощь очень ценится.

import cfn_resource
import boto3
import boto3.session
import logging

logger = logging.getLogger()
handler = cfn_resource.Resource()

# Retrieves DNSName and source security group name for the specified ELB
@handler.create
def get_elb_attribtes(event, context):
    properties = event['ResourceProperties']
    elb_name = properties['PORALBName']
    elb_template = properties['PORALBTemplate']
    elb_subnets = properties['PORALBSubnets']

    try:
        client = boto3.client('elbv2')

        elb = client.describe_load_balancers(
            Names=[
                elb_name
            ]
        )['LoadBalancers'][0]

        for az in elb['AvailabilityZones']:
            if not az['SubnetId'] in elb_subnets:
                raise Exception("ELB does not include VPC subnet '" + az['SubnetId'] + "'.")


        target_groups = client.describe_target_groups(
            LoadBalancerArn=elb['LoadBalancerArn']
        )['TargetGroups']

        target_group_arns = []

        for target_group in target_groups:
            target_group_arns.append(target_group['TargetGroupArn'])

        if elb_template == 'geoevent':
            if elb['Type'] != 'network':
                raise Exception("GeoEvent Server requires network ElasticLoadBalancer V2.")

        response_data = {}

        response_data['DNSName'] = elb['DNSName']
        response_data['TargetGroupARNs'] = target_group_arns

        msg = 'ELB {} found.'.format(elb_name)

        logger.info(msg)

        return {
            'Status': 'SUCCESS',
            'Reason': msg,
            'PhysicalResourceId': context.log_stream_name,
            'StackId': event['StackId'],
            'RequestId': event['RequestId'],
            'LogicalResourceId': event['LogicalResourceId'],
            'Data': response_data
        }
    except Exception, e:
        error_msg = 'Failed to validate attributes of ELB {}. {}'.format(elb_name, e)

        logger.error(error_msg)

        return {
            'Status': 'FAILED',
            'Reason': error_msg,
            'PhysicalResourceId': context.log_stream_name,
            'StackId': event['StackId'],
            'RequestId': event['RequestId'],
            'LogicalResourceId': event['LogicalResourceId']
        }

1 Ответ

0 голосов
/ 05 ноября 2018

Ошибка говорит:

Произошла ошибка (ValidationError) при вызове операции DescribeLoadBalancers

Итак, глядя на то, где он звонит DescribeLoadBalancers:

    elb = client.describe_load_balancers(
        Names=[
            elb_name
        ]
    )['LoadBalancers'][0]

В ошибке также сказано:

Имя балансировщика нагрузки ... не может быть длиннее 32 символов.

Название происходит от:

properties = event['ResourceProperties']
elb_name = properties['PORALBName']

Итак, информация передается в функцию Lambda через event. Это происходит от того, что вызывает лямбда-функцию. Итак, вам нужно выяснить, что вызывает функцию, и выяснить, какую информацию она фактически отправляет. Ваша проблема находится за пределами указанного кода.

Другие опции

В своем коде вы можете отправить event в журналы отладки (например, print (event)) и посмотреть, передают ли они имя ELB в другом поле.

Кроме того, вы можете вызвать describe_load_balancers без фильтра Name, чтобы получить список всех балансировщиков нагрузки, а затем использовать ARN (что у вас есть), чтобы найти интересующий балансировщик нагрузки. Просто прокрутите все результаты, пока не найдете тот, который соответствует ARN, который у вас есть. Затем продолжайте как обычно.

...