Skip to content

課題2: 商品カタログ写真の自動アーカイブ - EC運営のストレージ最適化

難易度: 🟢 初級


分類情報

項目内容
難易度初級
カテゴリストレージ管理 / イベント駆動
処理タイプ非同期 / バッチ
使用IaCCloudFormation
想定所要時間3〜4時間

学習するAWSサービス

この演習では以下のAWSサービスを実践的に学習します。

メインサービス

サービス役割学習ポイント
Amazon S3商品画像の保存・管理バケット作成、ライフサイクルポリシー、イベント通知
AWS Lambda画像アップロード時の処理S3トリガー、イベント処理
S3 Lifecycle自動アーカイブ・削除ストレージクラス移行、有効期限設定

補助サービス

サービス役割
Amazon SNSアーカイブ完了通知
Amazon CloudWatchログ・メトリクス監視
AWS IAMサービス間の権限管理

最終構成図

コンポーネント役割
EC AdminEC運営担当者(商品画像をアップロード)
S3 STANDARD商品画像の保存(標準ストレージ)
S3 Glacier90日経過後の自動アーカイブ先
Lambda画像アップロード時の処理(メタデータ記録等)
SNSアーカイブ完了通知
Emailメール通知の受信先

データフロー

1. [担当者] 商品画像をS3にアップロード
2. [S3] アップロードイベントをLambdaに通知
3. [Lambda] 画像のメタデータを記録、サムネイル生成(オプション)
4. [S3 Lifecycle] 90日経過した販売終了商品の画像を自動でGlacierへ移行
5. [S3 Lifecycle] 365日経過した画像を自動削除

シナリオ

企業プロフィール

〇〇株式会社は、アパレル・雑貨を扱うECサイトを運営しています。商品数が増え続ける中、商品画像のストレージコストが課題になってきました。

項目内容
業種EC / 小売
従業員数20名
商品数5,000点(うち販売終了1,500点)
月間画像アップロード500枚
現在のストレージ使用量200GB

現状の課題

商品画像は一度アップロードしたら放置。販売終了した商品の画像も高コストのストレージに残り続け、毎月のS3料金が増加しています。手動で古い画像を整理するのは現実的ではありません。

数値で示された問題

指標現状目標
S3ストレージコスト$50/月$20/月
不要画像の割合30%(60GB)5%以下
画像整理の工数月4時間0時間(自動化)

解決したいこと

  1. 販売終了商品の画像を自動でアーカイブしたい
  2. 一定期間経過した画像は自動削除したい
  3. ストレージコストを削減したい
  4. 画像アップロード時に処理を自動化したい

成功指標(KPI)

KPI現状目標
月額ストレージコスト$50$20
手動作業時間4時間/月0時間
アーカイブ適用率0%100%

達成目標

この演習で習得できるスキル:

技術的な学習ポイント

  1. S3ライフサイクルポリシーの設計と実装

    • ストレージクラスの理解(Standard, Glacier, Deep Archive)
    • 移行ルールの設定
    • 有効期限ルールの設定
    • プレフィックス・タグによるフィルタリング
  2. S3イベント通知とLambda連携

    • S3イベントトリガーの設定
    • Lambdaでのイベント処理
    • 非同期処理パターン
  3. ストレージコスト最適化

    • ストレージクラスの使い分け
    • コスト試算の方法
    • S3 Storage Lensの活用

実務で活かせる知識

  • データライフサイクル管理の設計
  • イベント駆動アーキテクチャの基礎
  • AWSのストレージコスト最適化

前提条件

必要な事前知識

  • S3の基本操作(アップロード、ダウンロード)
  • AWS CLIの基本
  • JSONの読み書き

準備するもの

  1. AWSアカウント

    • S3、Lambda、SNSの利用権限
  2. 開発環境

    • AWS CLI v2(設定済み)
    • Python 3.9以上(Lambda用)
  3. テスト用画像

    • 5〜10枚のサンプル画像(JPG/PNG)

必要なIAM権限

以下の権限が必要です(事前に確認してください):

- s3:*
- lambda:*
- sns:*
- iam:CreateRole, iam:AttachRolePolicy
- cloudformation:*

S3ストレージクラスの比較

ストレージクラス用途料金(GB/月)取り出し
S3 Standard頻繁にアクセス$0.025即時
S3 Standard-IA低頻度アクセス$0.0138即時
S3 Glacier Instant Retrievalアーカイブ(即時取得)$0.005即時
S3 Glacier Flexible Retrievalアーカイブ$0.0045数分〜数時間
S3 Glacier Deep Archive長期アーカイブ$0.00212〜48時間

トラブルシューティング課題

問題1: ライフサイクルポリシーが適用されない

症状:

90日以上経過したオブジェクトがGlacierに移行されない

