不使用STS AssumeRole跨账号调用Lambda报权限错误排查
跨账号Lambda直接调用可行性结论
不通过STS AssumeRole实现跨账号Lambda直接调用是完全可行的,你当前遇到的权限报错核心是目标Lambda的资源基策略配置错误。
问题根因
你当前为目标Lambda配置的资源策略中,Principal设置为"Service": "lambda.amazonaws.com",该配置仅适用于AWS Lambda服务本身作为触发方的场景(比如S3事件通知、SNS订阅触发、事件源映射等托管服务触发链路),并不对其他账号下的IAM身份直接调用生效,因此IAM权限校验时无法匹配到允许规则,抛出无权限错误。
修复步骤
- 修正目标Lambda的资源基策略
将Principal从服务主体替换为调用方对应的IAM身份主体,保留你原有的SourceArn条件做最小权限限制,正确策略示例如下:
{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "addCrossAccountPermission", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::984589850232:role/device-service-sandbox-authenticateDevice-us-east-1-lambdaRole" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:938718425371:function:cm-mgmt-service-sandbox-authenticateDevice", "Condition": { "StringEquals": { "AWS:SourceAccount": "984589850232" }, "ArnLike": { "AWS:SourceArn": "arn:aws:lambda:us-east-1:984589850232:function:device-service-sandbox-authenticateDevice" } } } ] }
如果需要允许调用方账号下所有IAM身份调用(不推荐,权限过大),可以将Principal简化为"AWS": "984589850232",搭配SourceArn条件依然可以限制仅指定调用方Lambda有权限访问。
- 给调用方Lambda执行角色添加身份权限
跨账号Lambda调用需要同时通过两层权限校验:调用方身份自身有调用目标函数的权限、目标函数资源策略允许该身份调用。你需要给调用方绑定的执行角色device-service-sandbox-authenticateDevice-us-east-1-lambdaRole添加如下权限语句:
{ "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:938718425371:function:cm-mgmt-service-sandbox-authenticateDevice" }
- 验证配置生效后重试
IAM策略更新后通常在10秒内完成全局生效,你现有的业务调用代码不需要做任何修改,直接重试调用即可。
注意事项
- 不要在IAM身份直接调用Lambda的场景下给资源策略配置服务Principal,该类Principal仅对AWS托管服务的触发链路生效。
- 策略中的条件键注意保持
AWS:前缀大写,不要写成小写aws:,否则条件校验会失效。 - 如果目标Lambda通过Serverless Framework部署,建议在服务的
serverless.yml中通过函数级permissions配置项定义资源策略,避免手动在控制台修改的策略被后续部署流程覆盖。
内容的提问来源于stack exchange,提问作者Kannan T
相关产品推荐
相关产品推荐

