1

为了启用 AWS_IAM auth 和 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'
4

2 回答 2

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'

希望这可以帮助!

于 2019-05-31T03:41:19.413 回答
2

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

据我了解,当您选择具有除以下之外的方法授权者时,不允许出现 3 种情况AWS_IAM: 1. 未定义授权者 2. 选择已NONE定义授权者中不存在的授权者 3. 选择NONE作为授权者而不设置授权者默认授权人。

上述情况不处理AWS_IAM授权人的情况。它是唯一类型的授权人,它只设置为,DefaultAuthorizer而不必在授权人字典中列出。

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

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

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 来代替使用。

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

注意:nullAuthorizer 的值是在最初的 GitHub 问题中提出的,但在实现中他们追求的是NONE价值,正如文档中所描述的那样。

于 2019-07-04T15:20:42.397 回答