S3あれこれ

AWSのS3に関連するあれこれメモ
場合によっては結構な課金がされたり、データがなくなる恐れもあります!
自己責任で、十分注意して操作してくださいませ

■Glacierからのデータ大量復元

スタンダードクラスとGlacierのファイルが混ざったS3バケットから
大量にGlacierファイル復元をする必要に迫られた際にとった方法
S3のバッチオペレーション使います。

では早速・・・

Glacierファイルのリストを作る

以下のコマンドで
test-target-backet バケットで test フォルダ下にあるGlacierファイルを glacier_list.txtに出力

aws s3api list-objects-v2 --bucket test-target-backet --prefix 'test/' --query 'Contents[?StorageClass==`GLACIER`].[Key]' >> glacier_list.txt --output text

これで、該当ファイル名がずらっと並んだファイルができます。
参考)
S3バケット内のGlacierファイルのみ抽出して標準クラスへ移行させる

S3バッチオペレーションで復元

まず、前準備として、先に出力したファイルリストを編集してマニフェストファイル作成
参考)
S3 バッチ操作ジョブの作成
この参考ページのCSVファイルによるマニフェストファイル作成
こんなの

"test-target-backet","test/xxx.pdf"
"test-target-backet","test/yyy.pdf"
"test-target-backet","test/zzz.pdf"

バッチオペレーションジョブを作るときに以下のエラーが出ることがあります
「Failed to parse task from Manifest (マニフェストファイル名) at byte offset 1297476. ErrorMessage: Task target couldn’t be URL decoded」
どうもファイル名に % とか入ってるとダメみたい
(URLエンコードではないところに % があると、URLエンコードで解釈しようとしてるのかも)

作ったマニフェストファイルをS3の適当なバケットに置いて
AWS管理コンソールで「S3バッチオペレーション」を作るんですが・・・
その前にバッチ実行するためのIAMロールを作っておく必要があります
参考)
Amazon S3 バッチ操作に対するアクセス許可の付与

  • IAMの画面でロール作成
  • 「信頼されたエンティティタイプ」は「AWSのサービス」
  • 「ユースケース」は「S3」の「S3 Batch Operations」
  • とりあえず許可ポリシーは「AmazonS3FullAccess」
  • 適当なロール名をつけて保存

バッチオペレーションジョブの作り方はこちらの記述の通り
参考)
現在 S3 Glacier または S3 Glacier Deep Archive ストレージクラスにある大量の Amazon S3 オブジェクトの復元を開始するにはどうすればよいですか?

バッチオペレーションの失敗をログ出力するようにしておいた方がいいです。
失敗したファイルはURLエンコードされてログ出力されるので、URLデコードしましょう。
ネット上にURLデコードしてくれるサイトはたくさんあります。

■大量データが入っているバケットの削除

バージョニングがONになっているバケットの削除
管理コンソールから削除すると、データが大量だとうまくいかないことがあります。
調べると、S3のライフサイクル使うと、割と楽にできるみたい

参考)
ライフサイクル設定ルールを使用して Amazon S3 バケットを空にするにはどうすればよいですか。

実際どうなるかは今実験中・・

■MacでS3を利用するときの落とし穴

結論から言えば、私はCLIでのみ操作することにしました。
大変参考になったページ(大感謝)
S3上のマルチバイトファイル名でハマった話

ファイル名やフォルダ名に日本語を使ってたんですが、
「ぱぴぷ/」というフォルダをコンソールで作成した後に
「ぱぴぷ/test.csv」というファイルをcpすると
「ぱぴぷ/」っていうフォルダが新規に作られる・・・
(コンソール上「ぱぴぷ/」というフォルダが2つあるように見える)
なぜ???
で、色々調べると、 管理コンソールで「ぱぴぷ/」というフォルダを作った時と
cpコマンドで「ぱぴぷ/」というフォルダを作った時
MACのUnicode正規化方式の違いのせいで、別物になっているらしい。

さらに、cpで「ぱぴぷ/」というフォルダを作って中に色々ファイルを置いた後、
Safariで管理コンソールを確認すると、「ぱぴぷ/」より下のディレクトリが見えない・・・
CLIで見ると「ぱぴぷ/」より下は見える。
ということはSafariからのリクエストにも同様の問題が発生している模様。
Chromeだと管理コンソールでも見えてるので、
Safariっていうか、Apple特有の問題っぽい。
とにかく操作はCLIのみでやることにします。