AWS SAM 模板中的 Auth 部分出错

Posted

技术标签:

【中文标题】AWS SAM 模板中的 Auth 部分出错【英文标题】:Error on Auth section in AWS SAM template 【发布时间】: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'

【问题讨论】:

【参考方案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'

希望这会有所帮助!

【讨论】:

哦,软糖。虽然这消除了错误,但它似乎没有预期的覆盖效果。 不删除给定路径的授权者。

以上是关于AWS SAM 模板中的 Auth 部分出错的主要内容,如果未能解决你的问题,请参考以下文章

TemplateInputException:解析模板时出错 [auth/login]

在 AWS cloudformation 上理解 Apigateway 和嵌套堆栈时出错

我能否在 SAM 模板中使用 AWS Cloud Formation 资源语法,反之亦然?

CloudFormation - SAM 模板的结构无效。 “资源”部分是必需的

尝试通过 Elastic Bean 在 AWS 上部署我的应用程序时出错

转换速度模板时出错