Amplify AppSync中Lambda跨调用的CloudFormation权限配置报错排查
问题背景
在Amplify AppSync应用中,通过CloudFormation配置权限让InvokerFunction调用FunctionToCall时触发403错误,错误信息如下:
Error invoking another lambda: failed to invoke function arn:aws:lambda:us-east-1::function:: operation error Lambda: Invoke, https response error StatusCode: 403, api error AccessDeniedException: User: arn:aws:sts:::assumed-role// is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1::function: because no identity-based policy allows the lambda:InvokeFunction action
已添加的AWS::Lambda::Permission配置如下:
"InvokeLambdaFunction": { "DependsOn": [ "LambdaFunction" ], "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { "Fn::Sub": "FunctionToCall-${env}" }, "Principal": "lambda.amazonaws.com", "SourceArn": { "Fn::Sub": "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:InvokerFunction-${env}" } } }
现有配置的问题
混淆资源型与身份型策略:
AWS::Lambda::Permission是资源侧的授权策略,仅允许指定主体访问目标Lambda,但错误核心是调用方Lambda的执行角色(身份)未被授予调用权限——身份型策略缺失。DependsOn配置不准确:
当前DependsOn指向泛称的LambdaFunction,若目标函数的逻辑ID并非此名称,会导致权限配置在目标函数创建前完成,引发无效授权。
解决方案
1. 为调用方Lambda执行角色添加身份型IAM策略
必须给InvokerFunction的执行角色附加允许调用目标函数的IAM策略,示例CloudFormation配置如下:
InvokerLambdaInvokePolicy: Type: AWS::IAM::Policy Properties: PolicyName: InvokerLambdaInvokePermission PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: lambda:InvokeFunction Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:FunctionToCall-${env}" Roles: - !Ref InvokerFunctionExecutionRole # 替换为InvokerFunction对应的执行角色逻辑ID
2. 修正现有Lambda::Permission配置
保留资源侧授权的同时,确保配置准确:
- 将
DependsOn改为目标函数的逻辑ID(比如目标函数资源名为FunctionToCall,则改为["FunctionToCall"]) - 确认
FunctionName和SourceArn的Sub语法正确,${env}变量能正常解析为对应环境值
3. 权限验证
- 进入IAM控制台,检查
InvokerFunction的执行角色,确认已附加上述身份策略 - 进入目标Lambda控制台的「配置-权限-资源策略」,确认已生成正确的授权规则
内容的提问来源于stack exchange,提问作者Wolf

