CloudFormation报错Fn::GetAtt引用未定义资源EventHandlerLambdaFunction如何解决?
问题原因
错误核心是Fn::GetAtt引用的CloudFormation资源逻辑ID和实际定义的ID不匹配:
- CloudFormation资源逻辑ID大小写敏感,引用时必须和定义的拼写完全一致
- 你在Resources块下手动声明的Lambda函数资源逻辑ID就是你写的
eventHandler,只有通过Serverless Framework顶层functions字段定义的函数,框架才会自动将函数名转成帕斯卡命名后拼接LambdaFunction作为生成的资源ID,你手动定义的资源不会生成这个带后缀的ID。
解决方案
直接修改Event Rule的Targets配置中的引用ID为实际的eventHandler即可,修改后的配置如下:
eventSourceRule: Type: 'AWS::Events::Rule' Properties: Name: eventSourceRule EventBusName: omnibus-${self:custom.stage} EventPattern: | { "source": ["op.api"] } RetryPolicy: MaximumRetryAttempts: 5 MaximumEventAgeInSeconds: 900 DeadLetterConfig: Type: SQS QueueLogicalId: EBRuleDLQ Targets: - Arn: Fn::GetAtt: - 'eventHandler' - 'Arn' Id: 'eventSourceRule'
异常排查
如果修改后仍报错,可按以下顺序检查:
- 确认
eventHandler和eventSourceRule属于同一个CloudFormation模板的Resources块下的同级资源,跨模板引用需要先导出资源再导入 - 检查yaml文件缩进是否正确,
eventHandler必须是Resources的直接子节点,不能有额外缩进 - 确认你没有同时在Serverless Framework的
functions字段和Resources字段重复定义同名函数,避免ID冲突
内容的提问来源于stack exchange,提问作者stairwaytoeve
相关产品推荐
相关产品推荐

