调用Lambda的CreateEventSource所需IAM策略及触发器权限报错排查
Lambda CreateEventSourceMapping的IAM策略及权限问题解答
哈喽!针对你提出的两个问题,我来给你详细拆解解答:
1. 调用Lambda CreateEventSourceMapping接口所需的IAM策略
要调用CreateEventSourceMapping接口(也就是创建事件源触发器),执行这个操作的IAM身份——不管是你的本地开发账号、另一个Lambda的执行角色,还是其他AWS服务——需要的IAM策略得覆盖这几个关键点:
- 核心动作:必须包含
lambda:CreateEventSourceMapping,这是创建映射关系的基础权限 - 资源范围:
- 首先要指定目标Lambda函数的ARN——也就是你想要让触发器调用的那个函数的完整ARN,毕竟这个操作是把事件源和该函数绑定起来
- 如果你的事件源是DynamoDB、Kinesis这类带流的服务,还要把事件源对应的流ARN加进资源列表里,因为创建映射时需要引用这个资源
- 额外提醒:如果目标Lambda函数需要读取事件源的数据(比如DynamoDB流的记录),那目标函数的执行角色得单独配置事件源的访问权限(比如
dynamodb:GetRecords、dynamodb:GetShardIterator),但这是函数运行时的权限,和调用CreateEventSourceMapping接口的权限是两回事哦
给你一个针对DynamoDB触发器场景的具体策略示例:
Effect: Allow Action: - lambda:CreateEventSourceMapping Resource: - arn:aws:lambda:us-west-2:你的AWS账号ID:function:目标Lambda函数名 - arn:aws:dynamodb:us-west-2:你的AWS账号ID:table/你的DynamoDB表名/stream/*
2. 部署后控制台测试出现权限错误的排查解决
你说命令行测试成功,但控制台调用就出现权限错误,这种情况十有八九是本地测试用的身份权限和Lambda执行角色的权限不匹配——命令行大概率用的是你本地的IAM用户/角色(权限可能比较宽泛),但部署后Lambda是用自己的专属执行角色运行的,这个角色的权限不够。
看你给出的serverless.yml里的策略,只配置了lambda:CreateEventSourceMapping动作和某个Lambda的ARN资源,可能存在这些问题:
- 资源范围太窄:
你要创建的是DynamoDB触发器,但策略里没有包含DynamoDB表的流ARN,导致调用CreateEventSourceMapping时无法引用这个事件源资源,直接触发权限错误
或者你指定的目标Lambda函数ARN有拼写错误(比如区域、账号ID、函数名写错),也会导致权限验证失败 - 缺少辅助权限:
有些场景下,创建事件源映射还需要lambda:GetFunction权限(用来验证目标函数是否存在),虽然不是必须,但加上能避免一些边缘场景的权限问题
给你调整后的serverless.yml策略参考:
Effect: Allow Action: - lambda:CreateEventSourceMapping - lambda:GetFunction # 可选,用来验证目标函数有效性,减少权限问题 Resource: - arn:aws:lambda:us-west-2:你的AWS账号ID:function:要触发的目标Lambda函数名 - arn:aws:dynamodb:us-west-2:你的AWS账号ID:table/你的DynamoDB表名/stream/*
另外,你也可以检查下Lambda执行角色的信任策略,确保它允许AWS Lambda服务 assume 这个角色(serverless框架通常会自动配置,但如果手动修改过可能会出问题)。
内容的提问来源于stack exchange,提问作者Nachi
相关产品推荐
相关产品推荐

