AWS S3入門 - クラウドストレージの基礎

初級 | 50分 で読める | 2024.12.20

公式ドキュメント

このチュートリアルで学ぶこと

  • S3の基本概念(バケット、オブジェクト、リージョン)
  • バケットの作成と管理
  • オブジェクトのアップロード・ダウンロード
  • アクセス制御(IAM、バケットポリシー)
  • 静的ウェブサイトホスティング
  • AWS CLI/SDKでの操作

Amazon S3とは

Amazon S3(Simple Storage Service)は、AWSが提供するオブジェクトストレージサービスです。99.999999999%(イレブンナイン)の耐久性を持ち、画像・動画・バックアップなど、あらゆるデータを安全に保存できます。

S3の特徴

特徴説明
スケーラビリティ容量無制限で自動スケール
耐久性99.999999999%の高い耐久性
可用性99.99%の可用性(Standardクラス)
コスト効率使った分だけの従量課金
セキュリティ暗号化、アクセス制御が充実

前提条件

  • AWSアカウント
  • AWS CLIがインストールされていること

Step 1: AWS CLIのセットアップ

まず、AWS CLIをインストールして認証情報を設定します。

# AWS CLIインストール(macOS)
brew install awscli

# AWS CLIインストール(Linux)
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

# インストール確認
aws --version
# aws-cli/2.x.x Python/3.x.x ...

認証情報の設定を行います。IAMコンソールでアクセスキーを発行してください。

# 認証情報の設定
aws configure
# AWS Access Key ID: YOUR_ACCESS_KEY
# AWS Secret Access Key: YOUR_SECRET_KEY
# Default region name: ap-northeast-1
# Default output format: json

# 設定確認
aws sts get-caller-identity
# {
#     "UserId": "AIDAXXXXXXXXXXXXXXXXX",
#     "Account": "123456789012",
#     "Arn": "arn:aws:iam::123456789012:user/your-user"
# }

Step 2: バケットの作成

S3のバケット名はグローバルで一意である必要があります。

# バケット作成(東京リージョン)
aws s3 mb s3://my-tutorial-bucket-2024 --region ap-northeast-1

# バケット一覧を確認
aws s3 ls
# 2024-12-20 10:00:00 my-tutorial-bucket-2024

バケット名の命名規則

  • 3〜63文字
  • 小文字、数字、ハイフンのみ使用可能
  • 先頭と末尾は英数字
  • 連続するハイフンは不可
  • IPアドレス形式は不可
# リージョンを指定してバケットの詳細を確認
aws s3api get-bucket-location --bucket my-tutorial-bucket-2024
# {
#     "LocationConstraint": "ap-northeast-1"
# }

Step 3: オブジェクト操作

アップロード

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

# 特定のパス(プレフィックス)にアップロード
aws s3 cp local-file.txt s3://my-tutorial-bucket-2024/documents/

# ディレクトリごとアップロード(再帰的)
aws s3 cp ./local-folder s3://my-tutorial-bucket-2024/folder/ --recursive

# アップロード確認
aws s3 ls s3://my-tutorial-bucket-2024/
# 2024-12-20 10:05:00       1234 local-file.txt

ダウンロード

# 単一ファイルのダウンロード
aws s3 cp s3://my-tutorial-bucket-2024/file.txt ./downloaded-file.txt

# ディレクトリごとダウンロード
aws s3 cp s3://my-tutorial-bucket-2024/folder/ ./local-folder/ --recursive

同期(sync)

syncコマンドは差分のみを転送するため、効率的です。

# ローカル → S3 の同期
aws s3 sync ./local-folder s3://my-tutorial-bucket-2024/folder/

# S3 → ローカル の同期
aws s3 sync s3://my-tutorial-bucket-2024/folder/ ./local-folder/

# 削除されたファイルも反映(--delete オプション)
aws s3 sync ./local-folder s3://my-tutorial-bucket-2024/folder/ --delete

# 特定のファイルを除外
aws s3 sync ./local-folder s3://my-tutorial-bucket-2024/folder/ \
  --exclude "*.log" \
  --exclude ".git/*"

削除

# 単一オブジェクトの削除
aws s3 rm s3://my-tutorial-bucket-2024/file.txt

# プレフィックス配下を全削除(再帰的)
aws s3 rm s3://my-tutorial-bucket-2024/folder/ --recursive

# バケット内を全削除
aws s3 rm s3://my-tutorial-bucket-2024 --recursive

# バケット自体を削除(空である必要あり)
aws s3 rb s3://my-tutorial-bucket-2024

# バケットを強制削除(中身も含めて削除)
aws s3 rb s3://my-tutorial-bucket-2024 --force

Step 4: アクセス制御

S3のアクセス制御には複数の方法があります。

バケットポリシー

