如何在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
相关产品推荐
相关产品推荐

