Пользовательский ресурс не работает должным образом при развертывании - PullRequest
0 голосов
/ 05 мая 2020

Более двух дней я пытался развернуть стек CloudFormation с использованием бессерверной инфраструктуры. Дело в том, что как часть стека у меня есть кластер RDS, а также пользовательский ресурс, который использует лямбда-функцию (записанную в Python) для инициализации некоторых таблиц базы данных.

Подробности этого настраиваемого ресурса в файле serverless.yml следующие:

rdsMigration:
  Type: Custom::DatabaseMigration
  DependsOn: rdsCluster
  Properties:
    ServiceToken: !GetAtt MigrateDatabaseLambdaFunction.Arn
    Version: 1.0

При развертывании с использованием sls deploy кластер и лямбда-функции создаются правильно, но процесс застревает. создание ресурса rdsMigration.

В лямбда-коде я старался генерировать ответ во всех возможных сценариях ios, включая исключения. Однако, похоже, проблема не в этом.

Очевидно, функция не вызывается ... вроде, потому что даже диаграммы выглядят странно:

Monitoring of the Lambda function

Вы можете видеть, что нет вызовов, но есть красная точка в «Счетчике ошибок и успешности» около 17:15, это время, когда началось создание ресурса. Кроме того, нет зеленых точек, и вы можете увидеть предупреждение внизу в легенде, в котором говорится, что «Одна или несколько точек данных были потеряны из-за нечисловых c значений (NaN, -Infinite, + Infinite) ". Как это возможно? Я предполагаю, что это нестандартное поведение, поскольку другие функции Lambda (которые должны вызываться с помощью конечной точки API Gateway) не отображают эту странную диаграмму.

Кроме того, в CloudWatch нет потоков журналов. Он полностью пустой, как если бы функция никогда не вызывалась (что, кажется, так, за исключением странной «красной точки» в момент создания ресурса).

Наконец, если я запустил тестовый пример с помощью Шаблон «AWS CloudFormation Create Request», функция работает правильно, создает начальные таблицы, которые я ожидал для БД (не всегда, но это другой вопрос), и возвращает ответ.

У вас есть есть представление о том, что здесь происходит? Хуже всего то, что мне нужно подождать два часа между тестами, поскольку стек CFN застревает на этапах создания и уничтожения, пока не истечет время ожидания.

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Проблема связана с вашей лямбда-функцией. Вы должны отправить обратно сигналы УСПЕХ или НЕИСПРАВНОСТЬ обратно в CFN. Поскольку ваша лямбда-функция не отправляет никаких сигналов, она ожидает тайм-аута (2 часа) и облачная информация не работает Информация об облаке

Подробнее: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html

0 голосов
/ 06 мая 2020
• 1000 Лямбда-функция не отправляла сигнал должным образом из-за ошибки программирования. По сути, я взял код из документации (код для Python 3, второй фрагмент, начинающийся с конца) и, видимо, по ошибке удалил строку для получения ResponseURL. Конечно, это не помогло.

Попутный комментарий по этому поводу: будьте осторожны при использовании cfnresponse библиотеки Python или даже фрагмента кода, который я привел в документации. Он основан на botocore.vendored, который устарел и больше не существует в последних выпусках botocore. Следовательно, он потерпит неудачу, если ваш код будет полагаться на новые версии этой библиотеки (как в моем случае). Простое решение - заменить botocore.vendored.requests библиотекой requests.

Тем не менее, есть странное поведение, которое я не могу понять. При создании функция Lambda ничего не записывает в CloudWatch, и на диаграммах наблюдается странное поведение, которое я объяснил в своем вопросе. Однако это происходит только при создании. Если функция вызывается вручную или вызывается как часть процесса удаления (при удалении стека CFN), она записывается в CloudWatch. Следовательно, проблема, по-видимому, возникает только при первом вызове.

Лучшее.

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