Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

AWS S3から全部ではないけど大量に何個か取ってきたい

困ったのでメモ

背景

  • aws cliコマンドではS3から手元のローカルにコピーができる
  • バケットの中にはめちゃくちゃファイルがあるが、その中からいくつかコピーしたい
  • 「いくつか」とはいうものの、3000個ぐらいある…
  • バケット内にあるファイルは、すべて同じ拡張子なので、includeオプション(例 --include '*.png') が使えない…
  • 手元に全部同期(sync)して選別するにしても、1個1個のファイルサイズがそこそこあるので、全部ダウンロードしたら手元のディスクが死ぬ…

2つの解決策

aws s3 cp s3://my-bucket/mydir/foo/001.png .
aws s3 cp s3://my-bucket/mydir/foo/002.png .
aws s3 cp s3://my-bucket/mydir/foo/003.png .
...
  • --includeオプションを複数連ねて大量に作って、1つのコマンドとして実行する
aws s3 cp s3://my-bucket/mydir/foo/ . --recursive \
    --exclude '*' \
    --include 001.png \
    --include 002.png \
    --include 003.png \
    ...

--includeで頑張るほうが良さそう

  • awsコマンドを打つ度に認証なんやらが発生して、3000回awsコマンドを打つよりはincludeで頑張るほうが速い気がした(体感)
  • ただ、バケット内のファイル一覧を最初にスキャンしているのか、ダウンロードが始まるまで多少時間がかかった
  • --includeは100個くらいでないとだめそう。200個つけたら、ダウンロードが始まらなかった
    • なので、結局awsコマンドは何回か叩くことにはなる
  • ちなみにaws s3 cpはデフォルトが全部ダウンロード対象なので、--include は --exclude '*' とセットで使わないと意味がなかったので注意