【AWS】AWS CLI で S3 のフォルダ・ファイルを一括ダウンロードする方法

  • URLをコピーしました!
目次

はじめに

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 コマンドを組み合わせて一括解凍・結合すると解析しやすい。

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

インフラ(クラウド/NW/仮想化)から Web 開発まで、技術領域を横断して活動するエンジニア💻 コンシューマー向けエンタメ事業での新規開発・運営経験を活かし、実戦的な技術ノウハウを発信中

[ Certs ] CCIE Lifetime Emeritus / VCAP-DCA ✒️ [ Life ] 技術書・ビジネス書愛好家📖 / 小・中学校で卓球コーチ👟

目次