はじめに
Amazon S3 にシステムログなどをフォルダー(プレフィックス)で階層化して保存している場合、解析やバックアップのために手元へダウンロードする作業が発生します。AWS Management Console の標準機能ではフォルダーごとの一括ダウンロードができないため、ファイル数が多い場合は AWS CLI を使ったコマンド操作が効率的です。
- AWS Management Console の制約と一括ダウンロードの必要性
aws s3 cp --recursiveとaws s3 syncによる一括ダウンロード手順- 転送を高速化する設定(
max_concurrent_requests) - S3 URI の取得方法と、ダウンロードした .gz ログの解凍・結合
結論として、フォルダー配下をまとめて取得するには、単発の全コピーなら aws s3 cp --recursive、差分や繰り返し取得なら aws s3 sync を使います。大量ファイルでは同時転送数の設定で速度を改善できます。取得後のログは Linux コマンドで一括解凍・結合すると解析しやすくなります。
マネジメントコンソールの制約と AWS CLI の必要性
AWS Management Console から S3 を操作する場合、個別のファイルを選択してダウンロードすることはできますが、フォルダー(プレフィックス)全体を再帰的に一括ダウンロードする機能は標準では提供されていません。
そのため、日付ごとに蓄積された大量のシステムログなどをローカルへ保存する際、手動で 1 つずつダウンロードするのは非効率です。複数のファイルやフォルダー階層を一度に取得するには、コマンドラインツールの AWS CLI を使います。
AWS CLI を用いた一括ダウンロード手順
本手順は、Ubuntu 環境で AWS CLI を使うケースを想定しています。実行前に、AWS CLI のインストールと初期設定(アクセスキーなどの設定)を済ませておきます。インストール手順は、関連記事『AWS CLI インストール手順 Windows と Ubuntu|S3 と EC2 接続』も参考になります。
基本構文(aws s3 cp)
S3 からローカルへファイルをコピーするには aws s3 cp を使います。基本構文は次のとおりです。
aws s3 cp <source> <target> [--options]<source>: ダウンロード元の S3 URI(s3://...)<target>: 保存先のローカルディレクトリ。
フォルダーを一括ダウンロードする(cp –recursive)
指定したフォルダー内のすべてのファイルを再帰的に対象にするには --recursive を付けます。例として、S3 の example/logs フォルダー配下の全ファイルを、ローカルの ./tmp/awslogs に保存するコマンドは次のとおりです。
aws s3 cp s3://example/logs/ ./tmp/awslogs --recursive差分・繰り返し取得には sync が便利
繰り返しダウンロードする場合や、差分だけを取得したい場合は aws s3 sync が向きます。sync は既定で再帰的に動作するため --recursive は不要で、新規・更新されたファイルのみを転送します。
参考: aws s3 sync(AWS CLI コマンドリファレンス)
“Recursively copies new and updated files from the source to the destination”
(ソースから宛先へ、新規および更新されたファイルを再帰的にコピーする)
https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
転送を高速化する(同時転送数の調整)
ファイル数や容量が多い場合は、同時転送数を増やすと速くなることがあります。AWS CLI の転送コマンドはマルチスレッドで動作し、同時リクエスト数の既定値は 10 です。次のように調整できます。
# 同時転送数を 20 に設定(既定は 10)
aws configure set default.s3.max_concurrent_requests 20ただし、値を上げすぎると端末やネットワークの負荷が高まるため、環境に合わせて調整します。
対象の S3 URI の取得方法
<source> に指定する S3 URI(s3://...)は、手入力するとタイプミスの原因になります。対象のフォルダーやファイルを選択した状態で、AWS Management Console に表示される「S3 URI のコピー」アイコンをクリックすると、正確なパスをクリップボードへコピーできます。

ダウンロードしたログファイルの処理
AWS の各種サービス(CloudFront や ALB など)から S3 に出力されたログは、通常 .gz 形式で圧縮され、時間帯ごとに複数のファイルに分割されています。ローカルで効率的に解析するには、一括解凍と結合が便利です。
.gz ファイルの一括解凍
対象ディレクトリ配下のすべての .gz を一括解凍するには、次のコマンドを使います。-exec ... + 形式は、1 ファイルずつコマンドを起動するより効率的です。
# カレントディレクトリ配下の .gz をすべて解凍
find . -name '*.gz' -exec gunzip {} +ファイル名にスペースなどが含まれる可能性がある場合は、null 区切りで渡すと安全です。
find . -name '*.gz' -print0 | xargs -0 gunzipgunzip は解凍後に元の .gz ファイルを削除します。元ファイルを残したい場合は gunzip -k(keep)を使います。
解凍したファイルの結合と文字列抽出
複数に分かれたログ(例: examplelog01、examplelog02 など)を 1 つのファイルへ結合します。
# "example" で始まるファイルを結合して保存
cat example* > examplelogscat example* の結合順序は、シェルのファイル名のソート順に依存します。時系列順にしたい場合は、ファイル名を 0 埋めにするか、ls -v や sort で順序を整えてから結合します。特定の文字列を含む行だけを抽出するには grep を組み合わせます。
# 各ファイルから "https://example.com" を含む行を抽出して結合
cat example* | grep "https://example.com" > examplelogscp と sync の使い分け
S3 からのダウンロードでは、用途に応じて cp と sync を使い分けます。S3 運用全体の要点は、関連記事『Amazon S3 運用の要点|ストレージクラスとセキュリティの勘所』も参考になります。
| 観点 | aws s3 cp –recursive | aws s3 sync |
|---|---|---|
| 再帰 | --recursive が必要 | 既定で再帰 |
| 転送対象 | 対象を毎回すべてコピー(上書き) | 新規・更新分のみ |
| 向く場面 | 単発の全取得 | 差分取得・繰り返し実行 |
| 宛先の削除同期 | しない | --delete 指定時のみ |
さらに高速化が必要な場合は、CRT クライアント(aws configure set default.s3.preferred_transfer_client crt)や、外部ツールの s5cmd といった選択肢もあります。AWS CLI の高レベル S3 コマンドの詳細は、公式ドキュメント「Using high-level (s3) commands in the AWS CLI」も参照してください。
ダウンロード時の注意点
- データ転送コスト
-
S3 からインターネットへのダウンロードはデータ転送アウトの課金が発生します。大量ログの取得ではコストに留意し、VPC 内の EC2 から取得する場合はゲートウェイ型の VPC エンドポイント経由にすると、S3 への通信料金を抑えられます。
- 大文字小文字の衝突
-
Windows や macOS など大文字小文字を区別しないファイルシステムでは、キーが大小のみ異なるオブジェクト(例: a.txt と A.txt)をまとめて取得すると、ローカルで上書きや衝突が起こり得ます。
- 空フォルダー
-
cp・sync は宛先に空のフォルダーを作りません。
まとめ
本記事では、AWS CLI で S3 のフォルダーやファイルを一括ダウンロードする方法と、取得したログの整形について解説しました。コンソールではフォルダーごとの一括取得ができないため、cp や sync を使い分けるのが基本です。要点を以下に整理します。
- コンソールはフォルダー単位の再帰ダウンロードに非対応
- 単発の全取得は aws s3 cp –recursive
- 差分・繰り返し取得は aws s3 sync
- 大量転送は max_concurrent_requests の調整で高速化
- .gz の一括解凍は find と gunzip の組み合わせ
- ログの結合は cat、特定行の抽出は grep
- ダウンロードはデータ転送アウトの課金に留意
以上、最後までお読みいただきありがとうございました。
