第2回:大規模データ管理と同期
はじめに
前回は、S3コマンドの環境構築から、バケットやオブジェクトの基本的な操作方法について学びました。cp
や mv
を使えばファイルを個別にアップロード・ダウンロードできますが、大量のデータや頻繁に更新されるディレクトリを効率的に管理するには、より高度なコマンドが必要です。
第2回では、aws s3 sync
コマンドに焦点を当て、ローカルとS3間で大規模なデータを同期する方法を徹底解説します。また、rm
コマンドの応用や、シェルスクリプトの強力な武器である「パイプ処理」とS3コマンドを組み合わせる方法についても学び、より実践的なデータ管理スキルを身につけましょう。
aws s3 sync
コマンドの徹底解説
aws s3 sync
コマンドは、同期元のデータと同期先のデータを比較し、差分のみを転送することで、データ転送を効率化するための非常に強力なコマンドです。
1. aws s3 sync
の基本
sync
コマンドは、cp
コマンドと同様に、ローカルディレクトリとS3バケット間、またはS3バケット同士で同期を行うことができます。
基本的な構文は以下の通りです。
# ローカルディレクトリをS3バケットに同期
aws s3 sync ./local_directory s3://my-sync-bucket/remote_directory
# S3バケットをローカルディレクトリに同期
aws s3 sync s3://my-sync-bucket/remote_directory ./local_directory
このコマンドは、以下の動作を自動的に行います。
- ファイルの一覧取得: 同期元と同期先のファイルリストを取得します。
- 比較: ファイルのサイズと最終更新日時を比較し、同期先よりも同期元のファイルが新しい場合に、そのファイルを転送します。
- 新規ファイルの転送: 同期元にあり、同期先に存在しないファイルはすべて転送します。
sync
コマンドは、すでに存在するファイルはスキップするため、cp --recursive
を毎回実行するよりもはるかに高速に処理できます。
2. --delete
オプション:同期元のファイルを忠実に再現する
sync
コマンドの真価は、--delete
オプションを使うことでさらに発揮されます。このオプションを指定すると、同期元に存在しないファイルは、同期先から削除されます。 これにより、同期先を同期元の「鏡」のように完全に一致させることができます。
例えば、ローカルディレクトリ内のファイルを更新し、不要になったファイルを削除したとします。--delete
オプションを付けて sync
を実行すれば、S3バケット内の対応するファイルも自動的に削除されます。
# ローカルディレクトリの内容をS3バケットに同期し、S3にしかないファイルを削除
aws s3 sync ./local_directory s3://my-sync-bucket/remote_directory --delete
注意: --delete
オプションは非常に強力なため、実行する前には必ず同期元と同期先のパスが正しいか確認してください。誤ったパスを指定すると、意図しないデータが削除される可能性があります。
3. --exclude
, --include
オプション:同期対象を細かくフィルタリングする
sync
コマンドでは、--exclude
と --include
オプションを使って、同期対象から特定のファイルを除外または含めることができます。
-
--exclude
: 指定したパターンに一致するファイルを同期対象から除外します。# jpgファイルを除外して同期 aws s3 sync ./data s3://my-sync-bucket/data --exclude "*.jpg"
-
--include
:--exclude
が指定されている場合、特定のパターンに一致するファイルのみを含めることができます。--exclude
と--include
は組み合わせて使うことで、より柔軟なフィルタリングが可能です。--include
が優先されるため、まず広範囲のファイルをexclude
し、その後特定のファイルをinclude
する、という使い方が一般的です。# すべてのファイルを同期対象から除外し、jpgファイルのみを含めて同期 aws s3 sync ./data s3://my-sync-bucket/data --exclude "*" --include "*.jpg"
aws s3 rm
コマンドの応用
大量のファイルを一括で削除したい場合、rm
コマンドが役立ちます。
1. --recursive
オプションによるディレクトリごとの一括削除
--recursive
オプションを付けると、指定したプレフィックス(S3における「ディレクトリ」のような概念)配下のオブジェクトをすべて削除できます。
# S3バケット内の特定のディレクトリ配下のファイルをすべて削除
aws s3 rm s3://my-sync-bucket/remote_directory/ --recursive
2. 削除の確認(--dryrun
オプション)
rm
コマンドは、一度実行すると元に戻すことができません。誤って重要なデータを削除しないように、--dryrun
オプションを使って、実際に削除する前に実行内容を確認することができます。
# 実際に削除せずに、削除されるファイルの一覧を表示
aws s3 rm s3://my-sync-bucket/remote_directory/ --recursive --dryrun
このコマンドは、削除されるはずのファイル名をすべて出力しますが、実際の削除処理は行いません。これにより、意図しないファイルが削除されるリスクを大幅に減らすことができます。
3. バージョン管理が有効なバケットでの削除方法
S3のバージョニング機能が有効なバケットでは、rm
コマンドを実行しても、オブジェクトは完全に削除されません。代わりに、削除マーカーが作成され、古いバージョンは保持されたままになります。
バージョニングが有効なバケットからオブジェクトのすべてのバージョンを完全に削除するには、aws s3api delete-object
を使って、各バージョンのIDを指定して削除する必要があります。
# バージョンIDを指定して特定のバージョンを削除
aws s3api delete-object --bucket my-versioning-bucket --key my_file.txt --version-id "VERSION_ID"
すべてのバージョンを削除するスクリプトを作成するには、aws s3api list-object-versions
コマンドを使ってバージョンIDを列挙し、それを delete-object
コマンドに渡すといった方法が考えられます。
パイプ処理の活用
シェルスクリプトの強力な機能である「パイプ(|
)」をS3コマンドと組み合わせることで、ディスクにファイルを一時保存することなく、データの圧縮・転送を効率的に行うことができます。
1. 標準入出力(-
)を使ったS3コマンドとの連携
aws s3 cp
コマンドは、ファイルパスの代わりにハイフン(-
)を指定することで、標準入力からデータを受け取り、または標準出力にデータを書き出すことができます。
# ローカルのテキストファイルの標準出力をS3にアップロード
cat local_file.txt | aws s3 cp - s3://my-sync-bucket/uploaded_from_stdin.txt
# S3上のファイルを標準出力にダウンロード
aws s3 cp s3://my-sync-bucket/uploaded_from_stdin.txt -
2. tar
や gzip
との組み合わせによる、効率的なデータ転送方法
このパイプ機能と、tar
や gzip
のようなコマンドを組み合わせることで、複数のファイルを圧縮しながらS3に転送したり、S3上の圧縮ファイルを直接展開したりできます。
-
ローカルディレクトリを圧縮してS3にアップロード
# `tar`で複数のファイルをアーカイブし、`gzip`で圧縮し、パイプでS3に転送 tar -czf - ./my_archive_directory | aws s3 cp - s3://my-sync-bucket/my_archive.tar.gz
このコマンドは、
my_archive_directory
ディレクトリを.tar.gz
形式で圧縮し、その圧縮データを直接s3
にアップロードします。ローカルディスクに.tar.gz
ファイルを作成する必要がないため、ディスク容量を節約できます。 -
S3上の圧縮ファイルをダウンロードしてローカルで展開
# S3上の圧縮ファイルをパイプで受け取り、ローカルで`tar`を使って展開 aws s3 cp s3://my-sync-bucket/my_archive.tar.gz - | tar -xzf -
このコマンドは、S3から圧縮ファイルをダウンロードし、それを直接
tar
コマンドに渡して展開します。ダウンロードした.tar.gz
ファイルをローカルディスクに残さないため、これもまた効率的です。
まとめ
第2回では、S3コマンドを使った大規模データ管理の鍵となる機能を学びました。
本記事のポイント
-
aws s3 sync
コマンドは、差分転送によって効率的なデータ同期を実現します。--delete
オプションを使えば、同期元と同期先のデータを完全に一致させることが可能です。 -
rm --recursive
でディレクトリごと一括削除できますが、--dryrun
で安全性を確保することが重要です。 - パイプ処理 とS3コマンドを組み合わせることで、ディスクを介さずにデータの圧縮・転送を行うことができ、非常に柔軟かつ効率的なデータ処理が可能になります。
次回の記事では、S3オブジェクトに付加する「メタデータ」の操作方法や、セキュリティの要となる「アクセス権限」の管理について詳しく解説します。