AWS CLI で S3 を操作する入門:アップロード・確認・同期・削除

スポンサーリンク

AWS CLIのインストールと認証設定は「AWS CLI 導入入門:インストールから認証・プロファイル設定まで」を参照してください。

S3の基本操作

バケット一覧を表示する

aws s3 ls
2024-01-15 12:00:00 my-app-bucket
2024-02-20 09:30:00 my-logs-bucket
2024-03-10 15:45:00 my-backup-bucket

バケット内のオブジェクト一覧を表示する

aws s3 ls s3://my-app-bucket
                           PRE images/
                           PRE uploads/
2024-05-01 10:00:00       1024 index.html
2024-05-01 10:00:00      45678 style.css

フォルダの中を見る

aws s3 ls s3://my-app-bucket/images/

再帰的にすべてのオブジェクトを表示する

aws s3 ls s3://my-app-bucket --recursive

ファイル数・サイズの合計を確認する

aws s3 ls s3://my-app-bucket --recursive --human-readable --summarize
...
Total Objects: 142
   Total Size: 1.2 GiB

ファイルをアップロードする(cp)

ローカルファイルをS3へアップロード

aws s3 cp ./index.html s3://my-app-bucket/

S3上のパスを指定してアップロード

aws s3 cp ./image.png s3://my-app-bucket/images/2024/image.png

フォルダごとアップロードする(--recursive)

aws s3 cp ./dist/ s3://my-app-bucket/ --recursive

特定ファイルを除外する

aws s3 cp ./dist/ s3://my-app-bucket/ --recursive --exclude "*.DS_Store"

特定ファイルだけアップロードする

# .htmlファイルだけ
aws s3 cp ./dist/ s3://my-app-bucket/ --recursive --exclude "*" --include "*.html"

ファイルをダウンロードする(cp)

S3からローカルへダウンロード

aws s3 cp s3://my-app-bucket/index.html ./

フォルダごとダウンロードする

aws s3 cp s3://my-app-bucket/ ./local-backup/ --recursive

ファイルを移動する(mv)

S3上でファイルを移動・リネーム

aws s3 mv s3://my-app-bucket/old-name.txt s3://my-app-bucket/new-name.txt

バケット間でファイルを移動する

aws s3 mv s3://source-bucket/file.txt s3://dest-bucket/file.txt

フォルダごと移動する

aws s3 mv s3://my-app-bucket/old-folder/ s3://my-app-bucket/new-folder/ --recursive

ファイルを削除する(rm)

1ファイル削除

aws s3 rm s3://my-app-bucket/index.html

フォルダ以下を全削除

aws s3 rm s3://my-app-bucket/old-folder/ --recursive

特定の拡張子だけ削除

aws s3 rm s3://my-app-bucket/ --recursive --exclude "*" --include "*.tmp"

フォルダを同期する(sync)

sync はローカルとS3を差分で同期します。変更・追加されたファイルだけ転送するため cp --recursive より効率的です。

ローカル → S3(デプロイ)

aws s3 sync ./dist/ s3://my-app-bucket/

S3 → ローカル(バックアップ取得)

aws s3 sync s3://my-app-bucket/ ./local-backup/

S3 → S3(バケット間コピー)

aws s3 sync s3://source-bucket/ s3://dest-bucket/

S3にないローカルファイルを削除する(--delete)

# ローカルで削除したファイルをS3からも削除する
aws s3 sync ./dist/ s3://my-app-bucket/ --delete

実行前に確認する(--dryrun)

--dryrun をつけると実際には実行せず、何が行われるかだけ表示されます。削除や同期の前に確認するのに使えます。

aws s3 sync ./dist/ s3://my-app-bucket/ --delete --dryrun
(dryrun) upload: dist/index.html to s3://my-app-bucket/index.html
(dryrun) delete: s3://my-app-bucket/old-page.html

プロファイルで複数アカウントを切り替える

プロファイルの設定方法は「AWS CLI 導入入門:インストールから認証・プロファイル設定まで」を参照してください。

# プロファイルを指定してS3コマンドを実行する
aws s3 ls --profile dev
aws s3 cp ./file.txt s3://work-bucket/ --profile work
aws s3 sync ./dist/ s3://work-bucket/ --profile prod

リージョンを指定する

aws s3 ls s3://us-bucket/ --region us-east-1

Presigned URLを発行する

Presigned URLを使うと、AWSアカウントを持たない人でも一時的にS3のファイルにアクセスできます。

# 1時間だけ有効なダウンロードURLを発行
aws s3 presign s3://my-app-bucket/report.pdf --expires-in 3600
https://my-app-bucket.s3.ap-northeast-1.amazonaws.com/report.pdf?X-Amz-Algorithm=...

デフォルトの有効期限は1時間(3600秒)です。最大7日間(604800秒)まで設定できます。

よく使うオプション早見表

オプション 説明
--recursive フォルダ以下を再帰的に処理する
--exclude "pattern" パターンに一致するファイルを除外
--include "pattern" パターンに一致するファイルだけ処理
--delete sync時に転送元にないファイルを削除
--dryrun 実行せずに何が行われるか確認
--profile name 使用するプロファイルを指定
--region name リージョンを指定
--human-readable ファイルサイズを人が読みやすい形式で表示
--summarize ls時に合計件数・サイズを表示

まとめ

# バケット一覧
aws s3 ls

# オブジェクト一覧
aws s3 ls s3://my-bucket/ --recursive --human-readable --summarize

# アップロード
aws s3 cp ./dist/ s3://my-bucket/ --recursive

# ダウンロード
aws s3 cp s3://my-bucket/file.txt ./

# 同期(差分のみ転送)
aws s3 sync ./dist/ s3://my-bucket/ --delete

# 削除
aws s3 rm s3://my-bucket/old-file.txt

# 実行前確認
aws s3 sync ./dist/ s3://my-bucket/ --delete --dryrun

# Presigned URL発行
aws s3 presign s3://my-bucket/file.pdf --expires-in 3600