はじめに
あるチームは、日次 CSV レポートのディレクトリを公開しています。ディレクトリをアップロードし、変更を公開して、別のアーカイブを保護しながら、不要になった保存済みレポートを削除します。
最初に キーとメタデータで文書を整理する を完了し、バケット、キー、プレフィックス、ダウンロードの概念を学んでください。この新しい VM には、CLI 接続、ローカルのレポート、アーカイブだけを含むバケットが提供されます。コマンドには Terminal を使い、隣の AWS View タブで変化を観察します。
認定試験との関連
このラボでは、次の試験トピックに関連する実践的な演習を行います。
- Cloud Practitioner (CLF-C02) · タスク 3.6: S3 でのディレクトリ同期と範囲を限定した削除。
- Solutions Architect – Associate (SAA-C03) · タスク 3.1: S3 でのディレクトリ同期と範囲を限定した削除。
- Developer – Associate (DVA-C02) · タスク 1.3: S3 でのディレクトリ同期と範囲を限定した削除。
準備済みのレポートディレクトリを公開する
このステップでは、二つのローカルレポートを daily/ プレフィックスに公開し、ファイル名とオブジェクトキーの対応を理解します。
cd(ディレクトリを変更する)で作業ディレクトリに移動します。
cd /home/labex/project
ローカルのファイル名を一覧表示する ls で、準備済みのレポートディレクトリを確認します。
ls reports
一覧には monday.csv と tuesday.csv が含まれます。どちらも CSV ファイルです。ヘッダーが列の名前を示し、各レコードではカンマが値を区切ります。ファイルの内容を表示する cat で、月曜日のレポートを確認します。
cat reports/monday.csv
date,orders
2026-09-28,120
準備済みのバケットを一覧表示します。S3 の場所に対して --recursive を使うと、バケット全体の完全なキーが表示されます。
aws s3 ls s3://labex-report-delivery/ --recursive
archive/retention.txt だけが存在します。アーカイブは別の作業の流れに属するため、日次の同期後も保持する必要があります。
aws s3 sync は、コピー元、コピー先の順に指定します。コピー元ディレクトリのファイルを再帰的に対象とするため、sync に --recursive は必要ありません。各相対ファイル名が、コピー先プレフィックスの下のキーになります。そのため reports/monday.csv は daily/reports/monday.csv ではなく、daily/monday.csv になります。
aws s3 sync reports/ s3://labex-report-delivery/daily/
コマンドは月曜日と火曜日のアップロードを表示します。出力の順序は異なる場合があります。バケット全体をもう一度一覧表示します。
aws s3 ls s3://labex-report-delivery/ --recursive
archive/retention.txt、daily/monday.csv、daily/tuesday.csv の三つのキーが見つかるはずです。AWS View にも同じオブジェクトが表示されます。daily/monday.csv をクリックし、保存された二行の CSV レポートを読み取ります。アーカイブは、選択したコピー先 daily/ の範囲外に残っています。
変更と新しいレポートを同期する
このステップでは、一つのレポートを更新して別のレポートを追加し、変更のないレポートを再アップロードせずに、それらの変更を転送します。
どちらにも変更がない場合、同じコピー元とコピー先で sync を実行しても安全です。
aws s3 sync reports/ s3://labex-report-delivery/daily/
既存のファイルが最新の状態なら、アップロードの行はありません。ローカルから S3 への転送では、CLI はコピー先のキーがないか、サイズが異なるか、ローカルファイルの更新日時がより新しいかを判断します。ディレクトリを継続的に監視するわけではなく、変更を公開したいときに sync を実行します。
月曜日のレポートに、遅れて届いた 25 件の注文を追加します。printf は引用符で囲んだテキストを出力し、\n は行を終えます。シェルの >> は、ローカルファイルを置き換える代わりに追記します。
printf '2026-09-28,25\n' >> reports/monday.csv
三行になった結果を確認します。
cat reports/monday.csv
date,orders
2026-09-28,120
2026-09-28,25
水曜日のレポートを作成します。ここでの > は新しいファイルを書き込み、そのパスに既に内容があれば置き換えます。
printf 'date,orders\n2026-09-30,150\n' > reports/wednesday.csv
公開する前は、保存済みの月曜日のレポートはまだ二行で、AWS View に水曜日はありません。ローカルファイルの編集だけでは S3 は変わりません。
もう一度公開します。
aws s3 sync reports/ s3://labex-report-delivery/daily/
変更した月曜日のレポートと、新しい水曜日のレポートのアップロードが表示されるはずです。火曜日には変更がないため、アップロードされません。これは差分転送です。すべてのファイルを無条件にコピーする代わりに、変更をコピーします。
AWS View では、月曜日に遅れて届いた分が表示され、水曜日が追加されています。実際に保存された内容を比較できるよう、月曜日を別のローカルパスにダウンロードします。
aws s3 cp s3://labex-report-delivery/daily/monday.csv retrieved-monday.csv
cmp はファイルをバイト単位で比較します。内容が一致すると、差分を表示せずに正常終了します。&& は、その比較が成功した後だけメッセージを表示します。
cmp reports/monday.csv retrieved-monday.csv && echo 'Updated report matches'
Updated report matches
これにより、更新がストレージに届いたことを確認できます。コマンドの成功メッセージだけでは、どのバイト列が保存されたかはわかりません。
次の例は、更新後の保存済み月曜日レポートを展開した状態です。水曜日が存在し、独立したアーカイブもバケットに残っています。

