Я пытаюсь создать пользовательский ресурс 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 требует аргумент списка с двумя элементами: целочисленный индекс и список
Итак, мы запрашиваем поддержку сообщества, как мы можем решить вышеуказанную проблему.