

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon SQS に基づくスケーリングポリシー
<a name="as-using-sqs-queue"></a>

**重要**  
以下の情報とステップは、CloudWatch にカスタムメトリクスとして公開する前に `ApproximateNumberOfMessages` キュー属性を使用してインスタンスごとの Amazon SQS キューバックログを計算する方法を示しています。ただし、Metric Math を使用することで、独自のメトリクスを公開するコストと労力を節約できるようになりました。詳細については、「[Metric Math を使用してターゲット追跡スケーリングポリシーを作成する](ec2-auto-scaling-target-tracking-metric-math.md)」を参照してください。

Amazon Simple Queue Service (Amazon SQS) キュー内のシステムロードの変化に応じて Auto Scaling グループをスケールすることができます。Amazon SQS の使用方法の詳細については、「[Amazon Simple Queue Service 開発者ガイド](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/)」をご参照ください。

Amazon SQS キューのアクティビティに応じたスケーリングを検討するシナリオはいくつかあります。例えば、ユーザーがイメージをアップロードしてオンラインで使用できるウェブアプリがあるとします。このシナリオでは、各イメージはサイズ変更されエンコードされてから公開されます。このアプリケーションは、標準的なアップロード速度を処理するように設定された Auto Scaling グループ内の EC2 インスタンスで実行されます。異常なインスタンスは終了され置き換えられて、常に現在のインスタンスレベルが維持されます。このアプリは処理のためイメージの raw ビットマップデータを SQS キューに配置します。イメージが処理され、処理されたイメージはユーザーから確認できる場所に発行されます。このシナリオのアーキテクチャは、イメージのアップロード数が時間の経過とともに変化しない場合に有効です。ただし、アップロード数が時間の経過とともに変化する場合は、動的スケーリングを使用して Auto Scaling グループのキャパシティーを拡張することを検討してください。

**Topics**
+ [適切なメトリクスを用いたターゲット追跡を使用する](#scale-sqs-queue-custom-metric)
+ [制限事項](#scale-sqs-queue-limitations)
+ [Amazon SQS に基づくスケーリングを設定](scale-sqs-queue-cli.md)
+ [Amazon SQS とインスタンスのスケールイン保護](#scale-sqs-queue-scale-in-protection)

## 適切なメトリクスを用いたターゲット追跡を使用する
<a name="scale-sqs-queue-custom-metric"></a>

カスタム Amazon SQS キューメトリクスに基づくターゲット追跡スケーリングポリシーを使用する場合、動的スケーリングはアプリケーションの需要曲線に合わせてより効果的に調整できます。ターゲット追跡のメトリクスの選択の詳細については、「[メトリクスを選択する](as-scaling-target-tracking.md#target-tracking-choose-metrics)」を参照してください。

ターゲット追跡に `ApproximateNumberOfMessagesVisible` のような CloudWatch Amazon SQS メトリクスを使用する場合の問題は、キュー内のメッセージの数が、キューからのメッセージを処理する Auto Scaling グループのサイズに比例して変化しない可能性があることです。これは SQS キューにあるメッセージの数のみでは、必要なインスタンスの数は定義されないためです。Auto Scaling グループ内のインスタンスの数は複数の要因によって決まります。例えば、メッセージを処理するためにかかる時間や、許容されるレイテンシー (キュー遅延) の量などです。

解決策は、*インスタンスあたりのバックログ*のメトリクスを使用して、ターゲット値を維持する*インスタンスあたりの適正バックログ*にすることです。これらの数は以下のように計算できます。
+ **インスタンスあたりのバックログ**: インスタンスあたりのバックログを計算するには、まず `ApproximateNumberOfMessages` キュー属性を使用して SQS キューの長さ (このキューから取得できるメッセージ数) を決定します。その数をフリートの実行キャパシティーで割ります。Auto Scaling グループの場合、これは `InService` 状態にあるインスタンスの数です。これでインスタンスあたりのバックログを得ることができます。
+ **インスタンスあたりの適正バックログ**: ターゲット値を計算するには、まずレイテンシーの点でアプリケーションが受け付けることができる数を決定します。次に、適切なレイテンシー値を取ってそれを EC2 インスタンスがメッセージを処理する平均所要時間で割ります。

例として、現在、10 個のインスタンスを持つ Auto Scaling グループがあり、キュー (`ApproximateNumberOfMessages`) にある可視メッセージの数が 1,500 であるとします。メッセージあたりの平均処理時間が 0.1 秒で、最長許容レイテンシーが 10 秒の場合、インスタンスあたりの許容バックログは 10/0.1、つまり 100 メッセージとなります。つまり、100 がターゲット追跡ポリシーのターゲット値です。インスタンスあたりのバックログがターゲット値に達すると、スケールアウトイベントが発生します。インスタンスあたりのバックログが既に 150 メッセージ (1,500 メッセージ/10 インスタンス) あるため、グループは、ターゲット値との比例を維持するために 5 インスタンス分スケールアウトします。

次の手順は、カスタムメトリクスを公開し、これらの計算に基づいてスケーリングするように Auto Scaling グループを設定するターゲット追跡スケーリングポリシーを作成する方法を示しています。

**重要**  
コストを削減するには、必ず代わりに Metric Math を使用してください。詳細については、「[Metric Math を使用してターゲット追跡スケーリングポリシーを作成する](ec2-auto-scaling-target-tracking-metric-math.md)」を参照してください。

この設定は 3 つの主要な部分で構成されます。
+ SQS キューからのメッセージを処理するために EC2 インスタンスを管理する Auto Scaling グループ。
+ Amazon CloudWatch に送信するカスタムメトリクス。Auto Scaling グループの EC2 インスタンスごとにキュー内のメッセージの数を測定します。
+ ターゲット追跡ポリシー。カスタムメトリクスと一連のターゲット値に基づいて Auto Scaling グループをスケールするように設定します。CloudWatch アラームでスケーリングポリシーを呼び出します。

次の図は、この設定のアーキテクチャを示しています。

![\[キューを使用する Amazon EC2 Auto Scaling アーキテクチャ図\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/sqs-as-custom-metric-diagram.png)


## 制限事項
<a name="scale-sqs-queue-limitations"></a>

カスタムメトリクスを CloudWatch に発行するには、 AWS CLI または SDK を使用する必要があります。その後、 を使用してメトリクスをモニタリングできます AWS マネジメントコンソール。

以下のセクションでは、実行する必要があるタスク AWS CLI に を使用します。例えば、キューの現在の使用状況を反映するメトリックスデータを取得するには、SQS [get-queue-attributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/get-queue-attributes.html) コマンドを使用します。

## Amazon SQS とインスタンスのスケールイン保護
<a name="scale-sqs-queue-scale-in-protection"></a>

インスタンスの削除時に処理されていなかったメッセージは、SQS キューに戻され、まだ実行中である別のインスタンスで処理されます。長時間実行されるタスクが実行されるアプリケーションでは、オプションでインスタンススケールイン保護を使用して、Auto Scaling グループのスケールイン時に終了するキューワーカーを制御できます。

次の擬似コードは、長時間実行されるキュー駆動のワーカープロセスをスケールイン終了から保護する方法の 1 つを示しています。

```
while (true)
{
  SetInstanceProtection(False);
  Work = GetNextWorkUnit();
  SetInstanceProtection(True);
  ProcessWorkUnit(Work);
  SetInstanceProtection(False);
}
```

詳細については、「[インスタンスの終了を的確に処理するようにアプリケーションを設計する](gracefully-handle-instance-termination.md)」を参照してください。