AWS Well-Architected Frameworkについて詳しく見てみる【パフォーマンス】

# 前段
Well-Architected Framework自体はよく聞くワードですが、その分量の多さ（とAWSドキュメントあるあるの若干の読みにくさ）にしっかりと読む機会がなかなかなかったため、ここで改めて自分なりに落とし込もうと思いました。

　Well-Architected Frameworkを読んで、「直訳過ぎて、何を言っているかわからないなぁ」となった時に見ていただけるような記事を目指しています。

※解釈に誤りがある場合はご指摘ください。
※ドキュメント本文そのままではないため、個人の解釈が入っている部分があります。　

**関連記事**
> ・[AWS Well-Architected Frameworkについて詳しく見てみる【運用上の優秀性】
](https://qiita.com/bonjiko/items/ce4202384e7e04dcc323)
> ・[AWS Well-Architected Frameworkについて詳しく見てみる【持続可能性の柱】
](https://qiita.com/bonjiko/items/6bdec109cf00f85d4f61)

記事内でワークロードという言葉が頻繁に出てくるので、ここで解説を入れておきます。
> **ワークロードとは：**
ビジネス価値をもたらすリソースとコード (顧客向けアプリケーションやバックエンドプロセスなど) の集合のことです。
引用元：[ワークロード
](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/userguide/workloads.html)

# 設計原則
　・複雑なシステム構築はクラウドベンダーに任せ、社内のITチームは製品の開発に集中する。
　・グローバル展開を可能にする
　・サーバレスアーキテクチャを利用し、運用負担、リソースの利用と管理にかかるコストを下げる。
  ・自動化できるリソースを使用することで、比較テストをしやすくする。
 　　→AMIや起動テンプレートを使用して、異なるインスタンスによるパフォーマンス比較をしやすくすることを意図していると思われます。
　・目標に最適なテクノロジーアプローチを使用する。

# ① アーキテクチャの選択

## 【PERF01-BP01】 利用可能なクラウドサービスと機能について学び、理解する
　・スケーラビリティを活用すること
　・クラウドに移行する際にアプリケーションを最新化すること
　・データの特性に合わせてストレージを変えること
　・適切なインスタンスサイズを選定すること（安易にオンプレと同じスペックにしない）
　・マネージドサービスを活用し運用・管理負担を下げること
　　
  が推奨されています。そのためにAWSのサービスについて学びましょう、ということが記載されています。
 
## 【PERF01-BP02】 クラウドプロバイダーまたは適切なパートナーからのガイダンスを使用して、アーキテクチャパターンとベストプラクティスについて学ぶ
　提供される様々なドキュメントやパートナーからの支援を得て、適切なアーキテクチャ設計をしましょう、ということが記載されている。また、参考となるドキュメントやブログ、トレーニングなどの情報も記載。
## 【PERF01-BP03】 アーキテクチャに関する意思決定においてコストを考慮する
　コストを意識して設計することは大事ですが、一般では以下のようなアンチパターンがみられる。
　・一種類のインスタンスファミリに固執する
　・商用ライセンスソリューションとオープンソースソリューションのコストや機能を比較せず、単に商用製品を選ぶこと。
　・ストレージのライフサイクルを定義しない
　・AWSの新しいサービスや機能を確認しない
　・ブロックストレージ（EBS)のみを使用してしまう。要件によってはファイルストレージ（EFS等）やオブジェクトストレージ（S3）などが適する場合もある。

　コストを最適化するには、
　・まずコスト目標を設定し、主要なコスト要因（インスタンス、ストレージなど）を特定する。
　・AWSの料金計算ツールやコストエクスプローラーを活用し、価格モデル（オンデマンド、リザーブドインスタンス、Savings Plans、スポットインスタンス）を理解する。
　・Well-Architectedのコスト最適化ベストプラクティスを用いてコストを最適化し、継続的にコストを監視して最適化機会を見つける。
　・AWS予算でアラートを設定し、AWS Compute OptimizerやTrusted Advisorで推奨事項を取得、AWSコスト異常検出で異常を自動的に検出する。

## 【PERF01-BP04】 トレードオフが顧客とアーキテクチャの効率にどのように影響するかを評価する
　パフォーマンスの改善を行うときは、顧客への影響を加味する。
　例えばデータのキャッシュに関して、実装するとパフォーマンスが大幅に向上するが、システムの誤動作を防ぐ方法やデータの更新タイミングの実装が必要となる。
 
## 【PERF01-BP05】 ポリシーとリファレンスアーキテクチャを使用する
　リソースとアーキテクチャの選択に関する社内標準を用意することで、適切なクラウド サービスを選択する際の意思決定プロセスを合理化し、パフォーマンス効率の向上に役立つ。
 
## 【PERF01-BP06】 ベンチマークを使用してアーキテクチャに関する意思決定を行う
　既存のワークロードのパフォーマンスをベンチマークして、クラウド上でのパフォーマンスを理解し、そのデータに基づいてアーキテクチャ上の決定を下す。
　ベンチマークをとるための様々な情報も共有されている。
## 【PERF01-BP07】 データ駆動型のアプローチでアーキテクチャを選択する
　データをもとに合理的に改善の意思決定を行う。
# ② コンピューティングとハードウェア
## 【PERF02-BP01】 ワークロードに最適なコンピューティング オプションを選択する
　単純にオンプレと同じコンピューティングのオプションを使うのではなく、ワークロードの特性に適したものを選択する。
## 【PERF02-BP02】 利用可能なコンピューティング構成と機能を理解する
　インスタンスファミリの特徴やその他のコンピューティングオプション（サイズとか）を理解し、適したものを採用する。
 　オプションは以下
 ・インスタンスタイプ
 ・価格モデル
 ・自動スケーリング
 ・サイズ
 ・ハードウェアベースのコンピューティングアクセラレータ（GPU積みインスタンスなど）
 
## 【PERF02-BP03】 コンピューティング関連のメトリクスを収集する
　パフォーマンス関連のメトリックを収集することで、ビジネス要件に合わせて調整することができる。
## 【PERF02-BP04】 コンピューティング リソースの構成と適切なサイズ設定
　パフォーマンス要件に合わせ適切なサイズに設定し、リソースの過剰使用や不足を回避する。
　CostExplorerやCompute Optimizerからの推奨事項を参考にする。
　
## 【PERF02-BP05】 コンピューティングリソースを動的に拡張する
　ニーズに合わせて動的にスケールアップやダウンを行い、プロビジョニングによる容量の過剰/不足確保を回避する。
## 【PERF02-BP06】 最適化されたハードウェアベースのコンピューティングアクセラレータを使用する
　GPUの監視結果などに応じて、GPUなどのハードウェアベースのコンピューティングアクセラレータを採用しているインスタンスを使用する。
 
# ③ データ管理
## 【PERF03-BP01】 データアクセスとストレージの要件を最もよくサポートする専用のデータストアを使用する　
　データの特性を理解して、ワークロードに適した専用のデータ ストア (ストレージまたはデータベース) を選択する。
　・データ型（非構造化、半構造化、リレーショナル）
　・データ量と増加
　・データの耐久性: 永続的、一時的、一時的
　・ACID（原子性、一貫性、独立性、耐久性）要件
　・データ アクセス パターン (読み取り中心または書き込み中心)
　・レイテンシー
　・スループット
　・IOPS（1秒あたりの入出力操作数）
　・データ保持期間

## 【PERF03-BP02】 データストアの利用可能な構成オプションを評価する
　データストアの構成オプションは以下
　・読み取りのオフロード（読み取りレプリカやキャッシュなど）
　・書き込みのスケーリング（パーティション キーのシャーディングやキューの導入など）
　・データセットのライフサイクルを管理するためのポリシー
　・接続管理とプーリング	

## 【PERF03-BP03】 データストアのパフォーマンスメトリックを収集して記録する
データ ストアの関連するパフォーマンス メトリックを追跡して記録し、データ管理ソリューションのパフォーマンスを把握する。それにより、ワークロードの要件を満たしていることを確認する。



## 【PERF03-BP04】 データストアのクエリパフォーマンスを向上させる戦略を実装する
　データの形を最適化する。例として
 　・パーティション分割
　・ファイル形式
　・インデックス
  などがある。
## 【PERF03-BP05】 キャッシュを利用したデータアクセスパターンを実装する
頻繁にアクセスされるデータを高速に取得するために、データのキャッシュを活用するアクセス パターンを実装する。


# ④ ネットワークとコンテンツ配信
## 【PERF04-BP01】 ネットワークがパフォーマンスに与える影響を理解する
 以下のようなアンチパターンがあります。
 ・トラフィックはすべて既存のデータセンタ経由
 ・すべてのトラフィックをカスタムファイヤーウォール経由でルーティングする
 ・使用要件を理解せずにDirect Connect接続を実装する
 ・ワークロードの特性と暗号化のオーバヘッドを考慮していない
 ・クラウドのネットワークにオンプレの概念と戦略を当てはめる
 
## 【PERF04-BP02】 利用可能なネットワーク機能を評価する
　パフォーマンスを向上させる可能性のあるクラウドのネットワーク機能を評価します。たとえば、ファイヤーウォールの代わりにセキュリティグループを使用することや、複数リージョンでサービス展開など。
> **ネットワークパスとルート**: ネットワークアクセスアナライザーを使い、最適なパスやルートを特定する。
>
> **ネットワークプロトコル**: パフォーマンスを向上させるための適切なネットワークプロトコルを選択する。
>
> **ネットワークトポロジ**: VPCピアリングとAWS Transit Gatewayを使用して、複数アカウント間のネットワーク接続を効率化。トレードオフを評価して適切な方法を選ぶ。
>
> **ネットワークサービス**:
> 　AWSグローバルアクセラレーター: ネットワークトラフィックのパフォーマンスを向上。
> 　Amazon CloudFront: コンテンツ配信とレイテンシを改善。
> 　Amazon Route 53: 適切なルーティングオプションを使用して、グローバルなワークロードのパフォーマンスを最適化。
>
> **ストレージリソース**:
> 　Amazon S3 転送アクセラレーション: リモートロケーションからのデータ転送を高速化。
> 　Amazon S3 マルチリージョン アクセスポイント: 複数リージョンにわたるデータの要求や書き込みを効率化。
>
> **コンピューティングリソース**:
> 　Elastic Network Interface (ENA): EC2インスタンスのスループットを最適化。
> 　Elastic Fabric Adapter (EFA): 大規模なノード間通信を必要とするワークロードに対応。
> 　Amazon EBS 最適化インスタンス: I/Oパフォーマンスを向上。
## 【PERF04-BP03】 ワークロードに適した専用接続またはVPNを選択する
 オンプレミスとクラウドのリソースを接続するためにハイブリッド接続が必要な場合は、パフォーマンス要件を満たすために十分な帯域幅をプロビジョニングします。ハイブリッド ワークロードの帯域幅と待機時間の要件を見積もります。これらの数値によって、サイズ要件が決まります。(DirectConnectかVPNかの選択など）


## 【PERF04-BP04】 負荷分散を使用してトラフィックを複数のリソースに分散する
　複数のリソースまたはサービスにトラフィックを分散することで、ワークロードがクラウドが提供する弾力性を活用できるようになる。また、暗号化終了をオフロードするためのロード バランシング（ALB)を使用して、パフォーマンスと信頼性を向上させ、トラフィックを効率的に管理およびルーティングすることもできる。
## 【PERF04-BP05】 パフォーマンスを向上させるネットワーク プロトコルの選択
　ワークロードのパフォーマンスへの影響に基づいて、システムとネットワーク間の通信プロトコルを決定する。
　例えば、ファイル転送に伝送制御プロトコル (TCP) を使用している場合、レイテンシが大きくなると全体的なスループットが低下する可能性が高くなる。TCP, UDP, SRDのどれを使用するかの検討が必要です。
 　また、検討にあたっての情報が記載されている。

## 【PERF04-BP06】 ネットワーク要件に基づいてワークロードの場所を選択する
　
リソース配置（AZやリージョン、エッジロケーション）のオプションを評価して、ネットワーク遅延を削減し、スループットを向上させ、ページの読み込み時間とデータ転送時間を短縮することで最適なユーザー エクスペリエンスを提供する。CloudFrontやWavelength, AWSアウトポストやローカルゾーンなどのサービスがある。



## 【PERF04-BP07】 メトリックに基づいてネットワーク構成を最適化する
　収集および分析されたデータを使用して、ネットワーク構成の最適化について情報に基づいた意思決定を行う。


# ⑤ プロセスと文化
## 【PERF05-BP01】 ワークロードの健全性とパフォーマンスを測定するための主要業績評価指標 (KPI) を確立する
 KPI を使用すると、ビジネス チームとエンジニアリング チームは、目標と戦略の測定方法、およびこれらの要素を組み合わせてビジネス成果を生み出す方法について一致させることができます。たとえば、Web サイトのワークロードでは、全体的なパフォーマンスの指標としてページの読み込み時間を使用する場合がある。
## 【PERF05-BP02】 監視ソリューションを使用して、パフォーマンスが最も重要な領域を理解する
ワークロードのパフォーマンスを向上させることで効率や顧客体験にプラスの影響を与える領域を理解して特定する。 
特定する方法としては、
　・CloudWatch リアルユーザモニタリング: アプリケーションパフォーマンスメトリックの取得
　・AWS X-Ray: コンポーネント間のレイテンシを特定
　・RDS パフォーマンスインサイト：データベースのパフォーマンスメトリックの取得
　・RDS 拡張モニタリング：データベースOSのパフォーマンスメトリックの取得
　・DevOps Guru：異常な運用パターンを検出し、顧客に影響が及ぶ前に問題を特定
があります。
## 【PERF05-BP03】 ワークロードパフォーマンスを向上させるプロセスを定義する
新しいサービス、設計パターン、リソース タイプ、および構成が利用可能になったときにそれらを評価するプロセスを定義する。たとえば、新しいインスタンス オファリングに対して既存のパフォーマンス テストを実行し、ワークロードを改善する可能性を判断する。
## 【PERF05-BP04】 ワークロードの負荷テスト
ワークロードの負荷テストを実行して、本番環境の負荷を処理できるかどうかを確認し、パフォーマンスのボトルネックを特定する。


## 【PERF05-BP05】 自動化を使用してパフォーマンス関連の問題をプロアクティブに修復する
主要業績評価指標 (KPI) を監視および警告システムと組み合わせて使用​​し、パフォーマンス関連の問題に積極的に対処する。基本は自動応答の仕組みで構築する。（Systems Manager Automationなど）

## 【PERF05-BP06】 ワークロードとサービスを最新の状態に保つ
新しいクラウド サービスと機能に関する最新情報を入手して、効率的な機能を導入し、問題を排除し、ワークロードの全体的なパフォーマンス効率を向上させる。**ワークロードに関連する更新、新機能、およびサービスを評価するプロセスを定義**する。
　・CI/CD を構成し、クラウド アプリケーションに関連する AMI、コンテナ イメージ、その他の成果物を自動的に更新する。
　・AWS Systems Manager Patch Manager などのツールを使用して システム更新のプロセスを自動化


## 【PERF05-BP07】 定期的に指標を確認する
定期的なメンテナンスの一環として、またはイベントやインシデントへの対応として、収集されるメトリックを確認する。
これらのレビューを使用して、問題に対処するために不可欠なメトリックと、問題の特定や対処、または防止に役立つ追加のメトリックを特定する。