如何修复 AWS Lambda 处理程序和 DynamoDB Put 请求的错误?

huangapple go评论73阅读模式
英文:

How to fix error with AWS Lambda handler, DynamoDB Put req?

问题

尝试创建一个与我的DynamoDB交互的Lambda函数。
这个特定的Lambda函数是用来将一个项目写入DB的:

package main

import (
	"fmt"

	"github.com/aws/aws-lambda-go/lambda"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/dynamodb"
	"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)

type Item struct {
	Email    string `json:"email"`
	Password string `json:"password"`
	Rname    string `json:"rname"`
}

func Put() error {

	// 创建一个会话 - 伦敦地区
	session, err := session.NewSession(&aws.Config{
		Region: aws.String("eu-west-2")},
	)
	if err != nil {
		fmt.Println(err)
	}

	svc := dynamodb.New(session)

	// 创建Item结构的实例
	item := Item{
		Email:    "123@mail.com",
		Password: "12345678",
		Rname:    "abcde",
	}

	// 将Item进行编组
	av, err := dynamodbattribute.MarshalMap(item)

	if err != nil {
		fmt.Println("Got error marshalling map:")
		fmt.Println(err)
	}

	// 创建Item
	input := &dynamodb.PutItemInput{
		Item:      av,
		TableName: aws.String("accountsTable"),
	}

	_, err = svc.PutItem(input)

	if err != nil {
		fmt.Println("Got error calling PutItem:")
		fmt.Println(err)
	}
	return err
}

func main() {
	lambda.Start(Put())
}

然而,出现了以下错误:

{
  "errorMessage": "handler is nil",
  "errorType": "errorString"
}

我已经在运行时设置中将处理程序更改为main,所以不认为这是问题所在。

使用以下命令构建:

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -a main.go

并通过控制台将可执行文件的zip文件放入AWS(没有IAC)。

非常感谢您提供帮助以解决此错误!谢谢。

英文:

Trying to create a Lambda to interact with my DynamoDB.
This specific Lambda is to put/write an item to the DB:

package main
import (
"fmt"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)
type Item struct {
Email    string `json:"email"`
Password string `json:"password"`
Rname    string `json:"rname"`
}
func Put() error {
// Create a session - London Region
session, err := session.NewSession(&aws.Config{
Region: aws.String("eu-west-2")},
)
if err != nil {
fmt.Println(err)
}
svc := dynamodb.New(session)
// Create instance of Item Struct
item := Item{
Email:    "123@mail.com",
Password: "12345678",
Rname:    "abcde",
}
// Marshall Item
av, err := dynamodbattribute.MarshalMap(item)
if err != nil {
fmt.Println("Got error marshalling map:")
fmt.Println(err)
}
// Create Item
input := &dynamodb.PutItemInput{
Item:      av,
TableName: aws.String("accountsTable"),
}
_, err = svc.PutItem(input)
if err != nil {
fmt.Println("Got error calling PutItem:")
fmt.Println(err)
}
return err
}
func main() {
lambda.Start(Put())
}

However getting the error:

{
"errorMessage": "handler is nil",
"errorType": "errorString"
}

I have changed the handler in run time settings to main too so don't think that would be the issue.

Building with:

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -a main.go

and putting the zip of the executable into AWS via console (no IAC's)

Any help would be greatly appreciated to resolve this error! Thanks.

答案1

得分: 1

你需要传递函数句柄而不是函数结果给lambda.Start

请使用以下代码更新你的主函数:

func main() {
    lambda.Start(Put)
}
英文:

You need to pass function handle not function result to lambda.Start

Please update your main function with👇

func main() {
lambda.Start(Put)
}

huangapple
  • 本文由 发表于 2022年12月30日 03:26:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/74955288.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定