【保存版】AWS CLI S3アップ完全ガイド2024 -基本から応用まで7つの実践テクニック

AWS CLI S3 アップロードの基礎知識

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

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

  1. 直接的なファイル操作
  • ローカルファイルのアップロード
  • S3バケットからのダウンロード
  • バケット間のファイルコピー
  • ファイルの削除や移動
  1. 自動化の実現
  • シェルスクリプトでの利用
  • バッチ処理の実装
  • 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 --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/

よく使用するオプション

  1. –recursive:ディレクトリ全体をコピー
aws s3 cp ./local-folder s3://my-bucket/remote-folder --recursive
  1. –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 "*"
  1. –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コマンドの特徴的なオプション

  1. –delete:転送先に存在するが転送元にないファイルを削除
aws s3 sync ./local-folder s3://my-bucket/remote-folder --delete
  1. –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".

解決方法:

  1. AWS認証情報の設定を確認
# 認証情報の設定
aws configure

# 現在の設定を確認
aws configure list
  1. 環境変数での設定
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

解決方法:

  1. 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"
            ]
        }
    ]
}
  1. バケットポリシーの確認
# バケットポリシーの確認
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/

解決手順:

  1. ネットワーク接続の確認
# エンドポイントへの接続確認
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"
  1. リージョン設定の確認
# リージョンの確認
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
}

コスト最適化のベストプラクティス

  1. 適切なストレージクラスの選択
  • 頻繁にアクセスするデータ → STANDARD
  • アクセス頻度が低いデータ → STANDARD_IA
  • アーカイブデータ → GLACIER
  1. ライフサイクル管理の自動化
  • 古いデータの自動アーカイブ
  • 不要なデータの自動削除
  • バージョニングとの組み合わせ
  1. 転送コストの最適化
  • リージョン間転送の最小化
  • CloudFrontの活用
  • バッチ処理の活用

これらの最適化手法を適切に組み合わせることで、パフォーマンスを維持しながらコストを効率的に管理することができます。