要启用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'
答案 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'
。
希望这会有所帮助!