AWSパフォーマンス設計:コンピュート、ストレージ、データベースの選択

Shunku

パフォーマンス効率は、AWS Well-Architected Frameworkの柱の1つです。ワークロードの要件に応じて適切なリソースを選択し、継続的に最適化することが重要です。

パフォーマンス設計の原則

flowchart TB
    subgraph Principles["設計原則"]
        P1["先進技術の民主化"]
        P2["数分でグローバル展開"]
        P3["サーバーレスの活用"]
        P4["より頻繁な実験"]
        P5["機械的共感"]
    end

    style Principles fill:#3b82f6,color:#fff

コンピュート選択

選択フローチャート

flowchart TD
    Start["ワークロードの特性は?"]
    Q1{"サーバーレスで<br/>対応可能?"}
    Q2{"コンテナ化<br/>されている?"}
    Q3{"特定のOS/<br/>カスタマイズ必要?"}

    Start --> Q1
    Q1 -->|Yes| Lambda["Lambda/Fargate"]
    Q1 -->|No| Q2
    Q2 -->|Yes| Container["ECS/EKS"]
    Q2 -->|No| Q3
    Q3 -->|Yes| EC2["EC2"]
    Q3 -->|No| Container

    style Lambda fill:#f59e0b,color:#000
    style Container fill:#8b5cf6,color:#fff
    style EC2 fill:#3b82f6,color:#fff

EC2インスタンスファミリー

ファミリー 用途 ユースケース
M 汎用 Webサーバー、アプリサーバー
C コンピュート最適化 バッチ処理、HPC
R メモリ最適化 インメモリDB、キャッシュ
I/D ストレージ最適化 データウェアハウス、分散FS
G/P GPU 機械学習、グラフィックス
T バースト 開発、小規模ワークロード

インスタンス選択のポイント

flowchart TB
    subgraph Selection["選択基準"]
        CPU["vCPU要件"]
        Memory["メモリ要件"]
        Network["ネットワーク要件"]
        Storage["ストレージ要件"]
    end

    CPU --> |"計算集約"| C["Cファミリー"]
    Memory --> |"メモリ集約"| R["Rファミリー"]
    Network --> |"高帯域"| NetworkOpt["拡張ネットワーキング"]
    Storage --> |"高IOPS"| StorageOpt["Nitro/NVMe"]

    style Selection fill:#22c55e,color:#fff

ストレージ選択

ストレージタイプ比較

flowchart TB
    subgraph Storage["ストレージオプション"]
        S3["S3<br/>オブジェクト"]
        EBS["EBS<br/>ブロック"]
        EFS["EFS<br/>ファイル"]
        FSx["FSx<br/>高性能ファイル"]
        Instance["インスタンスストア<br/>一時ストレージ"]
    end

    style Storage fill:#3b82f6,color:#fff

EBSボリュームタイプ

タイプ IOPS スループット 用途
gp3 最大16,000 最大1,000MB/s 汎用
io2 最大256,000 最大4,000MB/s 高IOPS
st1 - 最大500MB/s スループット重視
sc1 - 最大250MB/s コールドデータ

ストレージ選択フロー

flowchart TD
    Q1{"アクセスパターンは?"}
    Q2{"高IOPSが必要?"}
    Q3{"共有アクセス?"}

    Q1 -->|ランダム| Q2
    Q1 -->|シーケンシャル| ST1["st1/sc1"]
    Q1 -->|オブジェクト| S3["S3"]

    Q2 -->|Yes| IO2["io2 Block Express"]
    Q2 -->|No| GP3["gp3"]

    Q3 -->|Yes| EFS["EFS/FSx"]
    Q3 -->|No| EBS["EBS"]

    style IO2 fill:#ef4444,color:#fff
    style GP3 fill:#22c55e,color:#fff

データベース選択

データベースタイプ

flowchart TB
    subgraph Databases["データベースオプション"]
        subgraph Relational["リレーショナル"]
            RDS["RDS"]
            Aurora["Aurora"]
        end

        subgraph NoSQL["NoSQL"]
            DynamoDB["DynamoDB"]
            DocumentDB["DocumentDB"]
            ElastiCache["ElastiCache"]
        end

        subgraph Analytics["分析"]
            Redshift["Redshift"]
            Neptune["Neptune"]
            Timestream["Timestream"]
        end
    end

    style Relational fill:#3b82f6,color:#fff
    style NoSQL fill:#22c55e,color:#fff
    style Analytics fill:#8b5cf6,color:#fff

選択基準

