如何使用无服务器功能,说不存在
How to use Serverless functions, says doesn't exist
我正在尝试部署我的第一个无服务器项目,并想让它更新我的 dynamodb 中的一个简单项目。所以我开始在serverless.yml:
做一个简单的服务
service: serverless
provider:
name: aws
runtime: nodejs4.3
iamRoleStatements:
- Effect: "Allow"
Resource: "*"
Action:
- "dynamodb:*"
functions:
createMovie:
handler: handler.createMovie
events:
- http:
path: movies/create
method: post
integration: lambda
cors: true
然后我在网上找到了更多代码来 link 我的应用程序的 dynamodb 部分并将其添加到底部的 serverless.yml 中:
资源:
Resources:
DynamoDbTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: moviesTwo
AttributeDefinitions:
- AttributeName: movieTitle
AttributeType: S
KeySchema:
- AttributeName: movieTitle
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
DynamoDBIamPolicy:
Type: AWS::IAM::Policy
DependsOn: DynamoDbTable
Properties:
PolicyName: lambda-dynamodb
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- dynamodb:GetItem
- dynamodb:PutItem
Resource: arn:aws:dynamodb:*:*:table/moviesTwo
Roles:
- Ref: IamRoleLambdaExecution
我在handler.js中的函数是:
module.exports.createMovie = (event, context, cb) => {
const params = {
TableName: 'movies',
Item: {
"movieTitle": "Star Wars"
}
};
return dynamo.put(params, cb);
};
我 运行 无服务器部署,它在很多层面上都有效。为我创建了我的 lambda,给了我一个端点和函数:
endpoints: POST -
https://tbwg38fvc0.execute-api.us-east-1.amazonaws.com/dev/movies/create
functions: serverless-dev-hello serverless-dev-createMovie
但是我 运行 在 postman 中遇到了内部服务器错误,我尝试调用:
无服务器调用-f serverless-dev-createMovie -l
它说:
Serverless Error ---------------------------------------
Function "serverless-dev-createMovie" doesn't exist
in this Service
所以我很困惑我做错了什么。 AWS 中是否还有其他我缺少的设置需要设置才能调用才能工作?
我认为这里有两个问题。
函数名是'createMovie'所以你需要说:serverless invoke -f createMovie -l
检查 Cloudwatch 日志以了解内部服务器错误。我猜这是 dynamodb table 名称。您已创建 'moviesTwo',但您有
TableName: 'movies'
希望对您有所帮助。
你可以试试
serverless deploy list functions
查看部署的函数,以便进一步调试问题。
我正在尝试部署我的第一个无服务器项目,并想让它更新我的 dynamodb 中的一个简单项目。所以我开始在serverless.yml:
做一个简单的服务service: serverless
provider:
name: aws
runtime: nodejs4.3
iamRoleStatements:
- Effect: "Allow"
Resource: "*"
Action:
- "dynamodb:*"
functions:
createMovie:
handler: handler.createMovie
events:
- http:
path: movies/create
method: post
integration: lambda
cors: true
然后我在网上找到了更多代码来 link 我的应用程序的 dynamodb 部分并将其添加到底部的 serverless.yml 中: 资源:
Resources:
DynamoDbTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: moviesTwo
AttributeDefinitions:
- AttributeName: movieTitle
AttributeType: S
KeySchema:
- AttributeName: movieTitle
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
DynamoDBIamPolicy:
Type: AWS::IAM::Policy
DependsOn: DynamoDbTable
Properties:
PolicyName: lambda-dynamodb
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- dynamodb:GetItem
- dynamodb:PutItem
Resource: arn:aws:dynamodb:*:*:table/moviesTwo
Roles:
- Ref: IamRoleLambdaExecution
我在handler.js中的函数是:
module.exports.createMovie = (event, context, cb) => {
const params = {
TableName: 'movies',
Item: {
"movieTitle": "Star Wars"
}
};
return dynamo.put(params, cb);
};
我 运行 无服务器部署,它在很多层面上都有效。为我创建了我的 lambda,给了我一个端点和函数:
endpoints: POST - https://tbwg38fvc0.execute-api.us-east-1.amazonaws.com/dev/movies/create functions: serverless-dev-hello serverless-dev-createMovie
但是我 运行 在 postman 中遇到了内部服务器错误,我尝试调用: 无服务器调用-f serverless-dev-createMovie -l 它说:
Serverless Error ---------------------------------------
Function "serverless-dev-createMovie" doesn't exist in this Service
所以我很困惑我做错了什么。 AWS 中是否还有其他我缺少的设置需要设置才能调用才能工作?
我认为这里有两个问题。
函数名是'createMovie'所以你需要说:
serverless invoke -f createMovie -l
检查 Cloudwatch 日志以了解内部服务器错误。我猜这是 dynamodb table 名称。您已创建 'moviesTwo',但您有
TableName: 'movies'
希望对您有所帮助。
你可以试试
serverless deploy list functions
查看部署的函数,以便进一步调试问题。