Как отлаживать шаблоны 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, прежде чем они будут применены.
Вот несколько шагов, которые я сделал
- Обновлено до последней версии Serverless (
1.67.0
, из1.30.3
) - Обездвижены существующие стеки
- Ковш S3, связанный с ядерным оружием
- Обновленная среда выполнения узла (
12.16.1
, из8.10.0
) - Скачал и добавил шаблон 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 МБ больше указанного выше предела. С этого момента, похоже, у меня есть два возможных пути вперед.
- Выясните, как разделить функции на несколько ZIP-архивов
- Измените конфигурацию веб-пакета, чтобы скомпилированные файлы были менее раздутыми (я серьезно не знаю, что здесь происходит - файл TypeScript размером 1k выходит как 6,5 МБ после веб-пакета)
1 ответ
Вам нужно будет посмотреть сами вложенные стеки. ВAbcLambdaFunction
а также DefLambdaFunction
ресурсы должны иметь более подробные события стека сбоев во вложенных стеках, чем в родительских стеках. Скорее всего, вам нужно будет исправитьAbcLambdaFunction
а также DefLambdaFunction
во вложенных шаблонах стека, поскольку несоответствие, вероятно, связано с тем, что какой-либо ресурс вышел из строя первым и начал откат
Если с тех пор, как эти шаблоны были запущены, прошло некоторое время, вероятно, Lambda Runtimes устарела. CloudFormation ЛИНТЕР должен иметь возможность проверить свои шаблоны для этого и больше возможностей
Ограничения AWS Lambda также вероятны, я бы рекомендовал попробовать такие вещи
Проверьте, есть ли журналы CloudWatch