如何设置依赖SAM创建的其他无服务器函数ARN的SAM调用权限
解决方案
方案1:同SAM模板内函数互相调用(最推荐)
如果所有互相调用的Lambda都定义在同一个SAM模板文件中,直接利用CloudFormation的内置函数动态获取被调用方ARN即可,无需手动维护。
示例模板片段:
Resources: # 被调用方Lambda InvokeeLambda: Type: AWS::Serverless::Function Properties: CodeUri: invokee/ Handler: app.lambda_handler Runtime: python3.9 # 调用方Lambda CallerLambda: Type: AWS::Serverless::Function Properties: CodeUri: caller/ Handler: app.lambda_handler Runtime: python3.9 Policies: - Version: '2012-10-17' Statement: - Effect: Allow Action: lambda:InvokeFunction Resource: !GetAtt InvokeeLambda.Arn # 动态获取被调用方ARN
部署时CloudFormation会自动解析引用的ARN值,被调用方更新时策略也会同步更新,无需手动修改。
方案2:跨SAM模板/跨栈调用
如果函数拆分在不同的SAM模板(不同CloudFormation栈)中,有两种成熟的自动化方案:
- 栈导出导入:在被调用方的模板中添加
Outputs配置,将函数ARN导出为栈输出值,调用方模板使用!ImportValue引入该值即可。
被调用方模板示例:
调用方模板引用示例:Outputs: InvokeeLambdaArn: Value: !GetAtt InvokeeLambda.Arn Export: Name: InvokeeLambdaArn # 导出的名称全局唯一Resource: !ImportValue InvokeeLambdaArn - SSM参数存储:被调用方部署时自动将ARN写入AWS SSM参数存储,调用方模板直接读取对应参数值获取ARN,适合跨账号、跨区域的调用场景。
方案3:固定Lambda函数名称(兼容原有静态策略)
如果不想修改原有策略逻辑,可以在SAM定义函数时显式指定FunctionName属性,固定函数名称后ARN就不会自动追加随机后缀,和你之前使用静态名称的逻辑完全一致:
Resources: InvokeeLambda: Type: AWS::Serverless::Function Properties: FunctionName: MyLambda # 固定为你之前的静态名称 CodeUri: invokee/ Handler: app.lambda_handler Runtime: python3.9
注意事项:函数名称在同区域同账号下唯一,修改函数名称会触发Lambda资源删除重建,生产环境调整前需确认影响。
内容的提问来源于stack exchange,提问作者humanlikely
相关产品推荐
相关产品推荐