daily プレフィックスだけをミラーリングする
このステップでは、無関係なアーカイブを保護しながら、コピー先の不要になったレポートを削除します。
sync のコピー先は daily/ です。archive/ はその範囲外にあります。

火曜日のレポートは、公開する日次レポートの集合に不要となりました。rm(削除する)で、そのローカルファイルだけを削除します。これはローカルファイルシステムのコマンドなので、S3 オブジェクトは削除しません。
rm reports/tuesday.csv
通常の sync をもう一度実行します。
aws s3 sync reports/ s3://labex-report-delivery/daily/
コピー先プレフィックスを一覧表示します。
aws s3 ls s3://labex-report-delivery/daily/ --recursive
火曜日はまだ表示されます。デフォルトでは、sync は存在しないファイルや更新されたファイルをコピーしますが、コピー先の余分なオブジェクトは残します。コピー元のファイルを削除するだけでは、保存されたコピーは削除されません。
ミラーリングは、削除も含めて、コピー先のファイル集合をコピー元に合わせることです。--delete は、一致するコピー元ファイルがないコピー先のキーを削除します。まず、実行せずに予定される操作を表示する --dryrun と組み合わせます。
aws s3 sync reports/ s3://labex-report-delivery/daily/ --delete --dryrun
ドライランには、daily/tuesday.csv の削除だけが表示されるはずです。月曜日と水曜日はコピー元に一致し、archive/retention.txt は daily/ の範囲外です。コピー先のプレフィックスを正確に保ってください。バケットのルートを使うと、アーカイブも対象範囲に含まれます。
予定される削除を確認した後、--dryrun を外して同じ操作を実行します。
aws s3 sync reports/ s3://labex-report-delivery/daily/ --delete
コマンドは火曜日の削除を表示します。なくなったものと残ったものの両方を確認できるよう、バケット全体を確認します。
aws s3 ls s3://labex-report-delivery/ --recursive
残るキーは daily/monday.csv、daily/wednesday.csv、archive/retention.txt です。AWS View でアーカイブオブジェクトを開き、引き続き Keep the archive outside daily synchronization. と表示されることを確認してください。ミラーリング操作が影響したのは、選択したプレフィックスだけです。
実験用ストレージリソースを削除する
このステップでは、この演習用に作成されたレポートとアーカイブを削除し、空のバケットを削除します。
アーカイブは日次のミラーリング中には保持する必要がありましたが、これもこの演習が所有する使い捨てのリソースです。今は明示的に削除して構いません。まず、daily/ に限定した再帰操作で、二つの日次レポートオブジェクトを削除します。
aws s3 rm s3://labex-report-delivery/daily/ --recursive
出力は二つのレポートの削除を示します。完全なキーでアーカイブを削除します。
aws s3 rm s3://labex-report-delivery/archive/retention.txt
バケットが空であることを確認します。
aws s3 ls s3://labex-report-delivery/ --recursive
オブジェクトの行がない正常なコマンドによって、空であることを確認できます。これで aws s3 rb(remove bucket)が格納先を削除できます。
aws s3 rb s3://labex-report-delivery
出力は remove_bucket: labex-report-delivery です。残っているバケットを確認します。
aws s3 ls
バケットの行は残っていません。AWS View は状態の問い合わせが成功した後、No buckets を表示します。ローカルのレポートファイルは確認用に残っています。ストレージのリソースを削除しても、ローカルのコピーは削除されません。
まとめ
ローカルのレポートディレクトリを S3 プレフィックスに公開し、変更なしで sync を繰り返し、変更したレポートと新しいレポートをアップロードして、取得した更新内容と元ファイルを比較しました。通常の sync はコピー先の余分なオブジェクトを残すことを確認し、daily/ に限定した --delete 付きのミラーリングをプレビューして実行しました。
アーカイブはコピー先プレフィックスの範囲外にあるため、この操作後も残りました。すべての実験用ストレージリソースを削除する前に、新しい状態と保持されたデータの両方を確認しました。今後の作業では、sync を実行する前にコピー元、コピー先、削除範囲を選んでください。



