【AWS】s3 cpで上書き・上書きしない方法を使い分けよう
生徒
「AWS CLIのs3 cpコマンドでファイルをコピーするとき、いつも上書きされちゃうんですけど、上書きしない方法ってありますか?」
先生
「はい、s3 cpはデフォルトで同じキー名のファイルがあると上書きされます。でもオプションを使えば上書きしない設定も可能ですよ。」
生徒
「なるほど。じゃあ場合によって上書きする・しないを切り替えることができるんですね?」
先生
「その通りです。では、上書きと上書きしない場合の使い分けや具体的なコマンドを詳しく解説しますね。」
1. s3 cpの基本動作
aws s3 cpコマンドは、ローカルとS3間、またはS3同士でファイルをコピーするためのAWS CLIコマンドです。デフォルトでは、コピー先に同じキー名のファイルが存在すると内容を上書きします。これはバージョニングが有効でない場合、元のファイルが置き換えられることを意味します。
aws s3 cp ./localfile.txt s3://my-bucket/localfile.txt
このコマンドを実行すると、S3のmy-bucketに同じ名前のファイルがあれば上書きされます。
2. 上書きする場合の利用シーン
上書きは、同じファイルを最新版に差し替える場合や、頻繁に更新されるログ・設定ファイルを反映させたいときに有効です。例えば、WebサイトのHTMLファイルやCSSを差し替えるときなどは、上書きで最新状態を反映させます。
ただし、誤って古いファイルで上書きするとデータが失われるため、バージョニングやバックアップを併用することが推奨されます。
3. 上書きしない方法(--exact-timestampsや条件付きコピー)
上書きせずにコピーする場合は、いくつかの方法があります。まず、--exact-timestampsオプションを使うと、更新日時とサイズが同じファイルはスキップされます。
aws s3 cp ./localfile.txt s3://my-bucket/ --exact-timestamps
この方法では、S3側のファイルがローカルと同じであれば上書きしません。
また、--dryrunを組み合わせれば、実際に上書きされるかどうか事前に確認できます。
aws s3 cp ./localfile.txt s3://my-bucket/ --exact-timestamps --dryrun
4. --if-none-matchオプションで完全に上書きを防ぐ
AWS CLIには直接的な「上書き禁止」オプションはありませんが、aws s3api put-objectを使って--if-none-match "*"を指定すれば、S3側に同じキー名のファイルが存在する場合にエラーを返し、上書きを防げます。
aws s3api put-object --bucket my-bucket --key localfile.txt --body ./localfile.txt --if-none-match "*"
この方法はAPIレベルでの制御となるため、完全に上書きを避けたいケースに有効です。
5. 上書き・非上書きの使い分けポイント
- 上書き推奨:頻繁に更新されるファイル、Webサイト更新、定期的なバックアップ差し替え
- 上書き禁止推奨:過去データの保管、誤上書きを避けたい重要ファイル、ログのアーカイブ
プロジェクトの性質やファイルの重要度に応じて、どちらの方法を選ぶか決めると安全です。
6. 実運用での注意点
実運用では、上書きする前に必ずバックアップを取り、可能であればバージョニングを有効化することをおすすめします。バージョニングを有効にすると、上書きしても過去バージョンを復元できるため、事故を防ぎやすくなります。
また、上書きが発生する操作は自動化スクリプトに組み込む前に、--dryrunで確認する習慣を持つと安心です。