S3のVersioningを有効にしていると,aws s3 rm
とかやっても実体は削除されておらず,削除済みという目印(DeleteMarker)が付いた状態になります.
この状態で当該ファイルを取ろうとしても
uraura@rosemary$ aws s3api get-object --bucket target-bucket --key db.dump.gz ./db.dump.gz
A client error (NoSuchKey) occurred when calling the GetObject operation: The specified key does not exist.
と,悲しい思いをします.(まぁ削除したんだから当然ですね...)
そこで,DeleteMarkersの付いてないバージョンを調べます.
uraura@rosemary$ aws s3api list-object-versions --bucket target-bucket --prefix db.dump.gz
{
"DeleteMarkers": [
{
"Owner": {
"DisplayName": "admin",
"ID": "87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7"
},
"IsLatest": true,
"VersionId": "uZALiONs1lXzsJBvjv.jgnLSdBrHfCox",
"Key": "db.dump.gz",
"LastModified": "2015-10-30T17:55:38.000Z"
}
],
"CommonPrefixes": [],
"Versions": [
{
"LastModified": "2015-09-30T17:55:30.000Z",
"VersionId": "b8O0kCjQYrPvtMNXTGRayqRe.U11dxzx",
"ETag": "\"712fe04afa2e31dee3583dc6586bf74a-11\"",
"StorageClass": "STANDARD",
"Key": "db.dump.gz",
"Owner": {
"DisplayName": "admin",
"ID": "87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7"
},
"IsLatest": false,
"Size": 80885743
}
]
}
この場合は"VersionId": "b8O0kCjQYrPvtMNXTGRayqRe.U11dxzx"
でよさそうですのでバージョンまで指定して呼びだしてやりましょう.
uraura@rosemary$ aws s3api get-object --bucket target-bucket --key db.dump.gz --version-id b8O0kCjQYrPvtMNXTGRayqRe.U11dxzx ./db.dump.gz
{
"AcceptRanges": "bytes",
"ContentType": "binary/octet-stream",
"LastModified": "Wed, 30 Sep 2015 17:55:30 GMT",
"ContentLength": 80885743,
"VersionId": "b8O0kCjQYrPvtMNXTGRayqRe.U11dxzx",
"ETag": "\"712fe04afa2e31dee3583dc6586bf74a-11\"",
"Metadata": {}
}
まとめ
aws s3api
ってあんまり使ってなかったけど便利やん