ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

Amazon S3 Glacier を使ってみた

こんにちは。 クラウドインテグレーション事業部 後藤です。ForgeVision Advent Calendar 12日目の記事を担当させていただきます。 ちょっと厄介なストレージサービスに触る機会がありましたので振り返りの為に投稿します。

Amazon S3 Glacier について

データの長期バックアップに使います。Amazon S3 Glacier においては、ボールト が入れ物で アーカイブ がアップロードするファイルのイメージです。Amazon S3 Glacier はアーカイブのアップロード、ダウンロードがマネジメントコンソール上から行えない為、API もしくは AWS CLI を使って操作します。コンソール上では、ボールトの作成と、空のボールトの削除のみが可能です。

以降のコマンドやソース内では、固有名詞の部分は一般名詞にしてありますので適宜置き換えてお読みください。

IAM作成

まず AWS CLI を実行するユーザーを IAM で作成します。Glacier 用のポリシーを作成し、アタッチします。アタッチするポリシーはコチラ。

Amazon S3 Glacier でアイデンティティベースのポリシー (IAM ポリシー) を使用する

glacier:ListVaults を入れた上で、ダウンロード・アップロードのポリシーを合わせます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "glacier:ListVaults",
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Resource": "arn:aws:glacier:<your-region>:<your-account>:vaults/<your-vault>",
            "Action": [
                "glacier:InitiateJob",
                "glacier:GetJobOutput",
                "glacier:DescribeJob",
                "glacier:UploadArchive",
                "glacier:InitiateMultipartUpload",
                "glacier:UploadMultipartPart",
                "glacier:ListParts",
                "glacier:ListMultipartUploads",
                "glacier:CompleteMultipartUpload"
            ]
        }
    ]
}

Glacier 補足

Glacier のコマンドはアーカイブサイズの大小に関係無く、アップロード・ダウンロード・リスト取得・削除に至るまで全てに数時間かかるので、決して気軽に検証しようとしてはいけません。

今日はアップロードしたから明日はアップロードした一覧を取得して明後日にダウンロードしよう、といった具合に1日1コマンドが精神衛生上、丁度いいかもしれません。

アーカイブ取得にかかる時間

Amazon S3 Glacier ストレージクラスでは、お客様のユースケースに合わせた 3 つの取得オプションを利用できます。高速取得は、通常 1~5 分でデータを取得できるため、アクティブアーカイブのユースケースに最適です。標準取得は、通常 3~5 時間で完了し、バックアップデータ、メディア編集、または長期分析といった時間的制約が少ないニーズに適しています。バルク取り出しは最も低コストのオプションで、大量のデータを 5~12 時間で取り出せます。Amazon S3 Glacier Deep Archive ストレージクラスでは、12~48 時間までの 2 つの取得オプションを利用できます。

アップロードについて

大きなアーカイブ(100 MB 以上)をアップロードするときは、マルチパートアップロードを使用するとスループットと確実性が向上します。マルチパートアップロードとは、大きなアーカイブを小さく分割して個別にアップロードする機能です。分割した各部分のアップロードがすべて正常に終了すると、結合されて 1 つのアーカイブとなります。

Vaultに関する情報の取得

The number of archives and their total size are as of the last inventory generation. This means that if you add or remove an archive from a vault, and then immediately use Describe Vault, the change in contents will not be immediately reflected. If you want to retrieve the latest inventory of the vault, use InitiateJob .

訳:アーカイブの数とその合計サイズは、最後のインベントリ生成時のものです。これは、保管庫からアーカイブを追加または削除した後、すぐにDescribe Vaultを使用しても、内容の変更はすぐには反映されないことを意味します。保管庫の最新のインベントリを取得したい場合は、InitiateJob を使用してください。

Glacier CLI コマンド一覧

Glacier CLI コマンドを叩いている動画

アーカイブアップロードとダウンロード

私の場合、CLI を使うのが初めてだった為、AWS コマンドを使う準備を行いましたが省略します。

ボールト 作成と削除

※ AWS アカウント指定部分は --account-id - で省略できます(aws configに設定したユーザーが所属するアカウントIDになります)

※ ボールト 作成は一瞬。 空の ボールト 削除も一瞬です。

aws glacier create-vault --vault-name %Vault-name% --account-id -
aws glacier delete-vault --vault-name %Vault-name% --account-id -

アーカイブ登録

コマンド実行後に出力される アーカイブ ID を控えておかないとダウンロード時に後悔します。

aws glacier upload-archive --account-id - --vault-name %Vault-name% --body %Upload-filepath%

アーカイブダウンロードジョブ登録

ArchiveID については前項のコマンド実行後の出力から引用します。

archive-retrieval.json はローカルに用意しておきます。

{
    "Type": "archive-retrieval",
    "ArchiveId": "%Archieve-ID%",
    "Description": "Retrieve archive on 2018-06"
}

↑ Description は任意のメモを入れます。

アーカイブダウンロードジョブ登録を実行

archive-retrieval.json ファイルを読み込んで実行するコマンドです。

aws glacier initiate-job --account-id - --vault-name %Vault-name% --job-parameters file://archive-retrieval.json

コマンドだけで実行する場合の書き方です。

aws glacier initiate-job --account-id - --vault-name %Vault-name% --job-parameters "{\"Type\":\"archive-retrieval\",\"ArchiveId\":\"%Archieve-ID%\"}"

アーカイブダウンロード

アーカイブダウンロードジョブ登録はファイル容量に関わらず数時間かかるので気長に待った上で実行します。jobID については前項のコマンド実行後の出力から引用します。

aws glacier get-job-output --account-id - --vault-name %Vault-name% --job-id %Job-ID% output.jpg

ボールトの内容の確認

アーカイブ ID の確認

どれだけの数のアーカイブが入っているのか確認する時なんかに使います。

aws glacier initiate-job --account-id - --vault-name %Vault-name% --job-parameters '{"Type": "inventory-retrieval"}'
もしくは、  
aws glacier initiate-job --account-id - --vault-name %Vault-name% --job-parameters "{\"Type\": \"inventory-retrieval\"}"

ジョブの内容の確認

アーカイブ ID が分からなくなってしまった時などに使います。(すぐに確認できると思ってはいけません。)

aws glacier describe-job --account-id - --vault-name n-goto-glacier --job-id %Job-ID%

Glacier の料金の落とし穴

通常、そんな運用をすることが無いハズ!!ではありますが、料金設定に落とし穴があることが分かったので最後に書いておきます。

Glacier は長期保管の運用をする想定で作られており無料使用の条件もそれに準じて 3ヶ月以上の運用が前提で設定 されているので、「一旦アップロードしたけど、やっぱり使わなかったから料金請求される前に消しとこう!」という考えが通用しません。

一旦アップロードしてしまえば、すぐに消したとしても 3ヶ月分の費用をしっかり徴収される ので覚えておいた方がいいと思います。表向きの料金設定のところには書いてないルールで、Q&A のところに書いてあります。

Q: 3 か月経過前にデータを削除した場合は、どのように請求されるのですか?

Amazon S3 Glacier からデータを無料で削除できるのは、削除されるアーカイブが 3 か月以上保管されていた場合です。アップロードされてから 3 か月未満でアーカイブを削除する場合は、早期削除料金をいただきます。