【保存版】AWS CLI で S3 からダウンロードする方法を徹底解説!5つの実践的なコマンド例付き

AWS CLIでS3からダウンロードする基礎知識

AWS CLIとS3の関係性を理解しよう

AWS CLI(Command Line Interface)は、AWSのサービスをコマンドラインから操作するためのツールです。S3(Simple Storage Service)との関係において、AWS CLIは以下のような重要な役割を果たします:

機能説明
直接アクセスS3バケットやオブジェクトに直接アクセス可能
バッチ処理多数のファイルを一括で処理可能
自動化対応スクリプトによる自動処理が可能
クロスプラットフォームWindows、Mac、Linuxで利用可能

AWS CLIを使用することで、Webコンソールではできないような高度な操作や、大量のファイル処理を効率的に行うことができます。例えば:

  • 大量のファイルの一括ダウンロード
  • 特定のパターンに一致するファイルの抽出
  • 定期的なバックアップの自動化
  • CI/CDパイプラインでの利用

ダウンロードに必要な前提条件と準備

S3からファイルをダウンロードするために、以下の準備が必要です:

  1. AWS CLIのインストール
# Windows(PowerShell)の場合
msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi

# macOS/Linuxの場合
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
  1. 認証情報の設定
aws configure
AWS Access Key ID [None]: YOUR_ACCESS_KEY
AWS Secret Access Key [None]: YOUR_SECRET_KEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
  1. 必要な権限の確認
    以下のIAMポリシーが必要です:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket-name",
                "arn:aws:s3:::your-bucket-name/*"
            ]
        }
    ]
}
  1. 動作確認
# S3バケットの一覧を表示して接続確認
aws s3 ls

# 特定のバケットの内容を確認
aws s3 ls s3://your-bucket-name/

注意事項:

  • アクセスキーは定期的な更新を推奨
  • 本番環境では最小権限の原則に従う
  • 共有環境での認証情報の取り扱いに注意
  • リージョン設定が転送コストに影響することを考慮

これらの準備が整えば、AWS CLIを使用してS3からのファイルダウンロードを開始できます。次のセクションでは、具体的なダウンロード方法について説明します。

AWS CLIを使ったS3からのダウンロード方法

基本的なダウンロードコマンドの構文と使い方

AWS CLIでS3からファイルをダウンロードする基本コマンドは aws s3 cpaws s3 sync です。それぞれの特徴と基本的な使い方を解説します。

aws s3 cp コマンド

# 基本構文
aws s3 cp s3://bucket-name/path/to/file local-path

# 例:単一ファイルのダウンロード
aws s3 cp s3://my-bucket/documents/report.pdf ./

# オプション付きの例
aws s3 cp s3://my-bucket/data.zip ./ --quiet --expires 3600

主要なオプション:

オプション説明
–quiet進行状況の表示を抑制
–recursiveディレクトリを再帰的にコピー
–exclude除外するパターンを指定
–include含めるパターンを指定

複数のファイルを一括ダウンロードする方法

複数ファイルを効率的にダウンロードするには、ワイルドカードや –recursive オプションを活用します。

# ワイルドカードを使用した例
aws s3 cp s3://my-bucket/logs/2024-01-* ./logs/

# 特定の拡張子のファイルをダウンロード
aws s3 cp s3://my-bucket/ ./ --recursive --exclude "*" --include "*.jpg"

# 複数条件の組み合わせ
aws s3 cp s3://my-bucket/data/ ./local-data/ \
    --recursive \
    --exclude "*" \
    --include "2024-*" \
    --include "*.csv"

効率的なダウンロードのためのTips:

  1. --recursive は慎重に使用(予期せぬファイルのダウンロードを防ぐ)
  2. --dryrun オプションで実行前に動作確認
  3. --exclude--includeの順序に注意
  4. 大量ファイルの場合はsyncコマンドの使用を検討

フォルダごとダウンロードするテクニック

フォルダ単位でのダウンロードには、aws s3 syncコマンドが最適です。

