📝

S3 Glacierから復元後に一括ダウンロードする方法

3 min read

※2021/6/3 サポートからの回答を追記しました。

以前、使わなくなった資料をS3で保管しようと思い、どうせなら安いGlacierに入れておこうと思い、すべての資料をぶち込みました。
その資料を急にダウンロードしたくなったので、s3 cpコマンドで一括ダウンロードしようと思ったら、少しハマったので解決策をご紹介します。

結論

  • Glacierからオブジェクトを復元する
  • s3 cpコマンドに--forceオプションを付与する

やっていたこと

Glacierからの一括ダウンロードをしようと、まず以下のコマンドを実行していました。
aws s3 cp s3://<バケット名>/ ./ --recursive --profile <プロファイル名>

すると、以下のエラーが発生しました。

warning: Skipping file s3://<バケット名>. Object is of storage class GLACIER. Unable to perform download operations on GLACIER objects. You must restore the object to be able to perform the operation. See aws s3 download help for additional parameter options to ignore or force these transfers.

警告: ファイル s3://<バケット名> をスキップします。 オブジェクトはストレージ クラス GLACIER です。 GLACIER オブジェクトでダウンロード操作を実行できません。 操作を実行できるようにするには、オブジェクトを復元する必要があります。 これらの転送を無視または強制する追加のパラメータオプションについては、aws s3 ダウンロードのヘルプを参照してください。

まずGlacierからの直接ダウンロードはできない仕様だということを忘れていました。
詳しい仕様はドキュメントなどをご覧ください。
ダウンロードするためには、まず「復元」する必要がありました。

復元

ということで、とりあえずコンソールで復元しました。


迅速取り出しを選択し、念のため5分以上待ってから再度コマンドを実行しました。
aws s3 cp s3://<バケット名>/ ./ --recursive --profile <プロファイル名>

ところが、エラーは変わらず、時間をおいてトライしてもダメでした。

エラー文から推測

エラー文の最後の方に以下の記載があります。

これらの転送を無視または強制する追加のパラメータオプションについては

「強制」すればいけるか?
と推測しました。
以前バケットの中身がある状態のバケットを削除するために、rbコマンドに--forceオプションを付けたことがあったので、同じ感覚でやってみました。
aws s3 cp s3://<バケット名>/ ./ --recursive --force --profile <プロファイル名>

できた!!
エラーなくオブジェクトの一括ダウンロードが始まり、最後まで完了しました。

改めて調べてみた

cpコマンドにおける--forceオプションについて改めて調べてみたのですが、記載のあるドキュメントが見当たりませんでした。
一応cpコマンドのリファレンスには以下のオプションはありました。

--force-glacier-transfer (ブール値) 同期または再帰コピー内のすべての Glacier オブジェクトに転送リクエストを強制します。

これっぽい気もしますが、forceのみではないので、省略可能なのでしょうか?

検索してもcpforceのみのオプションというのは見当たらなかったので、詳細は闇の中です。でも闇の中だと気持ち悪いので、サポートにも質問しました。

追記 サポートからの回答

以下のように回答を頂きました。

aws s3 cp には --force というオプションはございませんが、上記のコマンドを実行した場合、 --force が --force-glacier-transfer の先頭にマッチするため、 --force-glacier-transfer オプションが適用されると考えられます。
なお、 --force-glacier-transfer オプションについては、ご提示いただいたドキュメントに記載がございますので、そちらをご参照ください。

AWS CLI では、コマンドの引数をパースする処理に argparse という Python ライブラリを利用しております。
argparse には prefix matching [1] という機能があり、オプションの文字列の先頭数文字を入力するだけでオプションを認識できることを確認いたしました。
よって、 aws s3 cp --force を実行した場合は、 aws s3 cp --force-glacier-transfer と解釈され処理が実行されたものと考えられます。

なお、こちらの動作についてご案内した AWS 公式のドキュメントなどはございませんでした。
よって、仕様として保証されたものではなく、将来的に予告なく変更される可能性もございますこと、ご理解ください。

Python ライブラリのprefix matchingによる挙動だったようです。
ただし、動作保証はしないので、使用する際は省略しないほうよさそうです。

まとめ

今回はS3 Glacierから、オブジェクト復元後に一括ダウンロードする方法を紹介しました。
思わぬところでハマりましたが、forceに救われました。
サポートからの回答が来たら追記したいと思います。
参考になれば幸いです。

Discussion

ログインするとコメントできます