はじめに
Amazon S3 でシステムログなどをフォルダ(プレフィックス)で階層化して保存している場合、ログの解析やバックアップのために手元へダウンロードする作業が発生します。
しかし、AWS Management Console(Web 画面)の標準機能では、フォルダごと一括でダウンロードすることができません。ファイル数が膨大な場合、手動でのダウンロードは非効率であるため、AWS CLI を用いたコマンド操作が必要になります。
本記事では、AWS CLI を使用してS3 のフォルダやファイルを一括ダウンロードする方法と、実運用のノウハウとして、ダウンロードした圧縮ログファイル(.gz)の一括解凍および結合手順について解説します。
- AWS Management Console の制約と一括ダウンロードの必要性
aws s3 cpコマンドを用いた一括ダウンロード手順(--recursiveオプション)- コマンドの実行例と対象 S3 URI の取得方法
- ダウンロードした複数ログファイル(.gz)の解凍と結合処理
マネジメントコンソールの制約と AWS CLI の必要性
AWS Management Console(Web 画面)から S3 バケットを操作する場合、個別のファイルを選択してダウンロードすることは可能ですが、フォルダ(プレフィックス)全体を一括でダウンロードする機能は標準で提供されていません。
そのため、日付ごとに蓄積された膨大なシステムログなどをローカル環境へ保存する際、手動で1つずつダウンロードするのは非常に非効率です。この課題を解決し、複数のファイルやフォルダ階層を一度にダウンロードするためには、コマンドラインツールである「AWS CLI」を使用する必要があります。
AWS CLI を用いた一括ダウンロード手順
本手順では、Ubuntu 環境で AWS CLI を使用するケースを想定しています。実行にあたり、あらかじめ AWS CLI のインストールと初期設定(アクセスキーなどの設定)を済ませておく必要があります。

基本構文とオプション
S3からローカルへファイルをコピーするには、aws s3 cp コマンドを使用します。基本構文は以下の通りです。
aws s3 cp <source> <target> [--options]<source>:ダウンロード元となる S3 の URI<target>:保存先のローカルディレクトリ
フォルダ一括ダウンロードの実行例
指定したフォルダ内のすべてのファイルを再帰的にダウンロード対象とするには、--recursive オプションを付与します。
例として、S3 の example/logs フォルダ内にある全ファイルを一括ダウンロードし、ローカルの ./tmp/awslogs ディレクトリに保存するコマンドは以下のようになります。
aws s3 cp s3://example/logs/ ./tmp/awslogs --recursive対象となる S3 URI の取得方法
<source> に指定する S3 の URI(s3://...)は、手入力するとタイプミスの原因になります。対象のフォルダやファイルを選択した状態で、AWS Management Console 上に表示される「S3 URI のコピー」アイコンをクリックすることで、正確なパスを簡単にクリップボードへコピーできます。

【実運用向け】ダウンロードしたログファイルの処理
AWS の各種サービス(CloudFront や ALB など)から S3 に出力されたログファイルは、通常 .gz 形式で圧縮されており、時間帯ごとに複数のファイルへ分割されています。
ダウンロードした膨大なログをローカル環境(Ubuntu 等)で効率的に調査・解析するためには、Linux コマンドを用いた一括解凍とファイルの結合が便利です。
.gz ファイルの一括解凍
対象ディレクトリ内のすべての .gz ファイルを再帰的に探し出し、一括で解凍するには以下のコマンドを実行します。
# カレントディレクトリ配下の .gz ファイルをすべて解凍する
find . -name '*.gz' | xargs -n1 gunzipこのコマンドにより、各ファイルが解凍されテキスト形式(ログファイル)として読み取れる状態になります。
解凍したファイルの結合と特定文字列の抽出
解凍後、複数に分かれているログファイル(例: examplelog01, examplelog02…)を時系列順に1つのファイルへ結合します。
# "example" から始まるすべてのファイルを結合し、"examplelogs" として保存
cat example* > examplelogsまた、システムのエラー調査などで「特定の文字列(特定の URL や IP アドレスなど)」を含むログ行だけを抽出して1つのファイルにまとめたい場合は、grep コマンドを組み合わせます。
# 各ファイルから "https://example.com" を含む行だけを抽出し、結合して保存
cat example* | grep "https://example.com" > examplelogsこれにより、ログの視認性が大幅に向上し、障害調査などの実運用をスムーズに進めることが可能です。AWS CLI の S3 コマンドに関する詳細な仕様については、以下の公式ドキュメントも併せてご参照ください。

まとめ
本記事では、AWS CLI を利用して S3 内のフォルダやファイルを一括ダウンロードする方法と、ログ解析に役立つコマンド操作について解説しました。
- AWS Management Console の標準機能ではフォルダごとの一括ダウンロードができない。
- フォルダごとダウンロードするには、AWS CLI で
aws s3 cpコマンドを使用する。 --recursiveオプションを付与することで、指定した S3 URI 配下の全ファイルが対象となる。- ダウンロードした複数の圧縮ログ(.gz)は、Linux コマンドを組み合わせて一括解凍・結合すると解析しやすい。
以上、最後までお読みいただきありがとうございました。
