我创建了“快速入门:Web后端” AWS SAM项目,该项目使用sam init sam-app
插入了DynamoDB表。
按照自述文件中的说明,当我尝试构建并调用引用Dynamo表的lambda函数时:
sam build
sam local invoke getAllItemsFunction --event events/event-get-all-items.json
我收到一个Requested resource not found
错误:
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测试泊坞容器内本地创建的。 我缺少在本地测试DynamoDB的另一个构建步骤或其他定义文件吗?
答案 0 :(得分:1)
我的假设是DynamoDB表不是在AWS测试泊坞容器内本地创建的。我缺少在本地测试DynamoDB的另一个构建步骤或其他定义文件吗?
是的。 sam local invoke
仅用于在本地调用lambda函数,而不用于创建本地DynamoDb。
本地DynamoDb应该手动设置,例如使用docker映像或java:
如何在本地DynamoDb中使用本地功能,请参见AWS博客文章和其他资源,例如: