AWS SAM 模板 - 本地测试

Posted

技术标签:

【中文标题】AWS SAM 模板 - 本地测试【英文标题】:AWS SAM Template - Local Testing 【发布时间】:2019-04-24 14:31:21 【问题描述】:

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

然后,我尝试将 YAML 文件部署到 AWS 以在那里进行测试,我收到一条错误消息:

"创建变更集失败:Waiter ChangeSetCreateComplete 失败:服务员遇到终端故障状态状态:FAILED。 原因:转换 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】:

该函数已在 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

【讨论】:

以上是关于AWS SAM 模板 - 本地测试的主要内容,如果未能解决你的问题,请参考以下文章

如何从 AWS SAM 本地 docker 实例连接到主机 MySQL?

AWS CDK - 如何在本地运行 API 和 Lambda?

AWS SAM-获取错误消息:pywintypes.error:(5,'CreateFile','访问被拒绝。')

在本地测试 Elasticache 和无服务器 AWS Lambda

AWS SAM:请求的资源响应中不存在“Access-Control-Allow-Origin”标头

AWS SAM 模板中的 Auth 部分出错