【问题标题】:Error on Auth section in AWS SAM templateAWS SAM 模板中的 Auth 部分出错
【发布时间】:2019-09-20 14:19:21
【问题描述】:

为了启用 AWS_IAM 身份验证和 CORS,我制作了我的 sam 模板,如下所示。

但是,我收到一个错误提示

未能创建变更集:Waiter ChangeSetCreateComplete 失败:Waiter 遇到终端故障状态状态:FAILED。原因:转换 AWS::Serverless-2016-10-31 失败,原因是:无服务器应用程序规范文档无效。发现的错误数: 1. id 为 [ListFunction] 的资源无效。 ID 为 [ListFunctionCors] 的事件无效。 无法在路径 [/list] 的 API 方法 [options] 上设置 Authorizer [NONE],因为相关 API 未定义任何 Authorizer。

这里有什么问题?

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  ListApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Auth:
        DefaultAuthorizer: AWS_IAM
      Cors:
        AllowMethods: "'*'"
        AllowHeaders: "'*'"
        AllowOrigin: "'*'"
  ListFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: app_src/
      Handler: app.lambda_handler
      Runtime: python3.7
      Events:
        ListFunction:
          Type: Api
          Properties:
            RestApiId: !Ref ListApi
            Path: /list
            Method: GET
        ListFunctionCors:
          Type: Api
          Properties:
            RestApiId: !Ref ListApi
            Path: /list
            Method: OPTIONS
            Auth:
              Authorizer: 'NONE'

【问题讨论】:

    标签: aws-sam


    【解决方案1】:

    我发现这个问题的解决方案更像是一种解决方法。 您收到的错误消息的来源似乎是here

    据我了解,当你选择拥有AWS_IAM以外的方法授权者时,3种情况是不允许的: 1.没有定义授权人 2. 选择除NONE之外的授权人,该授权人在定义的授权人中不存在 3. 选择NONE作为授权人,不设置默认授权人。

    以上情况不处理AWS_IAM授权方的情况。它是唯一一种仅设置为DefaultAuthorizer 而无需在Authorizers 字典中列出的授权人类型。

    所以这里的解决方法是定义一个虚拟的自定义授权者并且永远不要使用它。

    在您的情况下,可以这样做:

    AWSTemplateFormatVersion: '2010-09-09'
    Transform: AWS::Serverless-2016-10-31
    Resources:
      ListApi:
        Type: AWS::Serverless::Api
        Properties:
          StageName: Prod
          Auth:
            DefaultAuthorizer: AWS_IAM
            Authorizers:
              Dummy:
                FunctionArn: !GetAtt ListFunction.Arn
          Cors:
            AllowMethods: "'*'"
            AllowHeaders: "'*'"
            AllowOrigin: "'*'"
      ListFunction:
        Type: AWS::Serverless::Function
        Properties:
          CodeUri: app_src/
          Handler: app.lambda_handler
          Runtime: python3.7
          Events:
            ListFunction:
              Type: Api
              Properties:
                RestApiId: !Ref ListApi
                Path: /list
                Method: GET
            ListFunctionCors:
              Type: Api
              Properties:
                RestApiId: !Ref ListApi
                Path: /list
                Method: OPTIONS
                Auth:
                  Authorizer: 'NONE'
    
    

    我在您的 API 中添加了一个自定义 lambda 授权器 Dummy,它从未使用过。我使用了你已经定义的 lambda 的 arn,但你可以创建一个占位符 lambda 来代替。

    底线:在仅使用 DefaultAuthorizer: AWS_IAM 的情况下,您目前可以在 SAM 中使用 Authorizer: 'NONE' 的唯一方法是将任何其他授权方添加到您的 API。

    注意:Authorizer 的 null 值是在最初的 GitHub 问题中提出的,但在实现中他们选择了 NONE 值,如文档中所述。

    【讨论】:

      【解决方案2】:

      刚刚遇到同样的问题,并想通了。根据https://github.com/awslabs/serverless-application-model/issues/781,该函数事件应该是:

      ListFunctionCors:
                Type: Api
                Properties:
                  RestApiId: !Ref ListApi
                  Path: /list
                  Method: OPTIONS
                  Auth:
                    Authorizer: null
      

      这是Authorizer: null,而不是Authorizer: 'NONE'

      希望这会有所帮助!

      【讨论】:

      • 哦,软糖。虽然这消除了错误,但它似乎没有预期的覆盖效果。
      • 不删除给定路径的授权者。
      猜你喜欢
      • 2021-01-07
      • 2021-04-02
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2020-11-14
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多