# 基本的なフォルダ同期
aws s3 sync s3://my-bucket/folder/ ./local-folder/

# 削除を含めた完全同期
aws s3 sync s3://my-bucket/folder/ ./local-folder/ --delete

# 特定の条件での同期
aws s3 sync s3://my-bucket/folder/ ./local-folder/ \
    --exclude "*.tmp" \
    --include "*.pdf" \
    --size-only

syncコマンドの主要オプション:

オプション説明
–deleteソースにないファイルを削除
–size-onlyサイズのみで比較
–exact-timestampsタイムスタンプで厳密に比較
–no-progress進行状況の表示を無効化

重要な注意点:

  1. --deleteオプションは慎重に使用
  2. 大規模なフォルダ同期は帯域幅とコストに注意
  3. 権限設定は同期後に確認
  4. エラー時は--continueオプションで再開可能

これらのコマンドとオプションを組み合わせることで、様々なダウンロードシナリオに対応できます。次のセクションでは、より具体的な実践例を紹介します。

実践的なダウンロードコマンド例5選

単一ファイルをダウンロードする例

最もシンプルなユースケースである単一ファイルのダウンロードから、応用的な使い方まで見ていきましょう。

# 基本的な単一ファイルダウンロード
aws s3 cp s3://my-bucket/reports/annual_2023.pdf ./downloads/

# ファイル名を変更してダウンロード
aws s3 cp s3://my-bucket/logs/app.log ./logs/app_$(date +%Y%m%d).log

# 特定の条件を満たす場合のみダウンロード
aws s3 cp s3://my-bucket/data.csv ./ \
    --expected-size 1048576 \
    --only-show-errors

実行結果例:

download: s3://my-bucket/reports/annual_2023.pdf to ./downloads/annual_2023.pdf

ワイルドカードを使用したダウンロード例

ワイルドカードを使用することで、特定のパターンに一致するファイルを効率的にダウンロードできます。

# 特定のプレフィックスを持つファイルをダウンロード
aws s3 cp s3://my-bucket/logs/2024-01-* ./logs/ \
    --recursive \
    --quiet

# 複数の拡張子を対象にダウンロード
aws s3 cp s3://my-bucket/documents/ ./local-docs/ \
    --recursive \
    --exclude "*" \
    --include "*.pdf" \
    --include "*.docx"

# 日付範囲を指定したダウンロード
aws s3 cp s3://my-bucket/logs/ ./logs/ \
    --recursive \
    --exclude "*" \
    --include "2024-01-*" \
    --include "2024-02-*"

条件パターンを指定したダウンロード例

より複雑な条件でファイルを選別してダウンロードする例を紹介します。

# サイズによるフィルタリング
aws s3 cp s3://my-bucket/images/ ./images/ \
    --recursive \
    --exclude "*" \
    --include "*.jpg" \
    --size-only \
    --exclude "*_thumb.jpg"

# タイムスタンプによるフィルタリング
aws s3 cp s3://my-bucket/reports/ ./reports/ \
    --recursive \
    --exclude "*" \
    --include "*.pdf" \
    --exact-timestamps

# 複数条件の組み合わせ
aws s3 cp s3://my-bucket/data/ ./data/ \
    --recursive \
    --exclude "*" \
    --include "2024-*" \
    --include "*.csv" \
    --exclude "*temp*" \
    --exclude "*backup*"

再帰的なダウンロード例

ディレクトリ構造を維持したままダウンロードする方法を説明します。

# 基本的な再帰的ダウンロード
aws s3 cp s3://my-bucket/project/ ./local-project/ \
    --recursive \
    --only-show-errors

# 特定のディレクトリ構造のみを対象
aws s3 cp s3://my-bucket/project/ ./backup/ \
    --recursive \
    --exclude "*" \
    --include "src/*" \
    --include "docs/*"

# 除外パターンを使用した再帰的ダウンロード
aws s3 cp s3://my-bucket/website/ ./website-backup/ \
    --recursive \
    --exclude "*.tmp" \
    --exclude "node_modules/*" \
    --exclude ".git/*"

