仅配置AWS::SNS::Subscription后Lambda未触发,需加触发器吗?
问题解答
仅添加SNS订阅不够,你还需要为Lambda函数配置允许SNS主题调用它的权限。
核心原因
手动给Lambda添加SNS触发器时,AWS会自动帮你创建对应的权限规则,允许指定SNS主题调用Lambda的lambda:InvokeFunction接口。但通过CloudFormation仅定义SNS订阅时,不会自动生成这个权限,导致SNS发送的通知被Lambda的访问控制策略拦截,函数无法执行。
解决方法
在你的CloudFormation模板中添加AWS::Lambda::Permission资源,示例如下:
ExceedenceProcessorSnsPermission: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref ExceedenceProcessor Action: "lambda:InvokeFunction" Principal: "sns.amazonaws.com" SourceArn: !Ref SlmExceedenceTopic
配置说明
FunctionName: 指定需要授权的Lambda函数(此处为你已定义的ExceedenceProcessor)Action: 授权SNS执行的Lambda动作,固定为lambda:InvokeFunctionPrincipal: 指定允许调用Lambda的服务,SNS对应的主体是sns.amazonaws.comSourceArn: 仅限指定的SNS主题(你的SlmExceedenceTopic)能调用Lambda,避免权限范围过大
添加这个权限资源后重新部署CloudFormation栈,SNS的通知就能正常触发Lambda函数执行了。
内容的提问来源于stack exchange,提问作者E_K
相关产品推荐
相关产品推荐

