S3でバージョニングを有効にした時に以前のバージョンに戻す方法

2016–12–13

S3のバージョニングの機能は知っていたのですが、 古いバージョンをリストアする方法をちゃんと調べていませんでした。

バックアップとっててリストアできないなんて、最低ですね。

バージョニングが有効なバケットを作成する

まずはバージョニングが有効なS3バケットを作成しましょう。 今回もTerraformでお手軽に作っていきます。

resource "aws_s3_bucket" "version-test" {
    bucket = "gside-version-test"
    acl = "private"
    versioning {
        enabled = true
    }
}	  

ファイルをアップロードする。

適当なファイルを作ってS3にアップします。

$ echo "hoge" > ~/hoge.txt
$ aws s3 cp ~/hoge.txt s3://gside-version-test/	  

aws s3api コマンドでバージョン情報を見てみます。

$ aws s3api list-object-versions --bucket gside-version-test
{
    "Versions": [
        {
            "VersionId": "i4ngO7osXqV4GrFoXpHzblnWD7y3jIRa",
            "Owner": {
                "DisplayName": "foobar",
                "ID": "2614e1fe5abbd1f85bc3c9b930b22f8f4f6eced59986b995b5e38cf655d7a7e0"
            },
            "LastModified": "2016-12-11T13:16:50.000Z",
            "StorageClass": "STANDARD",
            "ETag": "\"c59548c3c576228486a1f0037eb16a1b\"",
            "Key": "hoge.txt",
            "IsLatest": true,
            "Size": 5
        }
    ]
}	  

ファイルを更新して、バージョン情報を見てみます。

$ echo "fuga" > ~/hoge.txt
$ aws s3 cp ~/hoge.txt s3://gside-version-test/
$ aws s3api list-object-versions --bucket gside-version-test
{
    "Versions": [
        {
            "LastModified": "2016-12-11T13:18:01.000Z",
            "VersionId": "URhALfhfq69Zdqoh_z.b6j4ac5XR43oK",
            "ETag": "\"11c9c5d7c37e614b4d99eea11672227e\"",
            "StorageClass": "STANDARD",
            "Key": "hoge.txt",
            "Owner": {
                "DisplayName": "foobar",
                "ID": "2614e1fe5abbd1f85bc3c9b930b22f8f4f6eced59986b995b5e38cf655d7a7e0"
            },
            "IsLatest": true,
            "Size": 5
        },
        {
            "LastModified": "2016-12-11T13:16:50.000Z",
            "VersionId": "i4ngO7osXqV4GrFoXpHzblnWD7y3jIRa",
            "ETag": "\"c59548c3c576228486a1f0037eb16a1b\"",
            "StorageClass": "STANDARD",
            "Key": "hoge.txt",
            "Owner": {
                "DisplayName": "foobar",
                "ID": "2614e1fe5abbd1f85bc3c9b930b22f8f4f6eced59986b995b5e38cf655d7a7e0"
            },
            "IsLatest": false,
            "Size": 5
        }
    ]
}	  

ファイルをリストアする。

ファイルをアップロードするにはaws s3api get-objectコマンドを利用して、上記のversion-idを指定してファイルを取得します。

$ aws s3api get-object --bucket gside-version-test --key hoge.txt --version-id i4ngO7osXqV4GrFoXpHzblnWD7y3jIRa /tmp/hoge.txt
{
    "AcceptRanges": "bytes",
    "ContentType": "text/plain",
    "LastModified": "Sun, 11 Dec 2016 13:16:50 GMT",
    "ContentLength": 5,
    "VersionId": "i4ngO7osXqV4GrFoXpHzblnWD7y3jIRa",
    "ETag": "\"c59548c3c576228486a1f0037eb16a1b\"",
    "Metadata": {}
}
$ cat /tmp/hoge.txt
hoge	  

まとめ

復旧するファイルが少ない場合は、コマンドラインで淡々とリストアする方法で行けそうです。 ファイルが多くなると、もうちょっと工夫が必要そうですね。 ちなみにファイルが消した場合でも aws s3api list-object-versions の情報は消えないので、復旧することができます。