【AWS】s3 cpとrecursiveの組み合わせ!ディレクトリ・ワイルドカード活用術
生徒
「先生!AWSのS3でファイルをコピーするときにs3 cpコマンドを使うって聞いたんですけど、どうやってディレクトリごとコピーするんですか?」
先生
「いい質問ですね。aws s3 cpに--recursiveオプションをつけることで、ディレクトリ全体を一括でコピーできますよ。」
生徒
「ワイルドカードも使えたりするんですか?」
先生
「実はちょっとだけ制限はありますが、工夫すれば*.jpgみたいな指定もできます。詳しく解説していきましょう。」
1. AWS CLIの s3 cp とは?
AWS CLI(コマンドラインインターフェース)は、AWSの操作をコマンドで行うための強力なツールです。その中でもaws s3 cpは、ローカルとS3、S3間のファイルコピーに使われる基本的なコマンドです。
特に、S3バケット内のファイルを一括で転送したいときや、ローカルフォルダをS3にアップロードしたいときに活躍します。
2. --recursive でディレクトリを丸ごとコピー
--recursiveオプションを使えば、フォルダ(ディレクトリ)内のすべてのファイルやサブディレクトリを一括でコピーできます。
例えば、ローカルのimagesフォルダをS3にアップロードするには、以下のように書きます。
aws s3 cp ./images s3://your-bucket-name/images --recursive
このように指定すると、imagesフォルダ内の全てのファイルがS3のimagesディレクトリにそのままコピーされます。
3. S3からローカルへダウンロードする場合
逆に、S3からローカル環境にディレクトリごとダウンロードしたい場合も、同じく--recursiveを使います。
aws s3 cp s3://your-bucket-name/images ./images --recursive
S3上のデータ構造をローカルでも再現するために、ディレクトリを正確に指定しておくと便利です。
4. ワイルドカードは使える?制限に注意しよう
aws s3 cpでは、シンプルな*.jpgや*.txtといったワイルドカード指定は直接サポートされていません。
しかし、LinuxやMacのターミナル環境であれば、ローカル側のシェル展開を利用することが可能です。
aws s3 cp *.jpg s3://your-bucket-name/photos/
この方法は、あくまでローカル側でファイルリストを展開してコマンドを実行しているだけです。WindowsではPowerShellの書き方に注意が必要です。
5. --exclude と --include の併用で柔軟な制御
ワイルドカードを活用したい場合は、--recursiveと一緒に--excludeや--includeを使うと、柔軟にファイルを選択できます。
aws s3 cp ./ s3://your-bucket-name/ --recursive --exclude "*" --include "*.jpg"
このコマンドは、.jpgファイルだけをS3にアップロードする方法として非常に便利です。--exclude "*"で一旦すべて除外し、--include "*.jpg"で拡張子が.jpgのものだけを含めるという流れです。
6. ディレクトリ構造を保ったままコピーするには?
S3にフォルダ階層を保ったままコピーしたい場合、カレントディレクトリ指定に注意します。
aws s3 cp ./photos s3://your-bucket-name/backup/photos --recursive
こうすることで、ローカルのphotosディレクトリ以下の構造がS3にそのままアップロードされます。
7. S3間でのコピーにも対応
aws s3 cpは、S3バケット間のコピーにも使えます。以下はS3間コピーの例です。
aws s3 cp s3://bucket-a/folder/ s3://bucket-b/folder/ --recursive
このようにすると、bucket-aのfolder配下がbucket-bにまるごとコピーされます。
8. よくあるエラーと解決方法
エラー1:パスの末尾にスラッシュ(/)がない
例えば、次のように書くと、指定ディレクトリ自体が含まれてしまい、構造が崩れます。
aws s3 cp ./photos s3://bucket/photos --recursive
正しくは:
aws s3 cp ./photos/ s3://bucket/photos --recursive
エラー2:「parameter must be a file or directory」
指定したローカルパスやS3のURIが正しいか、存在するかを再確認しましょう。
9. ワイルドカードと --recursive の使い方を組み合わせよう
aws s3 cpの真価は、--recursiveと--include・--excludeの組み合わせにあります。たとえば画像だけ選んでアップロードしたい場合:
aws s3 cp ./ s3://my-bucket/images/ --recursive --exclude "*" --include "*.png" --include "*.jpg"
これで.pngや.jpgの画像ファイルだけがアップロードされます。
10. ファイル転送時の注意点とベストプラクティス
- S3 URIの末尾の
/を適切に扱う - --dryrunで事前確認する
- 必要に応じて
--storage-classでストレージクラスを指定する - 冪等性を意識してスクリプト化する
aws s3 cp ./data s3://my-bucket/data --recursive --dryrun
このように--dryrunをつけると、実際には実行されず、どのファイルがコピー対象になるか確認できて安心です。