You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CloudFormation中为Lambda配置带Principal的基于资源策略

错误原因

你使用的AWS::IAM::Policy是身份型策略,仅可附加到IAM身份(用户、角色、组)上,这类策略默认作用于绑定的身份实体,因此不允许在Statement中显式声明Principal/NotPrincipal字段,这和你在控制台配置的Lambda基于资源的策略属于完全不同的策略类型。

正确实现方式

Lambda的基于资源策略可以通过两种CloudFormation资源实现:

方式1:单条调用权限(最常用,对应控制台单条策略语句添加)

使用AWS::Lambda::Permission资源直接给外部账号授予调用权限,示例模板如下:

LambdaInvokePermission:
  Type: AWS::Lambda::Permission
  Properties:
    FunctionName: !Ref NameOfLambda # 你的Lambda资源逻辑名或者ARN
    Action: lambda:InvokeFunction
    Principal: "arn:aws:iam::AccountIUseToInvokeTheLambda:root" # 外部调用方账号的ARN
    StatementId: InvokeLambdaExternally # 对应策略的Sid,可自定义

方式2:完整资源策略(适合需要一次性添加多条策略语句的场景)

如果你需要完整定义Lambda的整个资源-based策略,可以用AWS::Lambda::ResourcePolicy资源:

LambdaResourcePolicy:
  Type: AWS::Lambda::ResourcePolicy
  Properties:
    ResourceArn: !GetAtt NameOfLambda.Arn
    PolicyDocument:
      Version: '2012-10-17'
      Statement:
        - Sid: InvokeLambdaExternally
          Effect: Allow
          Action: lambda:InvokeFunction
          Resource: !GetAtt NameOfLambda.Arn
          Principal:
            AWS: ["arn:aws:iam::AccountIUseToInvokeTheLambda:root"]

补充说明

两种方式最终效果和你在控制台手动添加的资源-based策略完全一致,部署后可以在Lambda控制台的资源-based策略页面看到对应的语句。

内容的提问来源于stack exchange,提问作者akai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:06:03