ヒント:

  1. ライフサイクルルールのステータスを確認(Enabled/Disabled)
  2. フィルター条件(プレフィックス、タグ)を確認
  3. ルール適用は即時ではなく、最大24時間かかる場合がある
解決方法を見る
  1. ライフサイクルルールが Enabled になっているか確認:
bash
aws s3api get-bucket-lifecycle-configuration --bucket your-bucket-name
  1. フィルター条件が正しいか確認。プレフィックスやタグが意図通りか。

  2. 小さいオブジェクト(128KB未満)はGlacierへの移行対象外の場合あり。

問題2: LambdaがS3イベントを受信しない

症状:

S3に画像をアップロードしてもLambdaが起動しない
CloudWatch Logsにログが出力されない

ヒント:

  1. S3バケットのイベント通知設定を確認
  2. Lambdaのリソースベースポリシーを確認
  3. イベントタイプ(PutObject等)が正しいか確認
解決方法を見る

LambdaにS3からの呼び出し許可を追加:

bash
aws lambda add-permission \
  --function-name your-function-name \
  --principal s3.amazonaws.com \
  --statement-id s3-trigger \
  --action lambda:InvokeFunction \
  --source-arn arn:aws:s3:::your-bucket-name \
  --source-account your-account-id

問題3: Glacierから取り出せない

症状:

アーカイブされた画像をすぐに取得できない

ヒント:

  1. ストレージクラスを確認
  2. 復元リクエストが必要か確認
  3. Glacier Instant Retrieval なら即時取得可能
解決方法を見る

Glacier Flexible Retrieval からの復元:

bash
aws s3api restore-object \
  --bucket your-bucket-name \
  --key path/to/image.jpg \
  --restore-request '{"Days":7,"GlacierJobParameters":{"Tier":"Standard"}}'

復元完了後(数時間後)にダウンロード可能。


設計の考察ポイント

1. ストレージクラスの選択

考えてみよう:

  • 「販売終了後も稀に問い合わせで画像が必要」な場合、どのストレージクラスが適切?
  • Glacier Instant Retrieval と Glacier Flexible Retrieval の使い分けは?

代替案:

  • Glacier Instant Retrieval: 取り出し頻度が低いが、必要時は即座にアクセスしたい場合
  • Glacier Flexible Retrieval: 取り出しに数時間かかっても問題ない場合(より安価)

2. ライフサイクルルールの設計

考えてみよう:

  • 「販売中」「販売終了」をどうやって判別する?
  • プレフィックス(フォルダ構造)で分ける?タグで分ける?

発展課題

1. サムネイル自動生成

  • アップロード時にLambdaでサムネイル画像を自動生成
  • 別バケットまたは別プレフィックスに保存

2. 画像のメタデータ管理

  • DynamoDBで画像のメタデータ(商品ID、アップロード日、ステータス)を管理
  • 販売終了フラグをトリガーにアーカイブ

3. S3 Storage Lens でコスト分析

  • Storage Lensダッシュボードを作成
  • ストレージ使用量とコストの可視化

想定コストと削減方法

月額概算コスト(200GB保存、最適化後)

サービス内訳月額コスト
S3 Standard80GB(販売中商品)$2.00
S3 Glacier Instant Retrieval100GB(販売終了)$0.50
Lambda500リクエスト/月無料枠内
SNS100通知/月無料枠内
合計約$2.50(約375円)

最適化前後の比較

最適化前最適化後削減率
月額コスト$50$2.5095%削減

コスト削減のポイント

  1. ライフサイクルポリシーの活用

    • アクセス頻度に応じたストレージクラスの自動移行
    • 不要データの自動削除
  2. Intelligent-Tieringの検討

    • アクセスパターンが予測できない場合に有効
    • 自動でストレージクラスを最適化

クリーンアップチェックリスト

演習終了後、以下のリソースを削除してください:

bash
# S3バケットの中身を削除してからバケット削除
aws s3 rm s3://your-bucket-name --recursive
aws s3 rb s3://your-bucket-name

# CloudFormationスタックを削除(使用した場合)
aws cloudformation delete-stack --stack-name product-catalog-archive
  • S3バケット(中身を先に削除)
  • Lambda関数
  • SNSトピック
  • CloudWatchロググループ
  • IAMロール・ポリシー

学習のポイント

1. S3ライフサイクル管理

データの「温度」(アクセス頻度)に応じてストレージクラスを移行することで、大幅なコスト削減が可能。設定は一度行えば自動で適用されます。

2. イベント駆動アーキテクチャ

S3にファイルがアップロードされたら自動でLambdaが起動する仕組みは、多くのユースケースで活用できます。

3. ストレージコストの可視化

S3のコストは見えにくいが、Storage Lensなどを使って可視化することで、最適化ポイントが見えてきます。


次のステップ

この演習を終えたら、以下の演習に挑戦してみましょう: