こんばんは、小寺です。
EC2 Auto Scalling及びEC2 Fleetを利用するときに、属性ベースのインスタンス タイプを選択すればインスタンスのオンデマンド価格の割合を定義できるようになりました。
https://aws.amazon.com/about-aws/whats-new/2024/01/amazon-ec2-price-protection-attribute-instance-selection/

属性ベースのインスタンスタイプとは?

属性ベースのインスタンスタイプってお聞きになったことありますか。
EC2インスタンスの属性は以下のように定義されています。

インスタンスタイプは、インスタンスファミリー、世代、属性とサイズの組み合わせで一意に表現されます。
上記の例でいくと「a」が属性ということいなりますね。

スポットインスタンスのベストプラクティス

Black Beltで紹介されているスポットインスタンスを活用する際のベストプラクティスです。

  1. 多様なインスタンスタイプを混ぜるあらかじめ複数のインスタンスタイプを指定しておく(m6i.large が⾜りない場合でも、r6i.large やc6i.large を起動できるためサービス影響を最⼩化)
  2. 複数のアベイラビリティゾーンを使う複数のアベイラビリティゾーンを定義し、起動可能なスポットプールを増やす
  3. スポットインスタンスの中断に備える
    中断の予兆があれば、2分より早く「リバランス通知」を送付する
  4. Auto Scalingグループやフリート機能を使う
    AutoScaling グループ(ASG)がEC2インスタンスの台数を自動的に維持して、中断に備える
  5. price-capacity-optimized 配分戦略を使う
    起動するスポットインスタンスを起動のしやすさとスポット価格の組み合わせをもとに価格が安いものを優先的に起動
  6. キャパシティリバランシングを使う
    オートスケーリンググループやフリートで発生するスポットインスタンスの中断に対し、事前にスポットインスタンスを追加してキャパシティを維持する

アップデートのメリット

最新世代のインスタンス タイプがリリースされると自動的に使うことができます。インスタンス タイプ全体でより多くのEC2 キャパシティが使える点がメリットです。
さらに、Auto Scaling グループの料金保護機能を使えば、AutoScalingグループのインスタンス タイプを選択するときに、属性ベースのインスタンス タイプに沿った価格制限を定義できます。
スポットインスタンスの価格は動的に変化していくため、本アップデートにより、スポット インスタンスの料金保護機能のメリットを活かしよりコスト削減を実現できるようになります。

*料金保護とは
料金保護は、Auto Scaling グループのインスタンスタイプ間で、極端に料金に差が発生することを防ぎます。
価格保護を使用すると、Auto Scaling グループによって起動される EC2 インスタンスに対して支払ってもよい最大価格を指定できます。価格保護は、たとえ指定した属性に一致したとしても、高すぎると思われるインスタンス タイプを Auto Scaling グループが使用できないようにする機能です。
価格保護はデフォルトで有効になっており、オンデマンド インスタンスとスポット インスタンスに個別の価格しきい値が設定されています。
新しい Auto Scaling グループを作成するか、属性ベースのインスタンスタイプを選択して既存の Auto Scaling グループを更新すると、料金保護がデフォルトで有効になります。
ベースラインは、指定した属性を持つ最も低コストの現行世代 M、C、R インスタンスタイプの料金によって決定されます。M、C、または R のいずれのインスタンスタイプにも属性が一致しない場合、最低料金のインスタンスタイプが使用されます。

しきい値を指定しない場合、次のデフォルトの料金保護のしきい値が適用されます。
・オンデマンドインスタンス– 20%
・スポットインスタンス– 100 %

確認してみる

(1) Auto Scallingグループを作成します。

(2) Auto Scaling グループ名 を入力し、既に作成済みの起動テンプレートを選びます。

(3) 「インスタンス起動オプションを選択する 」画面の「配分戦略」で「料金キャパシティ最適化」を選びます。

(4) 次の詳細オプションを設定はスキップして作成に進み、完了です。

CLIで設定例を記載します。

必要な容量の値を vCPU の数またはメモリ量として設定するには、ファイルで “DesiredCapacityType”: “vcpu” または “DesiredCapacityType”: “memory-mib” を指定します。

{
"AutoScalingGroupName": "my-asg",
"DesiredCapacityType": "units",
"MixedInstancesPolicy": {
"LaunchTemplate": {
"LaunchTemplateSpecification": {
"LaunchTemplateName": "my-launch-template",
"Version": "$Default"
},
"Overrides": [{
"InstanceRequirements": {
"VCpuCount": {"Min": 4, "Max": 8},
"MemoryMiB": {"Min": 16384},
"CpuManufacturers": ["intel"]
}
}]
},
"InstancesDistribution": {
"OnDemandPercentageAboveBaseCapacity": 50,
"SpotAllocationStrategy": "price-capacity-optimized"
}
},
"MinSize": 0,
"MaxSize": 100,
"DesiredCapacity": 4,
"DesiredCapacityType": "units",
"VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782"
}