このチュートリアルで学ぶこと
- 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サイト公開が可能
- ストレージクラス: コストと取り出し時間のバランスを選択