特定のdynamodbテーブルに新しいものが追加されるたびにトリガーされるaws-sdk-goを使用して AWS-lambda をセットアップしようとしています。user
map[string]DynamoDBAttributeValue
すべてが正常に機能していますが、次のようなマップを非整列化する方法が見つかりません。
{
"name": {
"S" : "John"
},
"residence_address": {
"M": {
"address": {
"S": "some place"
}
}
}
}
たとえば、構造体などの特定の構造User
体。これは、特定のインターフェイスに aを非マーシャリングする例を示していますが、これらの型が同じ目的に適合しているように見えてもmap[string]*dynamodb.AttributeValue
、同じことを行う方法を見つけることができません。map[string]DynamoDBAttributeValue
map[string]DynamoDBAttributeValue
events.DynamoDBEvents
from packageによって返されますgithub.com/aws/aws-lambda-go/events
。これは私のコードです:
package handler
import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
"github.com/aws/aws-sdk-go/service/dynamodb"
)
func HandleDynamoDBRequest(ctx context.Context, e events.DynamoDBEvent) {
for _, record := range e.Records {
if record.EventName == "INSERT" {
// User Struct
var dynamoUser model.DynamoDBUser
// Of course this can't be done for incompatible types
_ := dynamodbattribute.UnmarshalMap(record.Change.NewImage, &dynamoUser)
}
}
}
もちろん、record.Change.NewImage
JSON にマーシャリングし、それを特定の構造体にアンマーシャリングすることはできますdynamoUser
が、後者の属性から手動で属性を初期化する必要があります。
または、次のように解析する関数を作成することもできますmap[string]DynamoDBAttributeValue
。map[string]*dynamodb.AttributeValue
func getAttributeValueMapFromDynamoDBStreamRecord(e events.DynamoDBStreamRecord) map[string]*dynamodb.AttributeValue {
image := e.NewImage
m := make(map[string]*dynamodb.AttributeValue)
for k, v := range image {
if v.DataType() == events.DataTypeString {
s := v.String()
m[k] = &dynamodb.AttributeValue{
S : &s,
}
}
if v.DataType() == events.DataTypeBoolean {
b := v.Boolean()
m[k] = &dynamodb.AttributeValue{
BOOL : &b,
}
}
// . . .
if v.DataType() == events.DataTypeMap {
// ?
}
}
return m
}
そして、単純に を使用dynamodbattribute.UnmarshalMap
しますが、events.DataTypeMap
これは非常にトリッキーなプロセスになります。
からの DynamoDB レコードをevents.DynamoDBEvent
構造体に非整列化する方法はありmap[string]*dynamodb.AttributeValue
ますか?