当前位置: 首页 > 知识库问答 >
问题:

使用AWS SAM时,无法测试引用DynamoDB表的本地Lambda

万俟华辉
2023-03-14

我创建了“快速启动:Web后端”AWS SAM项目,其中包含一个使用SAM init SAM app的DynamoDB表。

按照自述文件中的说明,当我尝试构建并调用引用Dynamo表的lambda函数时:

sam build
sam local invoke getAllItemsFunction --event events/event-get-all-items.json

我得到一个未找到请求的资源错误:

Invoking src/handlers/get-all-items.getAllItemsHandler (nodejs12.x)

Fetching lambci/lambda:nodejs12.x Docker container image......
Mounting /Users/dev/lab/sam-app/.aws-sam/build/getAllItemsFunction as /var/task:ro,delegated inside runtime container
START RequestId: bd1dd37e-d464-13c1-45da-a4d427db1e84 Version: $LATEST
2020-07-12T23:33:50.674Z    bd1dd37e-d464-13c1-45da-a4d427db1e84    INFO    received: { httpMethod: 'GET' }
2020-07-12T23:33:50.812Z    bd1dd37e-d464-13c1-45da-a4d427db1e84    ERROR   Invoke Error    {"errorType":"ResourceNotFoundException","errorMessage":"Requested resource not found","code":"ResourceNotFoundException","message":"Requested resource not found","time":"2020-07-12T23:33:50.809Z","requestId":"E711QAGJJAH7FDFSIU8PR88053VV4KQNSO5AEMVJF66Q9ASUAAJG","statusCode":400,"retryable":false,"retryDelay":26.07018253857256,"stack":["ResourceNotFoundException: Requested resource not found","    at Request.extractError (/var/task/node_modules/aws-sdk/lib/protocol/json.js:51:27)","    at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:106:20)","    at Request.emit (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:78:10)","    at Request.emit (/var/task/node_modules/aws-sdk/lib/request.js:688:14)","    at Request.transition (/var/task/node_modules/aws-sdk/lib/request.js:22:10)","    at AcceptorStateMachine.runTo (/var/task/node_modules/aws-sdk/lib/state_machine.js:14:12)","    at /var/task/node_modules/aws-sdk/lib/state_machine.js:26:10","    at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:38:9)","    at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:690:12)","    at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"]}

示例项目包含3个lambda函数,它们调用DynamoDb后端(为清晰起见进行了修剪):

AWSTemplateFormatVersion: 2010-09-09
Description: >-
  sam-ap

Transform:
- AWS::Serverless-2016-10-31

Resources:
  getAllItemsFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: src/handlers/get-all-items.getAllItemsHandler
      Runtime: nodejs12.x
      MemorySize: 128
      Timeout: 100
      Description: A simple example includes a HTTP get method to get all items from a DynamoDB table.
      Policies:
        # Give Create/Read/Update/Delete Permissions to the SampleTable
        - DynamoDBCrudPolicy:
            TableName: !Ref SampleTable
      Environment:
        Variables:
          # Make table name accessible as environment variable from function code during execution
          SAMPLE_TABLE: !Ref SampleTable
      Events:
        Api:
          Type: Api
          Properties:
            Path: /
            Method: GET

  SampleTable:
    Type: AWS::Serverless::SimpleTable
    Properties:
      PrimaryKey:
        Name: id
        Type: String
      ProvisionedThroughput:
        ReadCapacityUnits: 2
        WriteCapacityUnits: 2

Outputs:
  WebEndpoint:
    Description: "API Gateway endpoint URL for Prod stage"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/"

我的假设是DynamoDB表不是在AWS测试docker容器中本地创建的。在本地测试DynamoDB时,是否还缺少其他构建步骤或其他定义文件?

共有1个答案

邹驰
2023-03-14

我的假设是DynamoDB表不是在AWS测试docker容器中本地创建的。在本地测试DynamoDB时,是否还缺少其他构建步骤或其他定义文件?

sam本地调用仅用于在本地调用lambda函数,而不是创建本地DynamoDb。

本地DynamoDb应该手动设置,例如使用docker映像或java:

  • 安装DynamoDB Docker映像
  • 在计算机上本地部署DynamoDB

如何使用您的本地函数与本地DynamoDb显示在AWS博客文章和其他资源,例如:

  • 新增–AWS SAM本地版(测试版)–本地构建和测试无服务器应用程序
 类似资料:
  • 我正在使用DynamoDB local进行单元测试。这并不坏,但也有一些缺点。明确地: 在测试运行之前,您必须以某种方式启动服务器 服务器在每次测试之前不会启动和停止,因此测试会变得相互依赖,除非在每次测试之后添加代码删除所有表等 所有开发者都需要安装它 我想做的是把DynamoDB本地jar和它所依赖的其他jar放在我的目录中(我用Java写)。然后在每次测试之前,我会启动它,用运行,测试结束后

  • 我已经在本地运行了DynamoDB,并使用shell(localhost:8000/shell/)创建了一个表。 [Mon Decc 14 11:22:48.266930 2015][:错误][pid 12][client 10.0.2.2:58042]PHP致命错误:未捕获AWS\DynamODB\Exception\ResourceNotFoundException:AWS错误代码:Resou

  • 问题内容: 给出以下代码: 我的IDE没有给我任何错误。也就是说,直到我尝试构建项目并运行它。当我这样做时,它给了我一个看起来像这样的编译器错误: 现在,我得到了错误消息,如果foo()是静态的,则不会发生这种情况。没错,这仅在foo()是实例方法的情况下才会发生。并且仅当LocalFoo是实例方法中的本地类时才发生,并且仅当使用构造函数引用时(即从不使用常规方法引用)才发生。 更重要的是,如果我

  • 问题是,当我开枪的时候 我如何在本地设置测试的头?(再一次,我不是一个专业人士,我猜当我决定在生产中部署时,我会有相同的起源。如果不是,无论如何,我仍然需要解决方案)

  • 我试图通过触发Python lambda表达式以编程方式将数据放入本地运行的DynamoDB容器中。 我正在尝试遵循此处提供的模板:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.03.html 我使用的是amazon/dynamodb local,您可以在此处下载:htt

  • 我无法在浏览器堆栈上运行本地测试(例如http://localhost:3000)。我正在使用LinuxMint 18.3 Sylvia x64。浏览器Chromium。浏览器的扩展程序(应用程序)已安装。 屏幕截图显示没有连接。http://joxi.ru/Y2LJBv0H9MBv8r 复选框已选中。http://joxi.ru/1A5PvVpCnzMww2 我试过这个手册https://www