はじめに
初投稿になるので何か指摘等あればよろしくお願いします。
このエラーについて (ValidationException)
Local環境でsamを利用してAPI経由でLambdaからDockerで建てたLocalのDynamodbにアクセスしている状況です。
Tableはaws-cliで作成し、lambdaからPutItemした時に起きたエラーです。
AWSの公式によると、
このエラーは、必須パラメータが指定されていない、値が範囲外である、データ型が一致しない、などいくつかの理由で発生します。エラーメッセージに、エラーを引き起こしたリクエストの特定部分に関する詳細が含まれています。
結論
Goの構造体の値がエクスポートされておらず、定義されていない状態でした。
なのでデータ型が一致せずにエラーが出たということです。
Dynamodbの項目が小文字から始まる場合、構造体のtagを指定することで解決できます。
(そもそも、項目を小文字から始めるのがよくないかも)
type Item struct {
Id string `dynamodbav:"id"`
Name string `dynamodbav:"name"`
}
item := Item{
Id: "0001",
Name: "John",
}
コード
aws dynamodb \
--region ap-northeast-1 \
--endpoint-url http://dynamodb:8000 \
create-table \
--table-name SampleTable \
--attribute-definitions \
AttributeName=id,AttributeType=S \
AttributeName=name,AttributeType=S \
--key-schema \
AttributeName=id,KeyType=HASH \
AttributeName=name,KeyType=RANGE \
--billing-mode PAY_PER_REQUEST
// aws-sdk-go-v1
// Connect dynamodb session
session := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
db := dynamodb.New(session, aws.NewConfig().WithRegion("ap-northeast-1").WithEndpoint("http://dynamodb:8000"))
type Item struct {
id string
name string
}
item := Item{
id: "0001",
name: "John",
}
av, err := dynamodbattribute.MarshalMap(item)
if err != nil {
return err
}
_, err = db.PutItem(&dynamodb.PutItemInput{
TableName: aws.String("SampleTable"),
Item: av,
})
if err != nil {
return err
}
最後に
とても初歩的なことだったんですが、あまり記事がなかったので誰かの早期解決に繋がれば幸いです。
参考文献