如何在 Cloudformation 中编写基于资源的策略

Posted

技术标签:

【中文标题】如何在 Cloudformation 中编写基于资源的策略【英文标题】:How to write Resource-based policy in Cloudformation 【发布时间】:2022-01-08 07:21:37 【问题描述】:

我想从外部 AWS 账户调用 Lambda,我通过在控制台的基于资源的策略选项卡(Lambda > 配置 > 权限 > 基于资源的策略)中创建策略语句来设法做到这一点。虽然,我找不到在我的 CloudFormation 模板中编写这样的策略的方法。这是我写的:

InvokePolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: 'InvokeLambdaFromGateway'
      Roles: 
        - !Sub "arn:aws:iam::$AWS::AccountId:role/NameOfLambda"
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Sid: InvokeLambdaExternally
            Effect: Allow
            Resource:
              - !Ref NameOfLambda
            Action:
              - lambda:InvokeFunction
            Principal:
              AWS: ["arn:aws:iam::AccountIUseToInvokeTheLambda:root"]

但我收到此错误:IAM Resource Policy statement shouldnt have Principal or NotPrincipal

如何使用 Principal 定义将该策略附加到我的 Lambda?

【问题讨论】:

【参考方案1】:

此错误是因为您没有将主体添加到策略中。您需要添加权限:

  permission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt function.Arn
      Action: lambda:InvokeFunction
      Principal: 123456789012

在documentation 中了解更多信息。

【讨论】:

效果很好,我只是不明白为什么我以前没有找到这个,但非常感谢

以上是关于如何在 Cloudformation 中编写基于资源的策略的主要内容,如果未能解决你的问题,请参考以下文章

如何将 AWS 漂移堆栈资源恢复到预期状态

使用 cloudformation 基于 lambda 持续时间指标创建 cloudwatch 警报

如何使用 CloudFormation 在现有 EC2 实例上启动容器?

如何根据 IAM 角色 CloudFormation 模板中的参数提供不同的条件

如何在 AWS CloudFormation YAML 模板中转义策略变量

AWS Cloudformation-如何在 json/yaml 模板中处理字符串大写或小写