语境
我觉得我需要在这里提供很多上下文才能理解问题的全部范围,所以如果这有点长或最终提供了太多信息,请提前道歉,我只是想避免很多人关注尽我所能提出问题和澄清请求。
我有一个技术交接项目。它曾经在不同 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.67.0
, from1.30.3
) - 核对现有堆栈
- Nuked 相关 S3 存储桶
- 更新节点运行时 (
12.16.1
, from8.10.0
) - 下载并检查了包含失败 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。从这一点来看,我似乎有两条可能的前进道路
- 弄清楚如何跨多个 ZIP 拆分功能
- 更改 webpack 配置,使编译后的文件不那么臃肿(我真的不知道这里发生了什么 - webpack 后 1k TypeScript 文件输出为 6.5MB)