Go (AWS SDK v2) での DynamoDB DeleteItem
client.DeleteItem は完全なプライマリキーを載せた dynamodb.DeleteItemInput を受け取ります。types.ReturnValueAllOld を使えば、そもそも何かがそこにあったのかどうかがレスポンスから分かります。さらに ConditionExpression を足せば、なぜ残ったのかがエラーから分かります。
コード
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)
out, err := client.DeleteItem(ctx, &dynamodb.DeleteItemInput{
TableName: aws.String("Music"),
Key: map[string]types.AttributeValue{
"Artist": &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
"SongTitle": &types.AttributeValueMemberS{Value: "Cubano Chant"},
},
ReturnValues: types.ReturnValueAllOld,
})
if err != nil {
log.Fatalf("delete item: %v", err)
}
if len(out.Attributes) == 0 {
fmt.Println("No item with that key existed")
} else {
fmt.Println("Deleted:", out.Attributes)
}
}解説
types.ReturnValueAllOldは型付きの定数であり、文字列の"ALL_OLD"ではありません。フィールドがtypes.ReturnValueを取るので、タイプミスは実行時のValidationExceptionではなくコンパイルエラーになります。DeleteItemが受け付けるのはNONEとALL_OLDだけで、列挙型の残りはUpdateItemと共有されています。- 得られるシグナルは
len(out.Attributes) == 0だけです。もともと存在しなかったキーの削除も成功し、SDK はエラーではなく nil のマップを返します。「削除した」と「削除するものがなかった」を分けるものは他にありません。 - ガードの失敗は
errors.Asで照合します。var ccfe *types.ConditionalCheckFailedExceptionとしてからerrors.As(err, &ccfe)です。Go v2 はサービスの障害を Smithy のオペレーションエラーで包むので、直接比較では取り逃がします。 - 例外は負けたアイテムを運べます。
ReturnValuesOnConditionCheckFailure: types.ReturnValuesOnConditionCheckFailureAllOldを設定すると、ccfe.Itemが DynamoDB から見えていたままの行を保持するので、読み直さずに、実際にガードを通らなかった値をログに出せます。SDK はその代償も明記しています: "No read capacity units are consumed." - 1 回の呼び出しにつき 1 アイテム。全件削除の API はありません。多数のアイテムを削除するには、まずキーを集めて書き込みをバッチにするか、テーブルごと捨てるかです。
ビジュアルに行う
面倒なのはガードの側です。ConditionExpression と、それに付随する名前と値のマップ。DynamoDB Expression Builder はその 3 つすべてをフォームから組み立てます。
DynoTable は同じリスクに反対側から取り組みます。削除はまず Pending changes パネルに入り、コミットして初めてテーブルに届くので、間違った行は復元するものではなく破棄するものになります。DynoTable をダウンロード。
関連する例
- Java での DynamoDB DeleteItem — AWS SDK for Java 2.x での同じ削除。
- Go での DynamoDB PutItem — 同じキーの書き込み側。
- DynamoDB の条件式 —
attribute_existsと値のチェックで削除をガードする。 - DynamoDB ConditionalCheckFailedException — 条件付き削除が失敗したときに何が投げられるか、そしてそれが想定内なのはどんなときか。
参考資料
- DeleteItem — Amazon DynamoDB API Reference
- Use DeleteItem 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)
- Condition expressions — Amazon DynamoDB Developer Guide
最終検証日 2026-07-28、上記にリンクした公式 AWS ドキュメントに照らして確認しました。