私は、オンデマンドインスタンスではなくスポットインスタンスを起動することで、自動スケーリングEC2グループのコストを最適化しようとしています。
私が本当に望んでいるのは、スポットインスタンスの価格設定市場に何が起こっても、グループ内の一部のサーバーをオンデマンドインスタンスとして維持できるようにすることです。次に、グループ内の追加のサーバーを、構成済みの最小値を超えてスポットインスタンスにしたいと思います。私は通常、スポットリクエストによるサーバーの追加の遅延で大丈夫です。
私はこれを行う方法を見つけることができないようで、AWSドキュメントを精査しようとしました。 ASGはオンデマンドまたはスポットのいずれかですが、ハイブリッドではないようです。
自動スケーリンググループに割り当てられたElastic Load Balancerにオンデマンドインスタンスを手動で追加することもできますが、そのサーバーの負荷は自動スケーリングの測定とトリガーに影響しません。
必要なサーバーを常に入手できるようにするために、途方もなく高い入札価格を入力することができたと思いますが、その後、価格設定の履歴を調べて、ときどき大きなスパイクを確認します。
AWSのドキュメントはそれ自体と矛盾しています。1か所で、サーバーの最小値を入力した場合、その数はそこにあることが「保証されている」とあるからです。ただし、スポットインスタンスについて読む場合、保証はありません。スポットの価格差は説得力があるので、常にオンのベースラインを維持しながら、できる限りそれを活用したいと思います。これは可能ですか?
現時点では オンデマンドインスタンスとスポットインスタンスを混在させることができます 単一のASG全体
Amazon EC2 Auto Scalingを使用すると、単一のAuto Scalingグループ(ASG)で購入オプション、アベイラビリティーゾーン(AZ)、インスタンスファミリー全体にインスタンスをプロビジョニングして自動的にスケーリングし、スケール、パフォーマンス、コストを最適化できます。 これで、単一のASGにオンデマンドとRIのあるスポットインスタンスを含めることができ、コンピューティングの最大90%を節約できます。
上記のアプローチは少し面倒で、それほど柔軟ではありません。より標準的なアプローチは、2つのASG(スポット用に1つ、オンデマンド用に1つ)を作成し、それらを同じELBに登録する両方ことです(説明 ここ )。これにより、LCスワップを1つのASGで交換するのではなく、それぞれを個別に制御することができます。
このhybridAuto Scaling アプローチは、残念ながら、そのままでは利用できないようです。
ただし、次のようにこの制限を回避できる場合があります(テストされていませんが、しばらくの間私が取り組んできたシステム設計だけです)。
Auto Scalingを使用したスポットインスタンスの起動 で概説されているように、スポット価格の入札は Launch Configuration のパラメーターとして使用されています。ご指摘のとおり、利用可能なhybrid起動構成はありません。オンデマンドまたはスポットのいずれかである必要があります。つまり、ユースケースには2つの異なる起動構成が必要です。
Auto Scalingグループに一度に1つの起動構成のみをアタッチできるため、次の(一部古い)制約があります(-を参照)。 起動設定 ):
新しいまたは更新された起動設定をAuto Scalingグループにアタッチすると、新しいインスタンスはすべて、新しい設定パラメーターを使用して起動されます。 既存のインスタンスは影響を受けません。 Auto Scalingがスケールダウンする必要がある場合、それは最初に古い起動設定を持つインスタンスを終了します。 [重点鉱山]
ただし、強調されている部分は重要です。前者は、それぞれの初期オンデマンド起動構成から追加のスポット起動構成に変更した後もオンデマンドインスタンスを実行し続ける必要があるという要件をカバーしており、最近導入された Auto Scaling Termination Policies により、後者は必ずしもそうではありません==(変更のために、付随するAWSブログ投稿による通常のファンファーレはありませんでした)、 Auto Scalingグループのインスタンス終了ポリシー に文書化されています:
Auto Scalingは、終了するインスタンスを選択する前に、最初に、グループで使用されている他のアベイラビリティーゾーンよりもインスタンスが多いアベイラビリティーゾーンを特定します。すべてのアベイラビリティーゾーンに同じ数のインスタンスがある場合、ランダムなアベイラビリティーゾーンを識別します。 識別されたアベイラビリティーゾーン内で、Auto Scalingは終了ポリシーを使用して終了するインスタンスを選択します。 [重点鉱山]
終了ポリシーの仕組み で概説されているように、必要に応じてNewestInstance、を指定できるようになりました終了する最後に起動されたインスタンス。これは、最近起動されたスポットインスタンスの1つになります。
Auto Scalingはインスタンスの起動時間を使用して、最後に起動されたインスタンスを識別します。
明らかにこれにはもう少しあるかもしれません。 いずれかのポリシーをスタンドアロンポリシーとして指定するか、複数のポリシーを順序付きリストにリストすることができますが、このアプローチでは、すべてのインスタンスの負荷が自動スケーリングの測定とトリガーに因数分解されます;ただし、注意点が1つ残っています。
ロードバランサーが他の理由(たとえば、それ自体が異常になったため)でオンデマンドインスタンスの1つを終了した場合、オンデマンドインスタンスによって自動的に置き換えられることはありません。したがって、このイベントを個別に監視して説明する必要があります。オンデマンドの起動構成を一時的に再度アクティブ化する。
幸運を!
オンデマンドインスタンスの数が静的なASGが1つだけ必要な場合は、以下が機能します。
スポットインスタンス起動設定に基づいてAuto Scalingグループを作成します。
ASGでのAuto Scalingの一時停止
オンデマンドインスタンス(静的基本負荷)をASGに手動で追加し、それらのインスタンスのインスタンス保護をオンにします。
ASGで自動スケーリングを再開する
デフォルトの自動スケーリングポリシーは、保護のためにオンデマンドインスタンスを無視し、オンデマンドインスタンスと同じ数のスポットインスタンスを終了して、グループの必要な数を実現します。スケールインまたはスケールアウトのアクティビティは、スポットインスタンスのみを起動または終了します。
私はここでの答えからインスピレーションを得て https://github.com/ashwanthkumar/matsya を考え出しました
次のことができます