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の活用
- バッチ処理の活用
これらの最適化手法を適切に組み合わせることで、パフォーマンスを維持しながらコストを効率的に管理することができます。