通过AWS CDK CloudFormation部署API时遇AccessDeniedException求助
问题概述
通过AWS CLI部署CloudFormation堆栈时,执行到第108步(共112步)失败,堆栈自动触发删除流程,返回错误:
Message returned: AccessDeniedException: Resource is not in the state functionActive
at Object.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:61:27)
at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/rest_json.js:61:8)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:686:14)
at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request. (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)
at Request. (/var/runtime/node_modules/aws-sdk/lib/request.js:688:12) (RequestId: e5e78188-41a5-48a7-acfb-7666448e88ef)
已为CDK部署角色和执行角色添加LambdaFullAccess、AdministratorAccess权限,但问题仍存在。
排查与解决方案
1. 确认Lambda函数的实际状态
- 登录AWS控制台,进入Lambda服务页面,定位部署流程中涉及的目标函数,检查其状态是否为
Active。若处于Pending、Inactive或其他异常状态,说明函数创建/初始化未完成,导致后续操作被拒绝。 - 查看该Lambda对应的CloudWatch日志组,排查是否存在初始化失败(如依赖包错误、内存超限、权限配置问题)导致状态异常的日志信息。
2. 修正CDK资源依赖顺序
- 错误核心原因通常是CDK在Lambda函数未完全激活时,就尝试执行依赖该函数的操作(如添加触发器、关联API Gateway、在其他资源中调用该函数)。
- 检查CDK代码中的资源依赖:确保依赖Lambda的资源(如
LambdaIntegration、EventSourceMapping)明确声明了对Lambda函数的依赖,或使用addDependency()方法强制等待Lambda就绪后再执行后续操作。
3. 验证部署角色的权限边界与SCP限制
- 即使添加了
AdministratorAccess,AWS权限边界(Permission Boundary)或组织级服务控制策略(SCP)可能限制了Lambda状态相关操作。检查部署角色是否附加了权限边界,以及AWS组织的SCP是否允许lambda:GetFunction、lambda:UpdateFunctionConfiguration等核心操作。 - 确认部署角色的信任关系配置正确,允许
cloudformation.amazonaws.com服务扮演该角色执行部署操作。
4. 手动触发Lambda激活
- 若函数创建后处于
Pending状态,可在Lambda控制台手动执行一次测试调用,触发函数激活流程。完成后重新运行CDK部署命令,验证是否能绕过状态检查问题。
5. 分析CloudFormation事件日志
- 进入CloudFormation控制台,找到失败的堆栈,查看事件列表中第108步对应的资源类型和名称,明确是哪个Lambda函数或依赖资源触发了错误。根据资源类型针对性排查:例如若为EventBridge规则关联Lambda,需确认规则目标配置正确,且Lambda允许该触发器调用。
内容的提问来源于stack exchange,提问作者Yatin Gambhir

