レポートディレクトリを同期する

AWSBeginner
オンラインで実践に進む

はじめに

あるチームは、日次 CSV レポートのディレクトリを公開しています。ディレクトリをアップロードし、変更を公開して、別のアーカイブを保護しながら、不要になった保存済みレポートを削除します。

最初に キーとメタデータで文書を整理する を完了し、バケット、キー、プレフィックス、ダウンロードの概念を学んでください。この新しい VM には、CLI 接続、ローカルのレポート、アーカイブだけを含むバケットが提供されます。コマンドには Terminal を使い、隣の AWS View タブで変化を観察します。

認定試験との関連

このラボでは、次の試験トピックに関連する実践的な演習を行います。

準備済みのレポートディレクトリを公開する

このステップでは、二つのローカルレポートを 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 を実行する前にコピー元、コピー先、削除範囲を選んでください。