要件 推奨DB
ACID、複雑なクエリ Aurora/RDS
高スケーラビリティ、Key-Value DynamoDB
ドキュメント、MongoDB互換 DocumentDB
キャッシュ、セッション ElastiCache
分析、OLAP Redshift
グラフデータ Neptune
時系列データ Timestream

リードレプリカの活用

flowchart TB
    subgraph ReadScale["読み取りスケーリング"]
        Master["マスター<br/>(書き込み)"]
        Replica1["レプリカ1<br/>(読み取り)"]
        Replica2["レプリカ2<br/>(読み取り)"]
    end

    App["アプリケーション"]
    App --> |"書き込み"| Master
    App --> |"読み取り"| Replica1
    App --> |"読み取り"| Replica2

    style Master fill:#3b82f6,color:#fff
    style Replica1 fill:#22c55e,color:#fff
    style Replica2 fill:#22c55e,color:#fff

キャッシング戦略

キャッシュレイヤー

flowchart LR
    subgraph Caching["キャッシュレイヤー"]
        Client["クライアント<br/>キャッシュ"]
        CDN["CloudFront<br/>エッジキャッシュ"]
        App["ElastiCache<br/>アプリキャッシュ"]
        DB["DAX<br/>DBキャッシュ"]
    end

    User["ユーザー"] --> Client
    Client --> CDN
    CDN --> App
    App --> DB

    style Caching fill:#f59e0b,color:#000

キャッシュパターン

パターン 説明 用途
Lazy Loading 読み取り時にキャッシュ 汎用
Write Through 書き込み時にキャッシュ更新 一貫性重視
TTL 有効期限でキャッシュ削除 汎用
Cache Aside アプリがキャッシュ管理 柔軟性

ElastiCacheの選択

機能 Redis Memcached
データ構造 豊富 シンプル
レプリケーション
クラスター
永続化
Pub/Sub

グローバル配信

CloudFront

flowchart TB
    subgraph Global["グローバル配信"]
        Users["世界中のユーザー"]
        Edge["エッジロケーション"]
        Origin["オリジン"]
    end

    Users --> |"最寄りエッジ"| Edge
    Edge --> |"キャッシュミス"| Origin

    style Edge fill:#f59e0b,color:#000

Lambda@Edge

場所 用途
Viewer Request 認証、URL書き換え
Origin Request オリジン選択
Origin Response ヘッダー追加
Viewer Response 最終レスポンス加工

モニタリングと最適化

パフォーマンスメトリクス

flowchart TB
    subgraph Monitoring["Monitoring"]
        CW["CloudWatch"]
        XRay["X-Ray"]
        Insights["Container Insights"]
    end

    CW --> |"メトリクス"| Analysis["分析"]
    XRay --> |"トレース"| Bottleneck["ボトルネック特定"]
    Insights --> |"Containers"| Container["コンテナ分析"]

    style Monitoring fill:#3b82f6,color:#fff

主要メトリクス

レイヤー メトリクス
コンピュート CPU使用率、メモリ使用率
ストレージ IOPS、スループット、レイテンシー
データベース 接続数、クエリ時間、キャッシュヒット率
ネットワーク 帯域幅、レイテンシー

ベストプラクティス

設計チェックリスト

flowchart TB
    subgraph Checklist["チェックリスト"]
        C1["適切なインスタンスタイプ選択"]
        C2["ストレージ要件の明確化"]
        C3["キャッシュ戦略の実装"]
        C4["グローバル配信の検討"]
        C5["継続的なモニタリング"]
    end

    style Checklist fill:#22c55e,color:#fff

アンチパターン

アンチパターン 推奨
オーバープロビジョニング 適正サイズ化
単一インスタンス依存 分散アーキテクチャ
キャッシュなし 適切なキャッシュレイヤー
モニタリング不足 継続的な監視と最適化

まとめ

flowchart TB
    subgraph Performance["パフォーマンス設計"]
        Compute["コンピュート選択"]
        Storage["ストレージ選択"]
        Database["データベース選択"]
        Caching["キャッシング"]
        Global["グローバル配信"]
    end

    Compute --> Right["適正サイズ"]
    Storage --> IOPS["要件に合ったタイプ"]
    Database --> Scale["スケーラブルな選択"]
    Caching --> Latency["低レイテンシー"]
    Global --> Edge["エッジ配信"]

    style Performance fill:#3b82f6,color:#fff
カテゴリ ポイント
コンピュート ワークロードに適したファミリー
ストレージ アクセスパターンに合ったタイプ
データベース データモデルに適したエンジン
キャッシング 複数レイヤーでのキャッシュ
グローバル エッジロケーションの活用

適切なリソース選択と継続的な最適化により、コスト効率の高いパフォーマンスを実現できます。

参考資料