AWS CLI で S3 のフォルダを一括ダウンロードする手順|cp と sync

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

はじめに

Amazon S3 にシステムログなどをフォルダー(プレフィックス)で階層化して保存している場合、解析やバックアップのために手元へダウンロードする作業が発生します。AWS Management Console の標準機能ではフォルダーごとの一括ダウンロードができないため、ファイル数が多い場合は AWS CLI を使ったコマンド操作が効率的です。

この記事でわかること
  • AWS Management Console の制約と一括ダウンロードの必要性
  • aws s3 cp --recursiveaws 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 gunzip

gunzip は解凍後に元の .gz ファイルを削除します。元ファイルを残したい場合は gunzip -k(keep)を使います。

解凍したファイルの結合と文字列抽出

複数に分かれたログ(例: examplelog01、examplelog02 など)を 1 つのファイルへ結合します。

# "example" で始まるファイルを結合して保存
cat example* > examplelogs

cat example* の結合順序は、シェルのファイル名のソート順に依存します。時系列順にしたい場合は、ファイル名を 0 埋めにするか、ls -vsort で順序を整えてから結合します。特定の文字列を含む行だけを抽出するには grep を組み合わせます。

# 各ファイルから "https://example.com" を含む行を抽出して結合
cat example* | grep "https://example.com" > examplelogs

cp と sync の使い分け

S3 からのダウンロードでは、用途に応じて cp と sync を使い分けます。S3 運用全体の要点は、関連記事『Amazon S3 運用の要点|ストレージクラスとセキュリティの勘所』も参考になります。

観点aws s3 cp –recursiveaws 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
  • ダウンロードはデータ転送アウトの課金に留意

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

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

この記事を書いた人

関西を拠点に活動する、現役インフラエンジニア。経験20年超。

大手通信キャリアにて、中〜大規模インフラ(ネットワーク・サーバ・クラウド・セキュリティ)の設計・構築およびプロジェクトマネジメントに従事。現場で直面した技術課題への対処や、最新の脆弱性情報への実務対応を、一次情報として発信しています。

保有資格
CCIE Lifetime Emeritus(取得から20年以上)/ VCAP-DCA / Azure Solutions Architect Expert

▶ 運営者プロフィール(詳細)

目次