

# REL07-BP03 ワークロードにより多くのリソースが必要であることを検出した時点でリソースを取得する
<a name="rel_adapt_to_changes_proactive_adapt_auto"></a>

 クラウドコンピューティングの最も重要な機能の 1 つは、リソースを動的にプロビジョニングできることです。

 従来のオンプレミスコンピューティング環境では、ピーク需要に対応するために十分なキャパシティを事前に特定してプロビジョニングする必要があります。これは、高価であることと、ワークロードのピーク時のキャパシティのニーズを過小評価している場合、可用性にリスクが生じるという点で問題です。

 クラウドでは、このようなことを行う必要はありません。代わりに、必要に応じてコンピューティング、データベース、その他のリソースキャパシティをプロビジョニングして、現在および予測される需要を満たすことができます。Amazon EC2 Auto Scaling や Application Auto Scaling などの自動化されたソリューションは、指定したメトリクスに基づいてリソースをオンラインにすることができます。これにより、スケーリングプロセスが簡単で予測可能になり、常に十分なリソースを確保することによって、ワークロードの信頼性が大幅に向上します。

 **期待される成果**: コンピューティングやその他のリソースの自動スケーリングを需要を満たすように設定します。追加のリソースをオンラインにする間、トラフィックのバーストに対応できるように、スケーリングポリシーでは十分なヘッドルームを確保してください。

 **一般的なアンチパターン:** 
+  一定数のスケーラブルなリソースをプロビジョニングする。
+  実際の需要と相関しないスケーリングメトリクスを選択する。
+  需要のバーストに対応するためのスケーリングプランに十分なヘッドルームを確保できていない。
+  スケーリングポリシーがキャパシティを追加するタイミングが遅すぎるため、追加のリソースをオンラインにする際のキャパシティの枯渇やサービスの低下を招いている。
+  最小リソース数と最大リソース数を正しく設定できないため、スケーリングに失敗する。

 **このベストプラクティスを活用するメリット**: 現在の需要を満たすのに十分なリソースを確保することは、ワークロードの高可用性を提供し、定義されたサービスレベル目標 (SLO) を遵守するために不可欠です。自動スケーリングを使用すると、現在および予測されている需要に対応するためにワークロードに必要な適切な量のコンピューティング、データベース、その他のリソースを提供できます。ピーク時のキャパシティのニーズを判断し、それに対応するためにリソースを静的に割り当てる必要はありません。代わりに、需要が増加すると、それに対応するためにより多くのリソースを割り当てることができ、需要が落ちた後は、リソースを非アクティブ化してコストを削減できます。

 **このベストプラクティスを活用しない場合のリスクレベル:** 中 

