25

特定の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]DynamoDBAttributeValueevents.DynamoDBEventsfrom 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.NewImageJSON にマーシャリングし、それを特定の構造体にアンマーシャリングすることはできますdynamoUserが、後者の属性から手動で属性を初期化する必要があります。

または、次のように解析する関数を作成することもできますmap[string]DynamoDBAttributeValuemap[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ますか?

4

2 に答える 2