同期コマンドを使用したダウンロード例

syncコマンドを使用した効率的なダウンロード方法を紹介します。

# 基本的なディレクトリ同期
aws s3 sync s3://my-bucket/project/ ./local-project/ \
    --only-show-errors

# 削除を含めた完全同期
aws s3 sync s3://my-bucket/website/ ./website/ \
    --delete \
    --exclude "*.log" \
    --exclude "temp/*"

# 差分のみを同期(最適化)
aws s3 sync s3://my-bucket/data/ ./data/ \
    --size-only \
    --exclude "*.tmp" \
    --include "*.csv"

各コマンド例のポイント:

  1. 目的に応じた適切なオプションの選択
  2. エラー処理とログ出力の制御
  3. パフォーマンスとコストの最適化
  4. セキュリティ考慮事項の遵守

これらの実践的な例を基に、自身の用途に合わせてカスタマイズすることで、効率的なS3ファイル管理が可能になります。

効率的なダウンロード管理のベストプラクティス

大容量ファイルをダウンロードする際の注意点

大容量ファイルのダウンロードは、ネットワーク帯域幅やストレージ容量に大きな影響を与える可能性があります。以下のベストプラクティスを参考にしてください。

パフォーマンス最適化のポイント

  1. マルチパートダウンロードの活用
# 大容量ファイルのダウンロード設定例
aws configure set default.s3.multipart_threshold 64MB
aws configure set default.s3.multipart_chunksize 16MB
  1. 転送速度の制御
# 帯域制限付きダウンロード
aws s3 cp s3://my-bucket/large-file.zip ./ \
    --expected-size 5368709120 \
    --only-show-errors \
    --quiet
  1. レジューム機能の活用
# 中断時の再開機能を使用
aws s3 cp s3://my-bucket/huge-archive.tar.gz ./ \
    --continue-put

メモリ管理のベストプラクティス

  • ダウンロード前の空き容量確認
  • 一時ファイルの定期的なクリーンアップ
  • メモリ使用量のモニタリング設定

ダウンロード時のセキュリティ設定

セキュアなS3ダウンロードを実現するための重要な設定と注意点について説明します。

セキュリティ設定のチェックリスト

  1. IAMポリシーの最適化
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::specific-bucket",
                "arn:aws:s3:::specific-bucket/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": ["your-ip-range"]
                }
            }
        }
    ]
}
  1. 暗号化設定
# 暗号化されたファイルのダウンロード
aws s3 cp s3://my-bucket/encrypted-file.dat ./ \
    --sse aws:kms \
    --sse-kms-key-id your-kms-key-id
  1. セキュリティ監査の設定
  • CloudTrailによるAPI呼び出しの記録
  • アクセスログの有効化
  • セキュリティイベントの通知設定

エラー発生時のトラブルシューティング

一般的なエラーパターンと解決方法について説明します。

よくあるエラーと対処方法

  1. アクセス権限エラー
An error occurred (AccessDenied) when calling the GetObject operation: Access Denied

対処法:

  • IAMポリシーの確認
  • バケットポリシーの確認
  • アクセスキーの有効期限確認
  1. ネットワークエラー
Connection reset by peer

対処法:

# リトライ設定の追加
aws configure set default.s3.max_concurrent_requests 20
aws configure set default.s3.max_queue_size 10000
  1. ストレージエラー
No space left on device

対処法:

# ディスク使用量の確認
df -h
# 不要ファイルの削除
find /path/to/downloads -type f -mtime +30 -delete

トラブルシューティングのベストプラクティス

  1. デバッグモードの活用
# デバッグ情報の出力
aws s3 cp s3://my-bucket/file.txt ./ --debug
  1. ログ収集の設定
# AWS CLIのログ設定
export AWS_CLI_FILE_ENCODING=UTF-8
export AWS_DEFAULT_OUTPUT=json
  1. エラー監視の自動化
