AWS S3完全ガイド:基礎から実践まで

AWS S3の基本から実践的な使い方まで、セキュリティ設定やコスト最適化のベストプラクティスを解説します。

技術ブログ

はじめに

AWS S3(Simple Storage Service)は、AWSが提供するオブジェクトストレージ サービスです。高い耐久性、可用性、スケーラビリティを備え、様々なユースケースに 対応できます。

主な用途

  • 静的ウェブサイトのホスティング
  • バックアップと復元
  • データアーカイブ
  • アプリケーションのアセット管理
  • データレイク構築
  • コンテンツ配信

セットアップ

Amazon S3を使用するための準備手順を説明します:

1. AWS CLIのインストール

# Windows (PowerShell)
msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi

# macOS
brew install awscli

# Linux
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

2. 認証情報の設定

# AWS CLIの設定
aws configure

# 以下の情報を入力
AWS Access Key ID: [アクセスキー]
AWS Secret Access Key: [シークレットキー]
Default region name: ap-northeast-1
Default output format: json

セキュリティのベストプラクティス

  • IAMユーザーを作成し、必要最小限の権限を付与
  • アクセスキーは定期的にローテーション
  • 本番環境では環境変数で認証情報を管理
  • Git等でのキーの共有は厳禁

基本的な操作

バケットの作成と管理

# バケットの作成
aws s3 mb s3://my-bucket-name

# バケットの一覧表示
aws s3 ls

# バケット内のオブジェクト一覧
aws s3 ls s3://my-bucket-name

ファイルの操作

# ファイルのアップロード
aws s3 cp local-file.txt s3://my-bucket-name/

# ディレクトリの同期
aws s3 sync local-directory s3://my-bucket-name/

# ファイルのダウンロード
aws s3 cp s3://my-bucket-name/file.txt ./

# ファイルの削除
aws s3 rm s3://my-bucket-name/file.txt

Node.jsでのS3操作

import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";

const s3Client = new S3Client({
  region: "ap-northeast-1",
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  },
});

// ファイルのアップロード
async function uploadFile(bucketName, key, body) {
  try {
    const command = new PutObjectCommand({
      Bucket: bucketName,
      Key: key,
      Body: body,
    });
    const response = await s3Client.send(command);
    console.log("Success", response);
  } catch (err) {
    console.error("Error", err);
  }
}

セキュリティ設定

1. バケットポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadForGetBucketObjects",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}

2. CORS設定

[
  {
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
    "AllowedOrigins": ["https://example.com"],
    "ExposeHeaders": ["ETag"],
    "MaxAgeSeconds": 3000
  }
]

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

  • パブリックアクセスのブロック設定
  • バケットの暗号化設定
  • バージョニングの有効化
  • アクセスログの有効化
  • IAMポリシシーの最小権限原則

静的ウェブサイトホスティング

1. 静的ウェブサイトの設定

バケットで静的ウェブサイトホスティングを有効化する手順:

  1. バケットのプロパティを開く
  2. 「Static website hosting」を有効化
  3. インデックスドキュメントを設定
  4. エラードキュメントを設定(オプション)

2. 必要なバケットポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}

静的ウェブサイトのベストプラクティス

  • CloudFrontを使用したコンテンツ配信
  • HTTPSの有効化
  • キャッシュ設定の最適化
  • エラーページのカスタマイズ

CloudFrontとの連携

1. CloudFrontディストリビューションの作成

  1. Origin Domainの設定(S3バケットを選択)
  2. Origin Access Identity (OAI)の作成
  3. ビヘイビアの設定
  4. SSL証明書の設定

2. S3バケットポリシーの更新

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CloudFrontAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXX"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}

CloudFrontの利点

  • グローバルなコンテンツ配信
  • レイテンシーの削減
  • コストの最適化
  • DDoS保護
  • HTTPSサポート

ライフサイクル管理

1. ライフサイクルルールの設定

オブジェクトの自動移行や削除を設定できます:

  • Standard → Standard-IA
  • Standard-IA → Glacier
  • Glacier → Deep Archive
  • 期限切れオブジェクトの削除

2. ライフサイクルルールの例

{
  "Rules": [
    {
      "ID": "MoveToGlacier",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "logs/"
      },
      "Transitions": [
        {
          "Days": 90,
          "StorageClass": "GLACIER"
        }
      ],
      "Expiration": {
        "Days": 365
      }
    }
  ]
}

コスト最適化

ストレージクラスの選択

  • Standard: 頻繁にアクセスするデータ
  • Standard-IA: アクセス頻度が低いデータ
  • One Zone-IA: 再作成可能なデータ
  • Glacier: アーカイブデータ

コスト削減のヒント

  • 適切なストレージクラスの使用
  • ライフサイクルルールの活用
  • 不要なオブジェクトの削除
  • バージョニングの適切な管理
  • CloudFrontの活用

ベストプラクティス

命名規則

  • 一貫性のある命名パターン
  • 検索しやすいプレフィックス
  • 特殊文字の回避
  • 意味のある階層構造

パフォーマンス最適化

  • マルチパートアップロードの活用
  • 適切なオブジェクトサイズ
  • 転送アクセラレーションの使用
  • リージョンの適切な選択

セキュリティ対策

  • 暗号化の有効化
  • アクセス制御の適切な設定
  • バージョニングの活用
  • 定期的なセキュリティ監査

トラブルシューティング

一般的なトラブルシューティング

  • アクセス権限の問題
  • ネットワークの問題
  • セキュリティの問題
  • コストの問題

トラブルシューティングのヒント

  • ログの確認
  • エラーメッセージの確認
  • コマンドの実行権限の確認
  • IAMポリシシーの確認
  • CloudFrontの確認