微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法有条件地添加 AWS::Serverless::Api 资源的 Auth 属性

如何解决无法有条件地添加 AWS::Serverless::Api 资源的 Auth 属性

我正在尝试使用如下所示的 Auth 条件函数有条件地将 AWS::Serverless::Api 属性添加Fn::If 资源,以便仅在部署时添加 ResourcePolicy到生产。

AWstemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: 'My application'
Parameters:
  ProdEnvironment:
    Type: String
    Default: "false"
    Description: "Should be true or false"
    AllowedValues: [true,false]
Conditions:
  AddResourcePolicy: !Equals [!Ref ProdEnvironment,"true"]
Resources:
  RestApi:
    Type: AWS::Serverless::Api
    Properties:
      Name: "my-api"
      Description: "My API Gateway that I can't deploy"
      DeFinitionBody:
        <...>
      Auth:
        !If 
        - AddResourcePolicy
        - ApiKeyrequired: true
          InvokeRole: NONE
          ResourcePolicy:
            CustomStatements:
            - Effect: "Allow"
              Principal: "*"
              Action: "execute-api:Invoke"
              Resource: "execute-api:/*"
              Condition:
                IpAddress:
                  aws:SourceIp:
                  - "<my_approved_ip_1>"
                  - "<my_approved_ip_2>"
        - ApiKeyrequired: true
          InvokeRole: NONE
        <...>

在此模板上运行 sam validate 时出现以下错误

错误:[InvalidResourceException('RestApi',"'Auth' 的值无效 属性")] ('RestApi',"'Auth' 属性的值无效")

当我删除 !If 函数并将 Auth 属性直接添加到资源时,API 会使用附加的资源策略按预期部署。

我还尝试在 ResourcePolicy 资源下添加 !If 函数以及如下所示的 AWS::Novalue 伪参数。

Auth:
  ApiKeyrequired: true
  InvokeRole: NONE
  UsagePlan:
    UsagePlanName: !Join ["-",[!Ref ApiName,Basic]]
    CreateUsagePlan: PER_API
    Description: "User data management basic usage plan"
  ResourcePolicy:
    !If AddResourcePolicy    
    - CustomStatements:
      - Effect: "Allow"
        Principal: "*"
        Action: "execute-api:Invoke"
        Resource: "execute-api:/*"
        Condition:
          IpAddress:
            aws:SourceIp:
              - "<my_approved_ip_1>"
              - "<my_approved_ip_2>"
    - !Ref "AWS::Novalue"

在我的模板中使用上述代码段后,运行 sam validate 时不会出现任何错误。但是,我在运行 sam deploy 时在 CloudFormation 事件中收到以下错误

无效的政策文件。请检查策略语法并确保 Principals 有效。 (服务:AmazonApiGateway;状态代码:400;错误代码:BadRequestException;请求 ID:bce87a44-07d1-49a3-a983-3370b0d0bd09;代理:null)

解决方法

仅供参考,这似乎是一个悬而未决的问题。见https://github.com/aws/serverless-application-model/issues/1859

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。