Как отлаживать шаблоны CloudFormation, созданные бессерверной системой под управлением CircleCI

Контекст

Я чувствую, что мне нужно предоставить здесь много контекста, чтобы понять весь объем проблемы, поэтому заранее извиняюсь, если это будет длиться слишком долго или в конечном итоге предоставит слишком много информации, я просто хочу предотвратить, как многие следят уточняйте вопросы и уточняйте запросы по мере возможности.

У меня есть проект, связанный с передачей технологий. Раньше он находился в производстве под другим владельцем в другом аккаунте AWS. Я пытаюсь повторно запустить его в учетной записи AWS, которую я контролирую, и один из пакетов создает для меня некоторые проблемы.

Он использует Serverless для предоставления пары сегментов S3 и их политик доступа, пары ролей IAM и множества методов ApiGateway. Пакет полагается на вложенные стеки, чтобы обойти ограничение в 200 ресурсов, как описано здесь.

Наконец, пользователь IAM, к которому подключается CircleCI, имеет AdministratorAccess политика прилагается.

Проблема

Я постоянно получаю отказы от CircleCI на этом этапе сборки

node_modules/.bin/serverless deploy --verbose --stage develop --region us-east-1 --package ./.serverless

Точная природа отказа кажется непоследовательной, то есть он не всегда выходит из строя в одном и том же месте. В какой-то момент ресурс просто не может быть создан, и весь процесс откатывается. Вот пара примеров сбоев запуска в журнале с +/- 5 строками, за которыми следует фактическая ошибка, о которой сообщает Serverless.

Бег 1

CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethod001VarOptions
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethod002VarOptions
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethod003VarOptions
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethod004VarOptions
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethod006Options
CloudFormation - CREATE_FAILED - AWS::CloudFormation::Stack - FuncAbcNestedStack
CloudFormation - CREATE_FAILED - AWS::CloudFormation::Stack - FuncDefNestedStack
CloudFormation - CREATE_FAILED - AWS::CloudFormation::Stack - FuncGhiNestedStack
CloudFormation - UPDATE_ROLLBACK_IN_PROGRESS - AWS::CloudFormation::Stack - org-package-develop
CloudFormation - UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - org-package-develop
CloudFormation - DELETE_IN_PROGRESS - AWS::ApiGateway::Method - ApiGatewayMethod006Options
  Serverless Error ---------------------------------------

  An error occurred: FuncAbcNestedStack - Embedded stack arn:aws:cloudformation:us-east-1:ACCOUNT_ID:stack/org-package-develop-FuncAbcNestedStack/RESOURCE-ID-001 was not successfully created: The following resource(s) failed to create: [AbcLambdaFunction]..

Бег 2

CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethod001VarOptions
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethod002VarOptions
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethod005VarOptions
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethod006Options
CloudFormation - CREATE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethod004VarOptions
CloudFormation - CREATE_FAILED - AWS::CloudFormation::Stack - FuncDefNestedStack
CloudFormation - CREATE_FAILED - AWS::CloudFormation::Stack - FuncGhiNestedStack
CloudFormation - CREATE_FAILED - AWS::CloudFormation::Stack - FuncAbcNestedStack
CloudFormation - UPDATE_ROLLBACK_IN_PROGRESS - AWS::CloudFormation::Stack - org-package-develop
CloudFormation - UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - org-package-develop
CloudFormation - DELETE_IN_PROGRESS - AWS::ApiGateway::Method - ApiGatewayMethod001VarOptions
  Serverless Error ---------------------------------------

  An error occurred: FuncDefNestedStack - Embedded stack arn:aws:cloudformation:us-east-1:ACCOUNT_ID:stack/org-package-develop-FuncDefNestedStack/RESOURCE-ID-002 was not successfully created: The following resource(s) failed to create: [DefLambdaFunction]..

Примечание. Все уникальные идентификаторы в приведенных выше журналах были заменены / обфусцированы новыми идентификаторами, которые уникальны для обоих журналов, а не для каждого журнала, т.е.FuncAbcNestedStack отображается в обоих журналах, потому что это точно такой же ресурс в конфигурации.

Вопрос

Учитывая все вышесказанное, у меня сейчас вопрос: как это отладить? Это представляет все детали, которые, как я (полагаю), доступны мне в том смысле, что я не могу погрузиться глубже, чтобы выяснить, почему не удалось создать ресурс. Я немного читал об устранении неполадок, но ничего страшного в этом нет, так как на самом деле я не использую EC2 напрямую.

4 апреля Обновление

Я много поработал, пытаясь отладить шаблоны. Имейте в виду, что я обычно не работаю с самими шаблонами, Serverless генерирует их и выгружает в корзину S3, прежде чем они будут применены.

Вот несколько шагов, которые я сделал

  1. Обновлено до последней версии Serverless (1.67.0, из 1.30.3)
  2. Обездвижены существующие стеки
  3. Ковш S3, связанный с ядерным оружием
  4. Обновленная среда выполнения узла (12.16.1, из 8.10.0)
  5. Скачал и добавил шаблон CFN, содержащий ошибочную лямбда - проблем не сообщалось

Я все еще получаю те же результаты. Когда я повторно запускаю сборку и проверяю журналы событий CloudFormation, я действительно вижу, что стек не удается создать, потому что не удается создать в нем лямбда-функцию. В этой функции нет ничего особенного (другие лямбда-выражения успешно создаются на ранних этапах выполнения), кроме того факта, что она является авторизатором для всех остальных функций в API, что может иметь или не иметь значения. Я до сих пор не могу найти более подробную информацию о том, почему лямбда не создается.

6 апреля Обновление

Хорошо, теперь, когда я понимаю, как работает консоль CloudFormation, вот что, на мой взгляд, является самым скрытым сообщением об ошибке.

Unzipped size must be smaller than 262144000 bytes (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: 0507722d-46e7-4340-bc68-fdba1ed469d6)

Глядя на сам шаблон CFN для этого вложенного стека, я теперь понимаю, что происходит. Каждая отдельная ламба получает свой собственный стек, и каждый стек по всему пакету компилируется в один ZIP-файл, размер которого в конечном итоге оказывается примерно на 270 МБ или 20 МБ больше указанного выше предела. С этого момента, похоже, у меня есть два возможных пути вперед.

  1. Выясните, как разделить функции на несколько ZIP-архивов
  2. Измените конфигурацию веб-пакета, чтобы скомпилированные файлы были менее раздутыми (я серьезно не знаю, что здесь происходит - файл TypeScript размером 1k выходит как 6,5 МБ после веб-пакета)

1 ответ

Вам нужно будет посмотреть сами вложенные стеки. ВAbcLambdaFunction а также DefLambdaFunctionресурсы должны иметь более подробные события стека сбоев во вложенных стеках, чем в родительских стеках. Скорее всего, вам нужно будет исправитьAbcLambdaFunction а также DefLambdaFunction во вложенных шаблонах стека, поскольку несоответствие, вероятно, связано с тем, что какой-либо ресурс вышел из строя первым и начал откат

Если с тех пор, как эти шаблоны были запущены, прошло некоторое время, вероятно, Lambda Runtimes устарела. CloudFormation ЛИНТЕР должен иметь возможность проверить свои шаблоны для этого и больше возможностей

Ограничения AWS Lambda также вероятны, я бы рекомендовал попробовать такие вещи

Проверьте, есть ли журналы CloudWatch