4

语境

我觉得我需要在这里提供很多上下文才能理解问题的全部范围,所以如果这有点长或最终提供了太多信息,请提前道歉我只是想避免很多人关注尽我所能提出问题和澄清请求。

我有一个技术交接项目。它曾经在不同 AWS 账户中的不同所有者下投入生产。我正在尝试在我控制的 AWS 账户中重新启动它,其中一个软件包给我带来了一些问题。

它使用无服务器来配置几个 S3 存储桶及其访问策略、几个 IAM 角色和一堆 ApiGateway 方法。该软件包依赖于嵌套堆栈来解决 200 资源限制,如此所述。

最后,CircleCI 连接的 IAM 用户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 月 4 日更新

我已经做了大量的工作来尝试调试模板。请注意,我通常不使用模板本身,Serverless 会生成它们并将它们转储到 S3 存储桶中,然后再应用它们。

这是我采取的一些步骤

  1. 更新到最新版本的无服务器 ( 1.67.0, from 1.30.3)
  2. 核对现有堆栈
  3. Nuked 相关 S3 存储桶
  4. 更新节点运行时 ( 12.16.1, from 8.10.0)
  5. 下载并检查了包含失败 lambda 的 CFN 模板 - 未报告任何问题

我仍然得到相同的结果。当我重新运行构建并检查 CloudFormation 事件日志时,我确实看到堆栈无法创建,因为其中的 Lambda 函数无法创建。这个函数(其他 Lambda 在运行早期成功创建)没有什么特别之处,除了它是 API 中每个其他函数的授权者,这可能很重要,也可能不重要。我仍然无法找到有关 lambda 无法创建的原因的更多详细信息。

4月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 模板本身,我现在明白发生了什么。每个 Lamba 都有自己的堆栈,整个包中的每个堆栈都被编译成一个 ZIP 文件,其大小最终会比上面指定的限制大 270MB 或 20MB。从这一点来看,我似乎有两条可能的前进道路

  1. 弄清楚如何跨多个 ZIP 拆分功能
  2. 更改 webpack 配置,使编译后的文件不那么臃肿(我真的不知道这里发生了什么 - webpack 后 1k TypeScript 文件输出为 6.5MB)
4

1 回答 1

2

您需要查看嵌套堆栈本身。和资源在嵌套堆栈AbcLambdaFunctionDefLambdaFunction应该比在父堆栈中具有更详细的故障堆栈事件。您可能需要在嵌套堆栈模板中进行修复AbcLambdaFunctionDefLambdaFunction因为不一致可能只是由于哪个资源首先发生故障并开始回滚

如果这些模板已经运行了一段时间,则很可能Lambda 运行时已被弃用。CloudFormation Linter应该能够检查您的模板是否有此和更多可能性

AWS Lambda 限制也可能,我建议尝试这样的事情

检查是否还有任何 CloudWatch 日志

于 2020-04-01T23:08:57.273 回答