## 実装のガイダンス
<a name="implementation-guidance"></a>

 まず、ワークロードコンポーネントが自動スケーリングに適しているかどうかを判断します。これらのコンポーネントは、同じリソースを提供し、同じように動作するため、*水平スケーラブル*と呼ばれます。水平スケーラブルなコンポーネントの例としては、同様に構成された EC2 インスタンス、[Amazon Elastic Container Service (ECS)](https://aws.amazon.com/ecs/) タスク、[Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/) で実行されているポッドなどがあります。これらのコンピューティングリソースは通常、ロードバランサーの背後に配置されており、*レプリカ*と呼ばれます。

 その他のレプリケートされたリソースには、データベースのリードレプリカ、[Amazon DynamoDB](https://aws.amazon.com/dynamodb/) テーブル、[Amazon ElastiCache](https://aws.amazon.com/elasticache/) (Redis OSS) クラスターなどがあります。サポートされているリソースの完全なリストについては、「[AWS services that you can use with Application Auto Scaling](https://docs.aws.amazon.com/autoscaling/application/userguide/integrated-services-list.html)」を参照してください。

 コンテナベースのアーキテクチャでは、2 つの異なる方法でスケールする必要がある場合があります。まず、水平スケーラブルなサービスを提供するコンテナをスケールする必要があるかもしれません。次に、コンピューティングリソースをスケールして、新しいコンテナ用のスペースを確保する必要があります。レイヤーごとに異なる自動スケーリングメカニズムがあります。ECS タスクをスケールするには、[Application Auto Scaling](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-auto-scaling.html) を使用できます。Kubernetes ポッドをスケールするには、[Horizontal Pod Autoscaler (HPA)](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) または [Kubernetes Event-driven Autoscaling (KEDA)](https://keda.sh/) を使用できます。コンピューティングリソースをスケールするには、ECS の場合は[キャパシティプロバイダー](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/asg-capacity-providers.html)が使用でき、Kubernetes の場合は [Karpenter](https://karpenter.sh) または [Cluster Autoscaler](https://kubernetes.io/docs/concepts/cluster-administration/cluster-autoscaling/) を使用できます。

 次に、自動スケーリングの実行方法を選択します。メトリクスベースのスケーリング、スケジュールされたスケーリング、予測スケーリングの 3 つの主要なオプションがあります。

 **メトリクスベースのスケーリング** 

 メトリクスベースのスケーリングは、1 つ以上の*スケーリングメトリクス*の値に基づいてリソースをプロビジョニングします。スケーリングメトリクスとは、ワークロードの需要に対応するメトリクスです。適切なスケーリングメトリクスを決定する良い方法は、非本番環境で負荷テストを実行することです。負荷テスト中は、スケーラブルなリソースの数を一定に保ったまま、需要 (スループット、同時実行数、シミュレート対象ユーザー数など) を徐々に増やします。次に、需要の増加に応じて増加 (または減少) するメトリクスを探し、逆に需要の減少に応じて減少 (または増加) するメトリクスを探します。一般的なスケーリングメトリクスには、CPU 使用率、ワークキューの深さ ([Amazon SQS](https://aws.amazon.com/sqs/) キューなど)、アクティブユーザー数、ネットワークスループットが含まれます。

**注記**  
 AWS は、ほとんどのアプリケーションで、アプリケーションがウォームアップするにつれてメモリ使用率が増加し、その後、安定した値に達することを観察しました。需要が減少すると、通常、メモリ使用率は並行して減少するのではなく、上昇したままになります。メモリ使用率は、需要に応じて増減するという両方向の需要に対応していないため、このメトリクスを自動スケーリング用に選択する前に慎重に検討してください。

 メトリクスベースのスケーリングは、*潜在的なオペレーション*です。使用率メトリクスが自動スケーリングメカニズムに伝達されるまでに数分かかることがあります。これらのメカニズムは通常、応答する前に、需要の増加を示す明確なシグナルを待ちます。その後、自動スケーラーが新しいリソースを作成すると、フルサービスになるまでさらに時間がかかる場合があります。このため、スケーリングメトリクスのターゲットをフル稼働 (例えば、CPU 使用率 90%) に近づけすぎないようにすることが重要です。そうすることにより、追加のキャパシティがオンラインになる前に、既存のリソースキャパシティが枯渇するリスクがあります。一般的なリソース使用率のターゲットは、需要パターンと追加のリソースのプロビジョニングに必要な時間に応じて、最適な可用性を得るために 50～70% の範囲になります。

 **スケジュールに基づくスケーリング** 

 スケジュールされたスケーリングは、カレンダーまたは時間帯に基づいてリソースをプロビジョニングまたは削除します。これは、平日の営業時間中のピーク使用率やセールスイベントなど、需要が予測可能なワークロードに頻繁に使用されます。[Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-scheduled-scaling.html) と [Application Auto Scaling](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-scheduled-scaling.html) はどちらも、スケジュールされたスケーリングをサポートしています。KEDA の [cron スケーラー](https://keda.sh/docs/latest/scalers/cron/)は、Kubernetes ポッドのスケジュールされたスケーリングをサポートしています。

 **予測スケーリング** 

 予測スケーリングでは、機械学習を使用して、予想される需要に基づいてリソースを自動的にスケールします。予測スケーリングは、指定した使用率メトリクスの履歴値を分析して、その将来の値を継続的に予測します。次に、予測値を使用してリソースをスケールアップまたはスケールダウンします。[Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-predictive-scaling.html) は、予測スケーリングを実行できます。

### 実装手順
<a name="implementation-steps"></a>

1.  ワークロードコンポーネントが自動スケーリングに適しているかどうかを判断します。

1.  メトリクスベースのスケーリング、スケジュールされたスケーリング、予測スケーリングの中から、どのようなスケーリングメカニズムがワークロードに最適かを判断します。

1.  コンポーネントに適した自動スケーリングメカニズムを選択します。Amazon EC2 インスタンスの場合は、Amazon EC2 Auto Scaling を使用します。その他の AWS のサービスについては、Application Auto Scaling を使用します。Kubernetes ポッド (Amazon EKS クラスターで実行されているものなど) の場合は、Horizontal Pod Autoscaler (HPA) または Kubernetes Event-driven Autoscaling (KEDA) を検討してください。Kubernetes または EKS ノードの場合は、Karpenter と Cluster Auto Scaler (CAS) を検討してください。

1.  メトリクスのスケーリングまたはスケジュールされたスケーリングについては、負荷テストを実行して、ワークロードに適したスケーリングメトリクスとターゲット値を決定します。スケジュールされたスケーリングでは、選択した日時に必要なリソースの数を決定します。予想されるピークトラフィックに対応するために必要なリソースの最大数を決定します。

1.  上記で収集した情報に基づいて、自動スケーラーを設定します。詳細は、自動スケーリングサービスのドキュメントを参照してください。最大スケーリング制限と最小スケーリング制限が正しく設定されていることを確認します。

1.  スケーリング設定が期待どおりに機能していることを確認します。非本番環境で負荷テストを実行し、システムの反応を観察し、必要に応じて調整します。本番稼働で自動スケーリングを有効にする場合は、予期しない動作を通知する適切なアラームを設定します。

## リソース
<a name="resources"></a>

 **関連ドキュメント:** 
+  [Amazon EC2 Auto Scaling とは](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) 
+  [AWS Prescriptive Guidance: Load testing applications](https://docs.aws.amazon.com/prescriptive-guidance/latest/load-testing/) 
+  [AWS Marketplace: 自動スケーリングで使用できる製品](https://aws.amazon.com/marketplace/search/results?searchTerms=Auto+Scaling) 
+  [DynamoDB Auto Scaling によるスループットキャパシティの自動管理](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/AutoScaling.html) 
+  [新機能 – Machine Learning を中核とする EC2 の予測スケーリング](https://aws.amazon.com/blogs/aws/new-predictive-scaling-for-ec2-powered-by-machine-learning/) 
+  [Amazon EC2 Auto Scaling のスケジュールされたスケーリング](https://docs.aws.amazon.com/autoscaling/ec2/userguide/schedule_time.html) 
+  [Telling Stories About Little's Law](https://brooker.co.za/blog/2018/06/20/littles-law.html) 