Как отлаживать шаблоны CloudFormation, созданные без сервера, оркестрированные CircleCI - PullRequest
5 голосов
/ 30 марта 2020

Контекст

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

У меня есть проект, который передается техническим специалистам. Раньше он был в производстве под другим владельцем в другом 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 строками, за которыми следует фактическая ошибка, сообщенная без сервера

Выполнить 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]. .

Примечание. Все уникальные идентификаторы в вышеприведенных журналах заменены / скрыты новыми идентификаторами, уникальными для обоих журналов, а не для log, т. Е. 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, я вижу, что стек не может быть создан, потому что внутри него не удается создать функцию Lambda. В этой функции нет ничего особенного (другие лямбды успешно создаются ранее в ходе выполнения), кроме факта, что она является авторизатором для всех других функций в 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. Измените конфигурацию веб-пакета, чтобы скомпилированные файлы были менее раздутыми (я серьезно не знаю, что здесь происходит - файл 1K TypeScript выходит размером 6,5 МБ после веб-пакета)

1 Ответ

3 голосов
/ 02 апреля 2020

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

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

AWS Лямбда-лимиты также вероятно, я бы рекомендовал попробовать подобные вещи

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

...