Go (AWS SDK v2) での DynamoDB Scan
Scan はテーブルまたはインデックス内のすべてのアイテムをページごとに読み取り、その後任意で FilterExpression によって行を除外します。AWS SDK for Go v2 では、組み込みの ScanPaginator がテーブル全体が読み取られるまで LastEvaluatedKey を追跡します。
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))
}Explanation
FilterExpression— 読み取り後に、サーバー側で適用されます。レスポンスを小さくしますが、コストは減りません。フィルターの有無にかかわらず、スキャンしたすべてのアイテムの読み取り分を支払います。ExpressionAttributeNames— フィルター対象の属性はエイリアス化され(#filter0→Year)、Yearのような予約語を安全に扱えます。- ページネーション — 各
Scanページはフィルター 前 に最大 1 MB を読み取るため、テーブルにまだ一致するものがあってもフィルター後のページが空で返ってくることがあります。dynamodb.NewScanPaginatorはLastEvaluatedKeyが尽きるまで呼び出しを続けます。最初のページで止めてはいけません。 - ページごとにスキャンされるアイテム数(フィルター前)を制限するには
Limitを設定します。返されるアイテム数は制限しません。 - 大きなフルテーブルスキャンでは、
Segment/TotalSegmentsでゴルーチン間に作業を分割します(並列スキャン)。 Queryを優先しましょう。Scanはテーブル全体を読み取ります。ごく小さいテーブル以外では遅く、コストがかかります。
Do it visually
フィルターを手作業で組み立てていますか?DynamoDB Expression Builder は FilterExpression + 名前/値のマップを構築し、実行可能なコードをコピーします。
GUI でテーブルを探索するには(フィルターされページネーションされた結果グリッド、コードとしてコピー)、スクリプトから闇雲にスキャンする代わりに DynoTable をダウンロードしてください。
Related examples
- DynamoDB Scan in Java — AWS SDK for Java 2.x による同じスキャン。
- DynamoDB Query in Go — 通常選ぶべきより安価な読み取り。
- Query vs. Scan — (まれに)
Scanが正当化されるのはどんなときか。 - Why is my DynamoDB Scan slow and expensive? — コストモデルとその回避方法。
- DynamoDB ProvisionedThroughputExceededException — フルテーブルスキャンがプロビジョンドテーブルのキャパシティに何をするか。
- DynamoDB ThrottlingException — もう1つのスロットルと、指数バックオフによる対処法。
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
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。