Как получить выборочный элемент, когда AWS :: CustomResource имеет вывод типа списка - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь создать пользовательский ресурс AWS в шаблоне Cloudformation для получения DNS-данных брокера MSK.

Ниже приведен пример лямбда-кода:

import json
import logging
import boto3
import subprocess
import shlex
import os
import time
from hashlib import md5
from crhelper import CfnResource
from time import sleep

logger = logging.getLogger(__name__)
helper = CfnResource(json_logging=True, log_level='DEBUG')




@helper.create
@helper.update
def create_handler(event, _):
    print('Received event: %s' % json.dumps(event))
    retry_timeout = 0
    if "Timeout" in event['ResourceProperties']:
        retry_timeout = int(event['ResourceProperties']["Timeout"])
    if retry_timeout > 600:
        retry_timeout = 600
    MskArn = event['ResourceProperties']['MskArn']
    kafkaClient = boto3.client('kafka', region_name=event['ResourceProperties']['aws-region'])
    while True:
        try:
            response = kafkaClient.list_nodes(
                ClusterArn=event['ResourceProperties']['MskArn']
            )
            r1=response['NodeInfoList']
            BrokerCount=len(r1)
            i = 0
            DNS=[]
            name = event['ResourceProperties']['Name']
            while i < BrokerCount:
                broker=response['NodeInfoList'][i]
                brokerDNS=broker['BrokerNodeInfo']['Endpoints'][0]
                DNS.append(brokerDNS)
                print(brokerDNS)
                i = i + 1
            return DNS
            outp = DNS
            break
        except Exception as e:
            if retry_timeout < 1:
                raise
            else:
                logging.error('Exception: %s' % e, exc_info=True)
                print("retrying until timeout...")
                time.sleep(5)
                retry_timeout = retry_timeout - 5
    response_data = {}
    if "ResponseKey" in event['ResourceProperties']:
        response_data[event['ResourceProperties']["ResponseKey"]] = outp
    if len(outp.encode('utf-8')) > 1000:
        outp = 'MD5-' + str(md5(outp.encode('utf-8')).hexdigest())
    helper.Data.update(response_data)
    return outp


def lambda_handler(event, context):
    helper(event, context)
    print(response_data)

ниже - мой пример AWS Шаблон облачной информации:

---
AWSTemplateFormatVersion: '2010-09-09'
Description: 'To Get MSK Broker DNS CloudFormation Template'
Resources:
  GetMskBrokersDetails:
    Type: "Custom::GetMskDetails"
    Version: '1.0'
    Properties:
      Name: GetMskBrokerDNS
      ServiceToken: LAMBDA_ARN
      aws-region: !Sub "${AWS::Region}"
      MskArn: MSK_CLUSTER_ARN

Outputs:
  MskBrokerDns1:
    Description: Msk Broker DNS Records
    Value: !Ref GetMskBrokersDetails

Выше работает нормально. Когда я выполняю вышеупомянутые шаблоны, это дает мне следующие выходные данные.

MskBrokerDns1   ['b-1.kafka.ap-south-1.amazonaws.com', 'b-2.kafka.ap-south-1.amazonaws.com']

Поскольку вышеприведенный вывод является списком, мы хотим получить выше DNS-детали в двух отдельных Выходных переменных. как показано ниже:

Outputs:
  MskBrokerDns1:
    Description: Msk Broker DNS Records
    Value: !Select [ 0, !Ref GetMskBrokersDetails ]
  MskBrokerDns2:
    Description: Msk Broker DNS Records
    Value: !Select [ 1, !Ref GetMskBrokersDetails ]

Когда мы пытаемся выполнить шаблон с вышеуказанными изменениями, мы получаем ошибку ниже:

Ошибка шаблона: Fn :: Select требует аргумент списка с двумя элементами: целочисленный индекс и список

Итак, мы запрашиваем поддержку сообщества, как мы можем решить вышеуказанную проблему.

1 Ответ

0 голосов
/ 14 марта 2020

после некоторого удара и испытания мы можем получить ответ, который мы хотели. это не может быть эффективным способом сделать это. Лямбда-код:

import json
import logging
import boto3
import subprocess
import shlex
import os
import time
from hashlib import md5
from crhelper import CfnResource
from time import sleep

logger = logging.getLogger(__name__)
helper = CfnResource(json_logging=True, log_level='DEBUG')




@helper.create
@helper.update
def create_handler(event, _):
    print('Received event: %s' % json.dumps(event))
    retry_timeout = 0
    if "Timeout" in event['ResourceProperties']:
        retry_timeout = int(event['ResourceProperties']["Timeout"])
    if retry_timeout > 600:
        retry_timeout = 600
    MskArn = event['ResourceProperties']['MskArn']
    kafkaClient = boto3.client('kafka', region_name=event['ResourceProperties']['aws-region'])
    while True:
        try:
            response = kafkaClient.list_nodes(
                ClusterArn=event['ResourceProperties']['MskArn']
            )
            r1=response['NodeInfoList']
            BrokerCount=len(r1)
            i = 0
            DNS=[]
            name = event['ResourceProperties']['Name']
            while i < BrokerCount:
                broker=response['NodeInfoList'][i]
                brokerDNS=broker['BrokerNodeInfo']['Endpoints'][0]
                DNS.append(brokerDNS)
                i = i + 1
            outp = DNS
            break
        except Exception as e:
            if retry_timeout < 1:
                raise
            else:
                logging.error('Exception: %s' % e, exc_info=True)
                print("retrying until timeout...")
                time.sleep(5)
                retry_timeout = retry_timeout - 5
    response_data = {}
    response_data['BrokerDNS1'] = DNS[0]
    response_data['BrokerDNS2'] = DNS[1]
    print(response_data)
    helper.Data.update(response_data)

def lambda_handler(event, context):
    helper(event, context)

ниже приведено определение ресурса облачной информации AWS:

  GetMskBrokersDetails:
    Type: "Custom::GetMskDetails"
    Version: '1.0'
    Properties:
      Name: GetMskBrokerDNS
      ServiceToken: !Ref MskGetBrokerDnsLambdaArn
      aws-region: !Sub "${AWS::Region}"
      MskArn: !Ref MskCluster
Outputs:
  MskBrokerDns1:
    Description: Msk Broker DNS Records
    Value: !GetAtt GetMskBrokersDetails.BrokerDNS1
  MskBrokerDns2:
    Description: Msk Broker DNS Records
    Value: !GetAtt GetMskBrokersDetails.BrokerDNS2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...