バケットポリシーはJSON形式でアクセス権限を定義します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-bucket/public/*"
        }
    ]
}
# バケットポリシーを適用
aws s3api put-bucket-policy \
  --bucket my-tutorial-bucket-2024 \
  --policy file://bucket-policy.json

# バケットポリシーを確認
aws s3api get-bucket-policy --bucket my-tutorial-bucket-2024

# バケットポリシーを削除
aws s3api delete-bucket-policy --bucket my-tutorial-bucket-2024

パブリックアクセスのブロック

セキュリティのため、デフォルトではパブリックアクセスがブロックされています。

# パブリックアクセスブロックの設定を確認
aws s3api get-public-access-block --bucket my-tutorial-bucket-2024

# パブリックアクセスブロックを設定
aws s3api put-public-access-block \
  --bucket my-tutorial-bucket-2024 \
  --public-access-block-configuration \
  "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

署名付きURL(プリサインドURL)

一時的にオブジェクトへのアクセスを許可するURLを生成できます。

# 1時間有効な署名付きURLを生成(ダウンロード用)
aws s3 presign s3://my-tutorial-bucket-2024/private-file.txt --expires-in 3600

# 出力例:
# https://my-tutorial-bucket-2024.s3.amazonaws.com/private-file.txt?...

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

S3でHTMLなどの静的ファイルを公開できます。

# 静的ウェブサイトホスティングを有効化
aws s3 website s3://my-website-bucket \
  --index-document index.html \
  --error-document error.html

index.htmlの例

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>S3静的ホスティング</title>
</head>
<body>
  <h1>Hello from S3!</h1>
  <p>このページはAmazon S3でホストされています。</p>
</body>
</html>
# ファイルをアップロード
aws s3 cp index.html s3://my-website-bucket/
aws s3 cp error.html s3://my-website-bucket/

# Content-Typeを明示的に指定
aws s3 cp index.html s3://my-website-bucket/ --content-type "text/html"

公開用のバケットポリシーを設定します。

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

ウェブサイトのエンドポイント: http://my-website-bucket.s3-website-ap-northeast-1.amazonaws.com

Step 6: SDK(JavaScript)での操作

Node.jsからS3を操作する例です。

# AWS SDK v3のインストール
npm install @aws-sdk/client-s3
// s3-example.js
import {
  S3Client,
  PutObjectCommand,
  GetObjectCommand,
  ListObjectsV2Command
} from '@aws-sdk/client-s3';

// S3クライアントの初期化
const s3Client = new S3Client({ region: 'ap-northeast-1' });

// オブジェクトをアップロード
async function uploadFile(bucket, key, body) {
  const command = new PutObjectCommand({
    Bucket: bucket,
    Key: key,
    Body: body,
    ContentType: 'text/plain',
  });

  const response = await s3Client.send(command);
  console.log('Upload successful:', response);
  return response;
}

// オブジェクトを取得
async function getFile(bucket, key) {
  const command = new GetObjectCommand({
    Bucket: bucket,
    Key: key,
  });

  const response = await s3Client.send(command);
  // ストリームを文字列に変換
  const body = await response.Body.transformToString();
  return body;
}

// オブジェクト一覧を取得
async function listFiles(bucket, prefix = '') {
  const command = new ListObjectsV2Command({
    Bucket: bucket,
    Prefix: prefix,
  });

  const response = await s3Client.send(command);
  return response.Contents || [];
}

// 実行例
const bucket = 'my-tutorial-bucket-2024';

await uploadFile(bucket, 'test.txt', 'Hello, S3!');
const content = await getFile(bucket, 'test.txt');
console.log('Content:', content);

const files = await listFiles(bucket);
files.forEach(file => console.log(file.Key, file.Size));

ストレージクラス

用途に応じて適切なストレージクラスを選択できます。

クラス用途取り出し時間
Standard頻繁にアクセスするデータ即時
Intelligent-Tieringアクセスパターンが不明即時
Standard-IA低頻度アクセス即時
Glacier Instantアーカイブ(即時取得)即時
Glacier Flexibleアーカイブ分〜時間
Glacier Deep Archive長期アーカイブ12時間
# ストレージクラスを指定してアップロード
aws s3 cp file.txt s3://my-bucket/ --storage-class STANDARD_IA

まとめ

AWS S3は、スケーラブルで高耐久性のオブジェクトストレージです。主なポイント:

  • バケット: データを格納するコンテナ(グローバルで一意の名前)
  • オブジェクト: ファイルとメタデータの組み合わせ
  • アクセス制御: IAM、バケットポリシー、ACLで細かく設定
  • 静的ホスティング: 簡易的なWebサイト公開が可能
  • ストレージクラス: コストと取り出し時間のバランスを選択

参考リンク

← 一覧に戻る