AWS SAM模板中的Auth部分出现错误

时间:2019-05-02 05:13:04

标签: aws-sam

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

但是,我说错了

  

无法创建变更集:服务员ChangeSetCreateComplete失败:服务员遇到终端失败状态:失败。原因:转换AWS :: Serverless-2016-10-31失败,原因:无效的无服务器应用程序规范文档。发现的错误数量:1. ID为[ListFunction]的资源无效。 ID为[ListFunctionCors]的事件无效。 由于相关API未定义任何授权者,因此无法为路径[/ list]的API方法[选项]设置授权者[无]。

这是怎么了?

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'

2 个答案:

答案 0 :(得分:2)

我发现此问题的解决方案更多是一种解决方法。 您收到的错误消息的来源似乎是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 Dummy中添加了自定义lambda授权者,该授权者从未使用过。我使用了已经定义的lambda的arn,但是您可以创建一个占位符lambda来代替。

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

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

答案 1 :(得分:0)

就遇到了同样的问题,并弄清楚了。根据{{​​3}},该函数事件应为:

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

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

希望这会有所帮助!