Scan DynamoDB en Go (AWS SDK v2)
Scan lit chaque élément d'une table ou d'un index, page par page, puis élimine optionnellement des lignes avec une FilterExpression. Dans AWS SDK pour Go v2, le ScanPaginator intégré suit LastEvaluatedKey jusqu'à ce que toute la table soit lue.
Code
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)
func main() {
ctx := context.TODO()
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1"))
if err != nil {
log.Fatalf("load config: %v", err)
}
client := dynamodb.NewFromConfig(cfg)
paginator := dynamodb.NewScanPaginator(client, &dynamodb.ScanInput{
TableName: aws.String("Music"),
FilterExpression: aws.String("#filter0 >= :filterValue0"),
ExpressionAttributeNames: map[string]string{
"#filter0": "Year",
},
ExpressionAttributeValues: map[string]types.AttributeValue{
":filterValue0": &types.AttributeValueMemberN{Value: "2010"},
},
})
var items []map[string]types.AttributeValue
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
log.Fatalf("scan: %v", err)
}
items = append(items, page.Items...)
}
fmt.Printf("Matched %d items\n", len(items))
}Explication
FilterExpression— appliquée après la lecture, côté serveur. Elle réduit la réponse mais pas le coût : tu paies pour lire chaque élément scanné, filtré ou non.ExpressionAttributeNames— l'attribut filtré est aliasé (#filter0→Year), ce qui met à l'abri les mots réservés commeYear.- Pagination — chaque page de
Scanlit au plus 1 Mo avant filtrage, donc une page filtrée peut revenir vide alors que la table contient encore des correspondances.dynamodb.NewScanPaginatorcontinue d'appeler jusqu'à épuisement deLastEvaluatedKey— ne t'arrête jamais à la première page. - Fixe
Limitpour plafonner le nombre d'éléments scannés par page (avant filtrage) — il ne plafonne pas le nombre d'éléments renvoyés. - Pour un gros scan de table complète, répartis le travail entre des goroutines avec
Segment/TotalSegments(un scan parallèle). - Préfère
Query.Scanlit toute la table ; sur autre chose qu'une table minuscule, c'est lent et coûteux.
À faire visuellement
Tu assembles un filtre à la main ? Le DynamoDB Expression Builder construit la FilterExpression + les maps de noms/valeurs et copie du code exécutable.
Pour explorer des tables dans une interface graphique — avec des grilles de résultats filtrées et paginées, et la copie du code — télécharge DynoTable, au lieu de scanner à l'aveugle depuis un script.
Exemples liés
- Scan DynamoDB en Java — le même scan avec AWS SDK pour Java 2.x.
- Query DynamoDB en Go — la lecture moins chère vers laquelle tu devrais généralement te tourner.
- Query vs. Scan — quand (rarement) un
Scanest justifié. - Pourquoi mon Scan DynamoDB est-il lent et coûteux ? — le modèle de coût et comment l'éviter.
- DynamoDB ProvisionedThroughputExceededException — ce qu'un scan de table complète fait à la capacité d'une table provisionnée.
- DynamoDB ThrottlingException — l'autre étranglement, et comment le backoff exponentiel le gère.
References
- Scan — Amazon DynamoDB API Reference
- Use Scan with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- dynamodb/types package — AWS SDK for Go v2 (pkg.go.dev)
- Scanning tables — Amazon DynamoDB Developer Guide
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.