AWS CLI S3 アップロードの基礎知識
AWS CLI と S3 の関係性を理解しよう
AWS CLIは、AWSのサービスをコマンドラインから操作するための公式ツールです。S3(Simple Storage Service)との関係において、AWS CLIは以下の重要な役割を果たします:
- 直接的なファイル操作
- ローカルファイルのアップロード
- S3バケットからのダウンロード
- バケット間のファイルコピー
- ファイルの削除や移動
- 自動化の実現
- シェルスクリプトでの利用
- バッチ処理の実装
- CI/CDパイプラインとの統合
AWS CLIを使用することで、WebコンソールではなくコマンドラインからS3の操作が可能となり、効率的なファイル管理や自動化が実現できます。
アップロードに必要な前提条件と準備
1. AWS CLIのインストール
各OS向けのインストール方法を紹介します:
Linux/macOS(pip使用)
# pipのインストール(未導入の場合) sudo apt-get install python3-pip # Ubuntuの場合 sudo yum install python3-pip # Amazon Linux/CentOSの場合 # AWS CLIのインストール pip3 install awscli --upgrade --user
Windows
- AWS CLI公式インストーラーをダウンロードして実行
インストール後、バージョン確認で正常にインストールされたことを確認します:
aws --version
2. AWS認証情報の設定
AWS CLIを使用するには、適切な認証情報の設定が必要です:
aws configure
このコマンドを実行すると、以下の情報の入力を求められます:
- AWS Access Key ID
- AWS Secret Access Key
- Default region name(例:ap-northeast-1)
- Default output format(json/yaml/text/table)
3. 必要なIAM権限の確認
S3操作に必要な最小限のIAMポリシー例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::your-bucket-name/*", "arn:aws:s3:::your-bucket-name" ] } ] }
4. 動作確認
設定が完了したら、簡単なコマンドで動作確認を行います:
# バケットの一覧を表示 aws s3 ls # 特定のバケットの内容を表示 aws s3 ls s3://your-bucket-name/
これらの前提条件を満たすことで、AWS CLIを使用したS3へのファイルアップロードが可能となります。次のセクションでは、具体的なアップロードコマンドとその使用方法について説明します。
S3アップロードの基本コマンド解説
aws s3 cpコマンドでファイルを転送する
aws s3 cp
コマンドは、ローカルファイルシステムとS3バケット間でファイルをコピーする際に使用する基本的なコマンドです。
基本的な使用方法
# ローカルファイルをS3にアップロード aws s3 cp myfile.txt s3://my-bucket/ # S3上の特定のパスにアップロード aws s3 cp myfile.txt s3://my-bucket/folder/myfile.txt # S3からローカルにダウンロード aws s3 cp s3://my-bucket/myfile.txt ./ # バケット間でのファイルコピー aws s3 cp s3://source-bucket/file.txt s3://dest-bucket/
よく使用するオプション
- –recursive:ディレクトリ全体をコピー
aws s3 cp ./local-folder s3://my-bucket/remote-folder --recursive
- –excludeと–include:特定のファイルパターンを除外/含める
# .gitファイルを除外してアップロード aws s3 cp ./local-folder s3://my-bucket/ --recursive --exclude "*.git/*" # jpgファイルのみをアップロード aws s3 cp ./local-folder s3://my-bucket/ --recursive --include "*.jpg" --exclude "*"
- –storage-class:ストレージクラスの指定
# STANDARD_IAストレージクラスでアップロード aws s3 cp large-file.zip s3://my-bucket/ --storage-class STANDARD_IA
aws s3 syncコマンドでディレクトリを同期する
aws s3 sync
は、ディレクトリ間の差分を検出し、必要なファイルのみを転送する効率的なコマンドです。
基本的な使用方法
# ローカルディレクトリをS3と同期 aws s3 sync ./local-folder s3://my-bucket/remote-folder # S3のコンテンツをローカルと同期 aws s3 sync s3://my-bucket/remote-folder ./local-folder # バケット間での同期 aws s3 sync s3://source-bucket/ s3://dest-bucket/
syncコマンドの特徴的なオプション
- –delete:転送先に存在するが転送元にないファイルを削除
aws s3 sync ./local-folder s3://my-bucket/remote-folder --delete
- –size-only:サイズの変更のみを検出して同期
aws s3 sync ./local-folder s3://my-bucket/remote-folder --size-only
よく使うオプションと使用例
1. アクセス制御の設定
# パブリックな読み取り権限を付与 aws s3 cp file.txt s3://my-bucket/ --acl public-read # 特定のユーザーに権限を付与 aws s3 cp file.txt s3://my-bucket/ --grants read=emailaddress=user@example.com
2. メタデータの設定
# Content-Typeの指定 aws s3 cp style.css s3://my-bucket/ --content-type text/css # カスタムメタデータの追加 aws s3 cp file.txt s3://my-bucket/ --metadata '{"project":"website","version":"1.0"}'
3. 暗号化オプション
# SSE-S3による暗号化 aws s3 cp secret.txt s3://my-bucket/ --sse AES256 # KMSによる暗号化 aws s3 cp secret.txt s3://my-bucket/ --sse aws:kms --sse-kms-key-id your-kms-key-id
4. 転送設定の最適化
# マルチパートアップロードのしきい値を設定 aws s3 cp large-file.zip s3://my-bucket/ --multipart-threshold 64MB # 同時転送数の設定 aws s3 cp folder/ s3://my-bucket/ --recursive --max-concurrent-requests 20
これらのコマンドとオプションを組み合わせることで、様々なユースケースに対応したS3へのファイル転送が可能になります。次のセクションでは、より高度な実践的テクニックについて説明します。
実践的なテクニックアップロード
大容量ファイルを効率的に転送するマルチパートアップロード
マルチパートアップロードは、大容量ファイルを分割して並行アップロードすることで、転送効率を向上させる手法です。
マルチパートアップロードの設定
# マルチパートアップロードの最小サイズを設定 aws configure set default.s3.multipart_threshold 64MB # パート単位のサイズを設定 aws configure set default.s3.multipart_chunksize 16MB # 同時アップロードの最大数を設定 aws configure set default.s3.max_concurrent_requests 20
シェルスクリプトによる高度なマルチパートアップロード制御
#!/bin/bash file_to_upload="large_file.zip" bucket_name="my-bucket" part_size="16MB" # ファイルサイズを取得 file_size=$(stat -f%z "$file_to_upload") # アップロードコマンドの実行 aws s3 cp "$file_to_upload" "s3://$bucket_name/" \ --multipart-threshold 64MB \ --multipart-chunksize $part_size \ --expected-size $file_size
ワイルドカードを使用した一括アップロード
複数のファイルを効率的にアップロードするためのテクニックを紹介します。
基本的なワイルドカードパターン
# 特定の拡張子のファイルをアップロード aws s3 cp . s3://my-bucket/ --recursive --exclude "*" --include "*.jpg" # 複数の拡張子を指定してアップロード aws s3 cp . s3://my-bucket/ --recursive --include "*.jpg" --include "*.png" # 特定のプレフィックスを持つファイルをアップロード aws s3 cp . s3://my-bucket/ --recursive --include "prefix-*.*"
高度なファイルフィルタリング
# 日付パターンでのフィルタリング aws s3 cp . s3://my-bucket/ --recursive \ --exclude "*" \ --include "2024-*/*.log" # サイズベースのフィルタリング(シェルスクリプト使用) #!/bin/bash for file in *; do if [ -f "$file" ] && [ $(stat -f%z "$file") -gt 1048576 ]; then aws s3 cp "$file" "s3://my-bucket/large-files/" fi done
アップロード時のパターン設定
効率的なファイル管理のためのパターン設定テクニックを解説します。
ディレクトリ構造の維持
# ローカルのディレクトリ構造を維持してアップロード aws s3 cp ./project s3://my-bucket/backup/ \ --recursive \ --metadata "timestamp=$(date +%Y%m%d)" # 特定のディレクトリ構造のみを抽出してアップロード find . -type f -path "*/src/*.js" -exec \ aws s3 cp {} s3://my-bucket/code/{} \;
自動整理機能の実装
#!/bin/bash # アップロード先のプレフィックスを日付で自動生成 date_prefix=$(date +%Y/%m/%d) # ファイルの種類ごとに異なるディレクトリへアップロード for file in *; do if [[ $file =~ \.jpg$ ]]; then aws s3 cp "$file" "s3://my-bucket/images/$date_prefix/" elif [[ $file =~ \.pdf$ ]]; then aws s3 cp "$file" "s3://my-bucket/documents/$date_prefix/" elif [[ $file =~ \.log$ ]]; then aws s3 cp "$file" "s3://my-bucket/logs/$date_prefix/" fi done
メタデータと整理の連携
#!/bin/bash # ファイルのメタデータを自動設定してアップロード upload_with_metadata() { local file="$1" local content_type=$(file --mime-type -b "$file") local modified_date=$(date -r "$file" +%Y-%m-%d) aws s3 cp "$file" "s3://my-bucket/organized/$modified_date/" \ --content-type "$content_type" \ --metadata "upload_date=$(date +%Y-%m-%d)" \ --metadata "content_category=$(basename $(dirname "$file"))" } # ディレクトリ内のファイルを処理 find . -type f -exec bash -c 'upload_with_metadata "$0"' {} \;
これらの実践的なテクニックを活用することで、大規模なファイル転送や複雑なアップロード要件にも効率的に対応できます。次のセクションでは、これらの操作中に発生する可能性のあるエラーとその対処方法について説明します。
エラー対処とトラブルシューティング
一般的なエラーメッセージと解決方法
1. 認証関連のエラー
エラー: Unable to locate credentials
Unable to locate credentials. You can configure credentials by running "aws configure".
解決方法:
- AWS認証情報の設定を確認
# 認証情報の設定 aws configure # 現在の設定を確認 aws configure list
- 環境変数での設定
export AWS_ACCESS_KEY_ID="your_access_key" export AWS_SECRET_ACCESS_KEY="your_secret_key" export AWS_DEFAULT_REGION="ap-northeast-1"
2. アクセス権限のエラー
エラー: Access Denied
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
解決方法:
- IAMポリシーの確認と修正
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::bucket-name/*", "arn:aws:s3:::bucket-name" ] } ] }
- バケットポリシーの確認
# バケットポリシーの確認 aws s3api get-bucket-policy --bucket bucket-name # バケットのACL確認 aws s3api get-bucket-acl --bucket bucket-name
3. ネットワーク関連のエラー
エラー: Connection timed out
Connection timed out: https://s3.ap-northeast-1.amazonaws.com/
解決手順:
- ネットワーク接続の確認
# エンドポイントへの接続確認 curl -v https://s3.ap-northeast-1.amazonaws.com/ # プロキシ設定の確認と設定 export HTTP_PROXY="http://proxy.example.com:8080" export HTTPS_PROXY="http://proxy.example.com:8080"
- リージョン設定の確認
# リージョンの確認 aws configure get region # リージョンの変更 aws configure set region ap-northeast-1
パーミッションとIAMロールの設定確認
1. IAMロールの確認手順
# 現在のIAMユーザー/ロールの確認 aws sts get-caller-identity # IAMロールの詳細確認 aws iam get-role --role-name your-role-name # ロールポリシーの確認 aws iam list-role-policies --role-name your-role-name aws iam list-attached-role-policies --role-name your-role-name
2. S3バケットのパーミッション確認
# バケットのパブリックアクセス設定確認 aws s3api get-public-access-block --bucket bucket-name # バケットの暗号化設定確認 aws s3api get-bucket-encryption --bucket bucket-name # バケットのバージョニング確認 aws s3api get-bucket-versioning --bucket bucket-name
3. トラブルシューティング用のデバッグモード
# デバッグモードでコマンドを実行 aws s3 cp file.txt s3://bucket-name/ --debug # AWS CLIのログレベル設定 aws configure set cli_history enabled aws configure set cli_follow_urlparam true
4. 一般的なトラブルシューティングスクリプト
#!/bin/bash check_s3_access() { local bucket_name="$1" echo "=== S3アクセス診断開始 ===" # 認証情報の確認 echo "1. 認証情報の確認" aws sts get-caller-identity # バケットの存在確認 echo "2. バケットの存在確認" aws s3api head-bucket --bucket "$bucket_name" 2>&1 # バケットの一覧表示権限確認 echo "3. バケット一覧表示権限の確認" aws s3 ls "s3://$bucket_name" 2>&1 # バケットポリシーの確認 echo "4. バケットポリシーの確認" aws s3api get-bucket-policy --bucket "$bucket_name" 2>&1 echo "=== 診断完了 ===" } # 使用例 check_s3_access "your-bucket-name"
これらのトラブルシューティング手法を理解することで、AWS CLI S3操作時の問題を効率的に解決できます。次のセクションでは、セキュリティとベストプラクティスについて説明します。
セキュリティとベストプラクティス
暗号化オプションの適切な選択
S3でのデータ暗号化には、サーバーサイド暗号化(SSE)の3つの主要オプションがあります。
1. AWS S3管理キー(SSE-S3)の使用
最も簡単に実装できる暗号化オプションです。
# SSE-S3でファイルをアップロード aws s3 cp sensitive-file.txt s3://my-bucket/ --sse AES256 # バケットのデフォルト暗号化設定 aws s3api put-bucket-encryption \ --bucket my-bucket \ --server-side-encryption-configuration '{ "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] }'
2. AWS KMS管理キー(SSE-KMS)の使用
より高度な鍵管理と監査機能が必要な場合に適しています。
# KMSキーを使用したアップロード aws s3 cp confidential.pdf s3://my-bucket/ \ --sse aws:kms \ --sse-kms-key-id alias/my-kms-key # カスタムKMSキーの作成 aws kms create-key --description "S3 Encryption Key" # キーエイリアスの設定 aws kms create-alias \ --alias-name alias/s3-key \ --target-key-id <key-id>
3. カスタマー提供キー(SSE-C)の使用
最も高度なセキュリティが必要な場合に使用します。
# カスタマーキーを使用したアップロード aws s3 cp secret.txt s3://my-bucket/ \ --sse-c AES256 \ --sse-c-key "$(openssl rand -base64 32)" \ --sse-c-key-md5 "$(openssl rand -base64 32 | openssl md5 -binary | base64)"
アクセス制御と政策設定のポイント
1. 最小権限の原則に基づくIAMポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "MinimumS3Permissions", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::my-bucket/uploads/*" ], "Condition": { "StringEquals": { "s3:x-amz-server-side-encryption": "AES256" } } } ] }
2. バケットポリシーのベストプラクティス
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceTLS", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } }, { "Sid": "EnforceEncryption", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-bucket/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" } } } ] }
3. セキュリティベストプラクティスの実装スクリプト
#!/bin/bash secure_bucket() { local bucket_name="$1" # パブリックアクセスのブロック aws s3api put-public-access-block \ --bucket "$bucket_name" \ --public-access-block-configuration '{ "BlockPublicAcls": true, "IgnorePublicAcls": true, "BlockPublicPolicy": true, "RestrictPublicBuckets": true }' # バージョニングの有効化 aws s3api put-bucket-versioning \ --bucket "$bucket_name" \ --versioning-configuration Status=Enabled # デフォルト暗号化の設定 aws s3api put-bucket-encryption \ --bucket "$bucket_name" \ --server-side-encryption-configuration '{ "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] }' # セキュアな転送の強制 aws s3api put-bucket-policy \ --bucket "$bucket_name" \ --policy '{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceTLSOnly", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::'"$bucket_name"'", "arn:aws:s3:::'"$bucket_name"'/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } } ] }' } # バケットのセキュリティ設定を確認するスクリプト check_bucket_security() { local bucket_name="$1" echo "=== バケットセキュリティ診断開始 ===" # パブリックアクセス設定の確認 echo "1. パブリックアクセス設定:" aws s3api get-public-access-block --bucket "$bucket_name" # 暗号化設定の確認 echo "2. 暗号化設定:" aws s3api get-bucket-encryption --bucket "$bucket_name" # バージョニング設定の確認 echo "3. バージョニング設定:" aws s3api get-bucket-versioning --bucket "$bucket_name" # バケットポリシーの確認 echo "4. バケットポリシー:" aws s3api get-bucket-policy --bucket "$bucket_name" echo "=== 診断完了 ===" }
これらのセキュリティプラクティスを適切に実装することで、S3でのデータ保護を確実なものにできます。次のセクションでは、自動化とCI/CD統合について説明します。
自動化とCI/CD統合
シェルスクリプトでアップロードを自動化する
バックアップやデプロイメントなど、定期的なS3アップロード作業を自動化する方法を解説します。
基本的な自動アップロードスクリプト
#!/bin/bash # 設定変数 SOURCE_DIR="/path/to/source" BUCKET_NAME="my-bucket" LOG_FILE="/var/log/s3-upload.log" # ログ出力関数 log_message() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # メインの処理関数 upload_to_s3() { local source_dir="$1" local bucket="$2" # 前処理:ディレクトリ存在確認 if [ ! -d "$source_dir" ]; then log_message "エラー: ソースディレクトリが存在しません" return 1 } # S3アップロード実行 log_message "アップロード開始: $source_dir → s3://$bucket/" aws s3 sync "$source_dir" "s3://$bucket/" \ --delete \ --exclude "*.tmp" \ --metadata "upload-date=$(date +%Y-%m-%d)" \ 2>> "$LOG_FILE" if [ $? -eq 0 ]; then log_message "アップロード成功" return 0 else log_message "アップロード失敗" return 1 fi } # スクリプト実行 upload_to_s3 "$SOURCE_DIR" "$BUCKET_NAME"
高度な自動化スクリプト
より実践的な機能を備えたスクリプトの例です:
#!/bin/bash # 設定 CONFIG_FILE="s3_upload_config.json" MAX_RETRIES=3 SLEEP_TIME=5 # 設定ファイルの読み込み if [ -f "$CONFIG_FILE" ]; then BUCKET_NAME=$(jq -r '.bucket_name' "$CONFIG_FILE") SOURCE_DIR=$(jq -r '.source_directory' "$CONFIG_FILE") EXCLUDE_PATTERNS=$(jq -r '.exclude_patterns[]' "$CONFIG_FILE") else echo "エラー: 設定ファイルが見つかりません" exit 1 fi # アップロード関数 upload_with_retry() { local file="$1" local bucket_path="$2" local retry_count=0 while [ $retry_count -lt $MAX_RETRIES ]; do if aws s3 cp "$file" "s3://$BUCKET_NAME/$bucket_path" \ --metadata "checksum=$(md5sum "$file" | cut -d' ' -f1)"; then echo "アップロード成功: $file" return 0 else retry_count=$((retry_count + 1)) echo "アップロード失敗: 再試行 $retry_count/$MAX_RETRIES" sleep $SLEEP_TIME fi done return 1 } # ファイル処理関数 process_files() { find "$SOURCE_DIR" -type f | while read -r file; do # 除外パターンのチェック local should_skip=false for pattern in $EXCLUDE_PATTERNS; do if [[ "$file" == *"$pattern"* ]]; then should_skip=true break fi done if [ "$should_skip" = false ]; then # 相対パスの計算 local relative_path="${file#$SOURCE_DIR/}" upload_with_retry "$file" "$relative_path" fi done } # メイン処理 main() { echo "アップロード処理開始: $(date)" # AWS認証確認 if ! aws sts get-caller-identity &>/dev/null; then echo "エラー: AWS認証情報が設定されていません" exit 1 } # ファイル処理実行 process_files echo "アップロード処理完了: $(date)" } main
GitHub ActionsでのS3アップロード設定例
基本的なワークフローの実装
name: S3 Deploy on: push: branches: [ main ] pull_request: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - name: リポジトリのチェックアウト uses: actions/checkout@v2 - name: AWS認証情報の設定 uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ap-northeast-1 - name: ビルド run: | npm install npm run build - name: S3へのデプロイ run: | aws s3 sync ./dist s3://${{ secrets.AWS_S3_BUCKET }}/ \ --delete \ --metadata "github-sha=${{ github.sha }}"
環境別デプロイワークフロー
name: Multi-Environment S3 Deploy on: push: branches: - develop - staging - main workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: 環境変数の設定 id: env run: | if [[ ${{ github.ref }} == 'refs/heads/main' ]]; then echo "::set-output name=bucket::${{ secrets.PROD_S3_BUCKET }}" echo "::set-output name=environment::production" elif [[ ${{ github.ref }} == 'refs/heads/staging' ]]; then echo "::set-output name=bucket::${{ secrets.STAGING_S3_BUCKET }}" echo "::set-output name=environment::staging" else echo "::set-output name=bucket::${{ secrets.DEV_S3_BUCKET }}" echo "::set-output name=environment::development" fi - name: AWS認証情報の設定 uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ap-northeast-1 - name: ビルドとデプロイ env: BUCKET_NAME: ${{ steps.env.outputs.bucket }} ENVIRONMENT: ${{ steps.env.outputs.environment }} run: | # ビルド処理 npm install npm run build # デプロイ処理 aws s3 sync ./dist s3://$BUCKET_NAME/ \ --delete \ --metadata "{\"environment\":\"$ENVIRONMENT\",\"github-sha\":\"${{ github.sha }}\"}" # CloudFrontキャッシュのクリア(必要な場合) if [ "$ENVIRONMENT" = "production" ]; then aws cloudfront create-invalidation \ --distribution-id ${{ secrets.CLOUDFRONT_DIST_ID }} \ --paths "/*" fi
これらのスクリプトとワークフロー設定を活用することで、S3へのファイルアップロードを効率的に自動化できます。次のセクションでは、パフォーマンス最適化とコスト管理について説明します。
パフォーマンス最適化とコスト管理
転送速度を向上させるチューニングテクニック
1. マルチパートアップロードの最適化
AWS CLIの転送設定をカスタマイズすることで、大容量ファイルの転送効率を向上させることができます。
# ~/.aws/configに以下の設定を追加[default]
s3 = multipart_threshold = 64MB # マルチパート転送を開始するサイズ multipart_chunksize = 16MB # 各パートのサイズ max_concurrent_requests = 20 # 同時リクエスト数 max_queue_size = 10000 # 転送キューのサイズ max_bandwidth = 50MB/s # 帯域制限(必要な場合)
実装例:
#!/bin/bash # 大容量ファイル転送の最適化関数 optimize_large_file_transfer() { local file="$1" local bucket="$2" local file_size=$(stat -f%z "$file") # ファイルサイズに応じた最適なチャンクサイズを計算 local chunk_size=16 if [ $file_size -gt 1073741824 ]; then # 1GB超 chunk_size=64 fi aws s3 cp "$file" "s3://$bucket/" \ --multipart-threshold 64MB \ --multipart-chunksize ${chunk_size}MB \ --expected-size $file_size }
2. 並列処理の活用
複数のファイルを効率的にアップロードするための並列処理実装:
#!/bin/bash # 並列アップロード処理 parallel_upload() { local source_dir="$1" local bucket="$2" local max_procs=10 # findの結果をプロセス置換でxargsに渡す find "$source_dir" -type f -print0 | \ xargs -0 -P $max_procs -I {} \ bash -c 'aws s3 cp "{}" "s3://'"$bucket"'/${1#'"$source_dir"'/}"' _ } # 使用例 parallel_upload "/local/path" "my-bucket"
3. 転送速度モニタリングスクリプト
#!/bin/bash # 転送速度モニタリング monitor_transfer_speed() { local start_time=$(date +%s) local start_size=$(aws s3 ls s3://$1 --recursive | awk '{sum+=$3} END{print sum}') while true; do sleep 10 local current_time=$(date +%s) local current_size=$(aws s3 ls s3://$1 --recursive | awk '{sum+=$3} END{print sum}') local elapsed=$((current_time - start_time)) local transferred=$((current_size - start_size)) local speed=$((transferred / elapsed)) echo "転送速度: $((speed/1024/1024)) MB/s" done }
ストレージクラスの選択とコスト削減のポイント
1. ライフサイクルルールの設定
コスト効率の良いストレージ管理のための設定例:
# ライフサイクルルールの作成 aws s3api put-bucket-lifecycle-configuration \ --bucket my-bucket \ --lifecycle-configuration '{ "Rules": [ { "ID": "MoveToIA", "Status": "Enabled", "Filter": { "Prefix": "data/" }, "Transitions": [ { "Days": 30, "StorageClass": "STANDARD_IA" }, { "Days": 90, "StorageClass": "GLACIER" } ] } ] }'
2. インテリジェント階層化の実装
アクセスパターンに基づくストレージクラスの自動選択:
#!/bin/bash # アクセス頻度に基づくストレージクラス最適化 optimize_storage_class() { local bucket="$1" local prefix="$2" # アクセスログの分析 aws s3api get-bucket-logging --bucket "$bucket" # アクセス頻度の低いオブジェクトを特定 aws s3api list-objects-v2 --bucket "$bucket" --prefix "$prefix" \ --query 'Contents[?LastModified<=`2024-01-28`].[Key]' --output text | \ while read -r key; do # IA層への移行 aws s3api copy-object \ --bucket "$bucket" \ --copy-source "$bucket/$key" \ --key "$key" \ --storage-class STANDARD_IA done }
3. コスト分析とレポート生成
#!/bin/bash # S3使用量とコストの分析 analyze_s3_costs() { local bucket="$1" echo "=== S3 コスト分析レポート ===" # バケットサイズの取得 echo "総容量:" aws s3 ls s3://$bucket --recursive --human-readable --summarize | tail -n 2 # ストレージクラス別の分布 echo -e "\nストレージクラス別分布:" aws s3api list-objects-v2 --bucket $bucket \ --query 'Contents[].StorageClass' \ --output text | sort | uniq -c # 最近のアップロード echo -e "\n最近のアップロード(過去7日間):" aws s3api list-objects-v2 --bucket $bucket \ --query "Contents[?LastModified>='2024-01-21'].{Key:Key,Size:Size}" \ --output table }
コスト最適化のベストプラクティス
- 適切なストレージクラスの選択
- 頻繁にアクセスするデータ → STANDARD
- アクセス頻度が低いデータ → STANDARD_IA
- アーカイブデータ → GLACIER
- ライフサイクル管理の自動化
- 古いデータの自動アーカイブ
- 不要なデータの自動削除
- バージョニングとの組み合わせ
- 転送コストの最適化
- リージョン間転送の最小化
- CloudFrontの活用
- バッチ処理の活用
これらの最適化手法を適切に組み合わせることで、パフォーマンスを維持しながらコストを効率的に管理することができます。