はじめに
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. 静的ウェブサイトの設定
バケットで静的ウェブサイトホスティングを有効化する手順:
- バケットのプロパティを開く
- 「Static website hosting」を有効化
- インデックスドキュメントを設定
- エラードキュメントを設定(オプション)
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ディストリビューションの作成
- Origin Domainの設定(S3バケットを選択)
- Origin Access Identity (OAI)の作成
- ビヘイビアの設定
- 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の確認