【发布时间】:2021-02-14 09:01:09
【问题描述】:
我正在尝试在我的本地系统中创建一个应用程序并使用 SAM CLI 将其部署到 AWS 云。该应用程序的基本轮廓如图所示。
我为此应用程序创建了一个名为 myproj 的目录,所有子文件夹和文件如下图所示。
template.yaml 文件包含以下代码 -
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
myDB:
Type: AWS::Serverless::SimpleTable
Properties:
TableName: tabmine
PrimaryKey:
Name: id
Type: String
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
LambdaWrite:
Type: AWS::Serverless::Function
Properties:
CodeUri: functionWrite/
Handler: write.handler
Runtime: nodejs12.x
Events:
apiForLambda:
Type: Api
Properties:
Path: /writedb
Method: post
Policies:
DynamoDBWritePolicy:
TableName: !Ref myDB
LambdaRead:
Type: AWS::Serverless::Function
Properties:
CodeUri: functionRead/
Handler: read.handler
Runtime: nodejs12.x
Events:
apiForLambda:
Type: Api
Properties:
Path: /readdb
Method: post
Policies:
DynamoDBReadPolicy:
TableName: !Ref myDB
functionRead文件夹中,package.json有以下内容-
{
"name": "myproj",
"version": "1.0.0",
"description": "",
"main": "read.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"aws-sdk": "^2.783.0"
}
}
而read.js文件包含以下代码-
var AWS = require('aws-sdk');
var ddb = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context, callback) {
var ID = event.id;
var params = {
TableName: 'tabmine',
Key: {
'id': ID
}
};
ddb.get(params, callback);
};
在functionWrite文件夹中,package.json文件有如下内容-
{
"name": "myproj",
"version": "1.0.0",
"description": "",
"main": "write.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"aws-sdk": "^2.783.0"
}
}
并且文件write.js有以下内容-
var AWS = require('aws-sdk');
var ddb = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context, callback) {
var ID = event.id;
var NAME = event.name;
var params = {
TableName: 'tabmine',
Item: {
'id': ID,
'name': NAME
}
};
ddb.put(params, callback);
};
然后,我导航回终端中的 myproj 目录并运行命令sam build。
构建完成后,我运行命令sam deploy --guided 并按照步骤将堆栈部署到云端。然后,我检查了控制台以确认部署,并且成功。
然后,在终端中,我运行了 curl -X POST -d '{"id":"one","name":"john"}' https://0000000000.execute-api.ap-south-1.amazonaws.com/Prod/writedb。但我得到了{message : 'Internal server Error'}。
为了确认 lambda 和 dynamoDB 是否正确链接,我去了 Lambda 控制台并为名为 write.js 的 lambda 函数创建了一个测试事件相同的有效载荷{"id":"one","name":"john"}。它成功运行并将这两项输入到dyanmoDB表中。同样,我为名为 read.js 和有效负载 {"id":"one"} 的 lambda 函数创建了另一个 测试事件。它也成功运行并显示了数据。
为了确认 API 网关和 lambda 是否正确链接,我在 API 网关中对资源 /writedb 和 /readdb 进行了测试,但它给了我 {message : 'Internal server Error'}。
请帮我解决这个问题。
【问题讨论】:
-
我没有看到您在 template.yaml AWS::Serverless::Api 中声明 API Gateway 的部分,您可以包含它吗?否则你如何获得端点和舞台?
-
根据 AWS 文档 - 无需将 AWS::Serverless::Api 资源显式添加到 AWS 无服务器应用程序定义模板中。这种类型的资源是从模板中定义的 AWS::Serverless::Function 资源上定义的 Api 事件的联合隐式创建的,这些资源不引用 AWS::Serverless::Api 资源。见-docs.aws.amazon.com/serverless-application-model/latest/…。虽然我找到了解决这个问题的方法,但我将在答案中写出来。感谢您的关心。
标签: node.js aws-lambda amazon-dynamodb aws-api-gateway serverless-application-model