跨AWS账号通过CloudFormation调用Lambda是否可行?及权限报错排查
一、CloudFormation所在账号能否调用另一个账号的Lambda?
当然可以!跨账号调用Lambda是AWS官方支持的场景,但需要在**调用方(CloudFormation所在账号)和被调用方(Lambda所在账号)**两边都配置正确的权限和信任关系,缺一不可。
二、排查账号115333656057创建栈时调用Lambda报错的问题
由于你没有提供具体的错误提示信息(比如权限拒绝、函数不存在等),我整理了几个最常见的故障点和对应的排查方案,你可以按顺序检查:
1. 目标Lambda的资源策略未开放跨账号调用权限
这是最常见的问题——Lambda所在账号没有允许115333656057这个账号调用它。你需要给Lambda函数添加一条资源策略,示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::115333656057:root" }, "Action": ["lambda:InvokeFunction", "lambda:InvokeAsync"], "Resource": "arn:aws:lambda:你的Lambda所在区域:你的Lambda账号ID:function:你的Lambda函数名" } ] }
注意替换掉示例中的占位符,其中lambda:InvokeAsync是针对CloudFormation自定义资源场景需要的动作,如果是普通调用可以只保留lambda:InvokeFunction。
2. CloudFormation的执行角色权限不足
创建栈时,CloudFormation会使用指定的执行角色(或默认服务角色)去调用Lambda,如果这个角色没有被允许调用目标Lambda的权限,就会报错。你需要给这个角色添加一条IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["lambda:InvokeFunction", "lambda:InvokeAsync"], "Resource": "arn:aws:lambda:你的Lambda所在区域:你的Lambda账号ID:function:你的Lambda函数名" } ] }
3. Lambda的执行角色信任关系配置错误(自定义资源场景)
如果你的Lambda是作为CloudFormation自定义资源使用,Lambda的执行角色必须信任CloudFormation服务,否则无法接收CloudFormation的请求。检查角色的信任策略,确保包含以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudformation.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
4. VPC网络限制导致无法访问
如果目标Lambda部署在VPC内,而CloudFormation的请求无法穿透该VPC的网络(比如没有配置VPC端点、NAT网关,或者安全组/网络ACL拦截了流量),也会调用失败。你可以先尝试把Lambda临时调整为“不在VPC内运行”,如果调用正常,再排查VPC的网络配置。
5. Lambda ARN或名称拼写错误
别忽略这种低级错误!仔细核对CloudFormation模板中指定的Lambda函数ARN,确保区域、账号ID、函数名完全和实际一致,哪怕一个字符错了都会导致找不到函数。
内容的提问来源于stack exchange,提问作者Massimo Ugues

