📤

バージョニングを有効にしたS3バケットのオブジェクトをaws-sdk-go-v2を使って空にする

2021/12/21に公開

AWS S3 にはバージョニングという機能が備わっている。有効にするとオブジェクトを誤って削除したり上書きしても元に戻せるようになる。

バージョニングを有効にしたバケットではオブジェクトの削除も取り消せる。上にあげたバージョニングのページによると、削除マーカーというものを挿入することで削除を表現しているためだ。

オブジェクトを削除した場合、Amazon S3 は、オブジェクトを完全に削除する代わりに削除マーカーを挿入します。その削除マーカーが、最新のオブジェクトバージョンになります。

さて、普段使いでは便利なバージョニングだが、バケットの中のオブジェクトが全て不要になったときにどのように消せばよいか。通常の削除操作では、削除マーカーが追加されるだけだ。

バージョニングが有効なバケットからのオブジェクトバージョンの削除というページにあるとおり、通常のようにKeyを指定してオブジェクト削除するのではなく、KeyとVersionIdの2つを指定してオブジェクト削除すると、バケットからオブジェクトを取り除ける。

バージョニングをしたバケットを空にするGoのSDKを利用したコードが見つけられなかったので、自分で書いたものをこの記事の最後に置いておく。

ListObjectVersions のレスポンスには削除対象のオブジェクト情報が 2 つの要素 VersionsDeleteMarkers に格納されているので、双方を削除対象に加えるというところがややトリッキーで戸惑った。

for _, version := range listObjectVersionsOutput.Versions {
	objectIdentifier := types.ObjectIdentifier{
		Key:       version.Key,
		VersionId: version.VersionId,
	}
	result[bucketName] = append(result[bucketName], objectIdentifier)
}
for _, deleteMarker := range listObjectVersionsOutput.DeleteMarkers {
	objectIdentifier := types.ObjectIdentifier{
		Key:       deleteMarker.Key,
		VersionId: deleteMarker.VersionId,
	}
	result[bucketName] = append(result[bucketName], objectIdentifier)
}

また、1回のリクエストで返ってくる要素の上限は MaxKey という値で定まっていて、最大でも 1000 だが、VersionsDeleteMarkers が混在するときの要素数はどのように計算されるか?
例えば Versions が 400 要素レスポンスに含まれているとき、DeleteMarkers は残り何要素同一レスポンスに入ってくるか。1000 か、600 か。という点が疑問だった。
これは実際の動きから想像すると VersionsDeleteMarkers の合計が MaxKey を超えないようになっているようだ。つまり Versions が 400 要素レスポンスに含まれていたとき、DeleteMarkers は最大 600 要素同一レスポンスに含まれる。

GitHubで編集を提案

Discussion