AWS SAM模板-本地测试

时间:2018-11-21 23:35:12

标签: amazon-web-services aws-serverless

我有一个AWS SAM模板,我正在尝试在本地进行测试然后进行部署。运行本地测试(sam local start-api),但未验证有效负载。这意味着我有一个RequestValidator,但是它没有验证任何东西。

然后,我尝试将YAML文件部署到AWS进行测试,然后显示一条错误消息:

  

“无法创建变更集:服务员ChangeSetCreateComplete   失败:服务员遇到终端失败状态,状态:失败。   原因:转换AWS :: Serverless-2016-10-31失败,原因:无效   无服务器应用程序规范文档。发现的错误数:   1. ID为[BoilerPlateFunction]的资源无效。 ID为[ApiEvent]的事件无效。 Api事件的RestApiId属性必须引用   同一模板中的有效资源。”

这是我的yaml文件,因此首先,我希望能够使RequestValidator在本地工作,一旦完成,就知道我做错了什么以及为什么不能部署:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-app

  Sample SAM Template for sam-app

Globals:
  Function:
    Timeout: 20
Parameters:
  operationName:
    Type: String
    Default: testoperationName
  restApiName:
    Type: String
    Default: testrestApiName
  validatorName:
    Type: String
    Default: testvalidatorName
  validateRequestBody:
    Type: String
    Default: testvalidateRequestBody
  validateRequestParameters:
    Type: String
    Default: true
Resources:
  BoilerPlateApi:
    Type: AWS::ApiGateway::Api
    Properties:
      Name: !Ref restApiName
  BoilerPlateFunctionMethod:
    Type: AWS::ApiGateway::Method
    Properties:
      HttpMethod: ANY
      RestApiId: !Ref BoilerPlateApi
      RequestValidatorId: !Ref RequestValidator
      RequestParameters:
        method.request.querystring.test: true
  RequestValidator:
    Type: AWS::ApiGateway::RequestValidator
    Properties:
      Name: !Ref validatorName
      RestApiId: !Ref BoilerPlateApi
      ValidateRequestParameters: !Ref validateRequestParameters
  BoilerPlateFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: boilerplate/apiName
      Handler: index.handler
      Runtime: nodejs8.10
      Events:
        ApiEvent:
          Type: Api
          Properties:
            RestApiId: !Ref BoilerPlateApi
            Path: /hello
            Method: GET

因此,再次使用sam local start-api运行,我可以命中端点并执行Lambda。但是,如果我在查询字符串中不包含“ test”参数,但我希望API网关抛出错误,但是不会,它会让它通过。

谢谢大家!

1 个答案:

答案 0 :(得分:0)

该功能已在API网关之前创建。 您可以在方法之前使用 DependsOn 参数创建API

因此,只需将BoilerPlateFunction资源中的以下内容更改为:

  BoilerPlateFunction:
    DependsOn:
      - BoilerPlateApi
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: boilerplate/apiName
      Handler: index.handler
      Runtime: nodejs8.10
      Events:
        ApiEvent:
          Type: Api
          Properties:
            RestApiId: !Ref BoilerPlateApi
            Path: /hello
            Method: GET