Шаблон cf настраиваемого ресурса с лямбда-поддержкой возвращает CREATE_FAILED - PullRequest
0 голосов
/ 29 мая 2018

Следующая лямбда-функция заключается в том, чтобы связать тему SNS с существующими каталогами, за которой следует пользовательский ресурс для вызова самой лямбда-функции.Я вижу, что лямбда-создание успешно завершено, 'Register_event_topic' также завершается.Однако через некоторое время стек выходит из строя главным образом из-за того, что «пользовательский ресурс не смог стабилизироваться в ожидаемое время»;Как я могу убедиться, что в стеке нет ошибок?

AWSTemplateFormatVersion: '2010-09-09'
    #creating lambda function to register_event_topic
    Description: Lambda function to register event topic with existing directory ID
    Parameters:
      RoleName:
        Type: String
        Description: "IAM Role used for Lambda execution"
        Default: "arn:aws:iam::<<Accountnumber>>:role/LambdaExecutionRole"
      EnvVariable:
        Type: String
        Description: "The Environment variable set for the lambda func"
        Default: "ESdirsvcSNS"
    Resources:
      REGISTEREVENTTOPIC:
        Type: 'AWS::Lambda::Function'
        Properties:
          FunctionName: dirsvc_snstopic_lambda
          Handler: index.lambda_handler
          Runtime: python3.6
          Description: Lambda func code to assoc dirID with created SNS topic
          Code:
            ZipFile: |
              import boto3
              import os
              import logging
              dsclient = boto3.client('ds')
              def lambda_handler(event, context):
                response = dsclient.describe_directories()
                directoryList = []
                print(response)
                for directoryList in response['DirectoryDescriptions']:
                    listTopics = dsclient.describe_event_topics(
                      DirectoryId=directoryList['DirectoryId']
                    )
                    eventTopics = listTopics['EventTopics']
                    topiclength = len(eventTopics)
                    if topiclength == 0:
                      response = dsclient.register_event_topic(
                          DirectoryId=directoryList['DirectoryId'],
                          TopicName= (os.environ['MONITORING_TOPIC_NAME'])
                      )  
                    print(listTopics)
          Timeout: 60
          Environment:
            Variables:
              MONITORING_TOPIC_NAME: !Ref EnvVariable
          Role: !Ref RoleName

      InvokeLambda:
        Type: Custom::InvokeLambda
        Properties:
          ServiceToken: !GetAtt REGISTEREVENTTOPIC.Arn
          ReservedConcurrentExecutions: 1

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Ваша лямбда не поддерживает пользовательский жизненный цикл ресурса

В настраиваемом ресурсе с лямбда-поддержкой вы реализуете свою логику для поддержки создания, обновления и удаления ресурса.Эти указания отправляются из CloudFormation через событие и предоставляют вам информацию о процессе стека.

Кроме того, вам также следует вернуть свой статус обратно в CloudFormation

Ожидается CloudFormationполучить ответ от вашей лямбда-функции после того, как вы закончите со своей логикой.Он не продолжит процесс развертывания, если не получит ответ, или, по крайней мере, до истечения 1 часа (!).Это может стоить вам много времени и разочарований.

Вы можете прочитать больше здесь

0 голосов
/ 29 мая 2018

Увы, написание собственного ресурса не так просто, как вы могли подумать.Вместо этого необходимо добавить специальный код к публикации ответа на URL-адрес .

. Вы можете увидеть это в примере файла Zip, предоставленном на: Пошаговое руководство. Поиск по образу машины AmazonИдентификаторы - AWS CloudFormation

Из пользовательских ресурсов - AWS CloudFormation документация:

Пользовательский поставщик ресурсов обрабатывает запрос AWS CloudFormation и возвращает ответот SUCCESS или FAILED до предварительно подписанного URL.Пользовательский поставщик ресурсов предоставляет ответ в файле в формате JSON и загружает его по предварительно подписанному URL-адресу S3.

Это происходит из-за асинхронного поведения CloudFormation.Он не просто вызывает функцию Lambda, а затем ждет ответа.Скорее, он запускает функцию Lambda, и функция должна перезвонить и запустить следующий шаг в CloudFormation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...