# エラーログの転送設定
aws logs create-log-group --log-group-name /aws/cli/errors
aws logs put-retention-policy --log-group-name /aws/cli/errors --retention-in-days 14

これらのベストプラクティスを適用することで、安全で効率的なS3ファイルダウンロードの運用が可能になります。特に大規模な運用を行う場合は、これらの設定を適切に組み合わせることが重要です。

AWS CLIを使ったS3ダウンロードのテクニック応用

スクリプトを使った自動ダウンロードの実装

バッチ処理や定期的なダウンロードを自動化するスクリプトの実装例を紹介します。

シェルスクリプトによる自動化例

#!/bin/bash

# 設定
BUCKET="my-bucket"
PREFIX="logs/"
LOCAL_DIR="/var/log/s3-backup/"
LOG_FILE="/var/log/s3-download.log"

# 日付フォーマット
DATE=$(date +%Y-%m-%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

# ログ関数
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# エラーハンドリング
handle_error() {
    log_message "ERROR: $1"
    # Slack通知などを実装可能
    exit 1
}

# S3からのダウンロード実行
download_from_s3() {
    log_message "Starting download from s3://$BUCKET/$PREFIX$YESTERDAY/"

    aws s3 sync "s3://$BUCKET/$PREFIX$YESTERDAY/" \
        "$LOCAL_DIR$YESTERDAY/" \
        --only-show-errors \
        --exclude "*.tmp" \
        || handle_error "Failed to sync S3 files"

    log_message "Download completed successfully"
}

# メイン処理
main() {
    # ディレクトリ作成
    mkdir -p "$LOCAL_DIR$YESTERDAY"

    # ダウンロード実行
    download_from_s3

    # 古いログの削除(30日以上前)
    find "$LOCAL_DIR" -type d -mtime +30 -exec rm -rf {} \;
}

# スクリプト実行
main

定期実行の設定(crontab例)

# 毎日午前2時に実行
0 2 * * * /path/to/s3-download-script.sh

CloudWatchと組み合わせた監視方法

CloudWatchを使用してS3ダウンロードの監視を実装する方法を説明します。

CloudWatchメトリクスの設定

# メトリクス送信用の関数
send_metric() {
    aws cloudwatch put-metric-data \
        --namespace "S3Downloads" \
        --metric-name "DownloadSize" \
        --value "$1" \
        --unit "Bytes" \
        --dimensions "Bucket=$BUCKET"
}

# ダウンロードサイズの監視
file_size=$(aws s3 ls "s3://$BUCKET/$file" --human-readable | awk '{print $3}')
send_metric "$file_size"

アラート設定の例

# CloudWatchアラームの作成
aws cloudwatch put-metric-alarm \
    --alarm-name "LargeS3Download" \
    --alarm-description "Alert on large S3 downloads" \
    --metric-name "DownloadSize" \
    --namespace "S3Downloads" \
    --statistic "Sum" \
    --period 300 \
    --threshold 1073741824 \
    --comparison-operator "GreaterThanThreshold" \
    --evaluation-periods 1 \
    --alarm-actions "arn:aws:sns:region:account-id:topic-name"

IAMポリシーによるアクセス制御の最適化

セキュアで効率的なアクセス制御を実現するIAMポリシーの設定例を紹介します。

環境別のポリシー設定

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowProductionDownloads",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::production-bucket",
                "arn:aws:s3:::production-bucket/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalTag/Environment": "production"
                }
            }
        },
        {
            "Sid": "AllowMetricsPublishing",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": "S3Downloads"
                }
            }
        }
    ]
}

セキュリティ強化のためのポリシー設定

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EnforceEncryption",
            "Effect": "Deny",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::secure-bucket/*",
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            }
        }
    ]
}

実装のポイント:

  1. エラーハンドリングの徹底
  2. ログ記録の適切な実装
  3. セキュリティ設定の確実な適用
  4. パフォーマンスの最適化
  5. 監視とアラートの適切な設定

これらの応用テクニックを活用することで、より堅牢で効率的なS3ダウンロード運用が実現できます。