DynamoDB Localを使ってローカルでテストしようとしたとき、データセットをDynamoDBから落としてきて突っ込もうとした。 最初aws-sdk-goの BatchWriteItem で書き込もうとしたら、1度に処理できる最大件数が25件だった。 これはAPIのクウォータなのでaws cliでも同じ。 分割して実行すればいいのだが、サボって guregu/dynamo を使った。guregu/dynamo も中で分割して実行している。 "name","props" "駒場","[{""M"":{""available"":{""BOOL"":true},""color"":{""S"":""blue""},""distance"":{""N"":12345}}]" "三田","[{""M"":{""available"":{""BOOL"":false},""color"":{""S"":""green""},""distance"":{""N"":9999}}]" ... package main import ( "context" "encoding/csv" "encoding/json" "fmt" "log" "os" "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" "github.com/guregu/dynamo" ) const region = "ap-northeast-1" func main() { ctx := context.Background() conf := &aws.Config{ Region: aws.String(region), DisableSSL: aws.Bool(true), Endpoint: aws.String("http://localhost:8000"), } ses, err := session.NewSession(conf) if err != nil { log.Fatal(err) } client := dynamo.New(ses) dynamoTable := client.Table("dev_multilang_verdy_t") records, err := createRecords() if err != nil { log.Fatal(err) } putValues := make([]interface{}, len(records)) for i, v := range records { putValues[i] = v } wrote, err := dynamoTable.Batch().Write().Put(putValues...).RunWithContext(ctx) if err != nil { log.Fatalf("cannot write items: %v", err) } fmt.Printf("Wrote %d records\n", wrote) } type record struct { Name string `dynamo:"name"` Props []property `dynamo:"props"` } type property struct { Available bool `dynamo:"available"` Color string `dynamo:"color"` Distance int `dynamo:"distance"` } func createRecords() ([]record, error) { f, err := os.Open("records.csv") if err != nil { return nil, err } c := csv.NewReader(f) records, err := c.ReadAll() if err != nil { return nil, fmt.Errorf("cannot read csv: %w", err) } dynamoRec := make([]record, 0) header := true for _, v := range records { if header { header = false continue } name := v[0] item := v[1] // まずAttributeValueにUnmarshalしてから、他のstructに変換する var atvs []*dynamodb.AttributeValue if err := json.Unmarshal([]byte(item), &atvs); err != nil { return nil, fmt.Errorf("cannot unmarshal json: %w", err) } var prop []property if err := dynamodbattribute.UnmarshalList(atvs, &prop); err != nil { return nil, fmt.Errorf("cannot unmarshal dynamodbattribute: %w", err) } dynamoRec = append(dynamoRec, record{ Name: name, Props: prop, }) } return dynamoRec, nil }