EC2 フリートの作成
EC2 フリートを作成するには、JSON ファイルにフリート設定を定義し、create-fleet AWS CLI コマンドでそのファイルを参照します。JSON ファイルでは、フリートの合計ターゲットキャパシティ、スポットインスタンスとオンデマンドインスタンスの個別のターゲットキャパシティ、および起動テンプレートを指定する必要があります。起動テンプレートにはフリート内のインスタンスの設定、例えば AMI、インスタンスタイプ、サブネットやアベイラビリティーゾーン、1 つ以上のセキュリティグループなどを定義します。必要に応じて、さらに別の設定を指定できます。例えば、起動テンプレート設定をオーバーライドするためのパラメータ、EC2 キャパシティプールからスポットインスタンスとオンデマンドインスタンスを選択するための配分戦略、フリートに対する最大支出金額などです。詳細については、「EC2 フリートまたはスポットフリートの設定オプション」を参照してください。
EC2 フリートは、キャパシティが使用可能であるときはオンデマンドインスタンスを起動し、最大料金がスポット料金を超えていてキャパシティが使用可能であるときはスポットインスタンスを起動します。
フリートにスポットインスタンスが含まれ、タイプが maintain
である場合、Amazon EC2 はスポットインスタンスが中断したときにフリートのターゲットキャパシティを維持しようとします。
EC2 フリート の制限事項
以下の制限が EC2 フリート に適用されます。
-
EC2 フリートは、Amazon EC2 API、AWS CLI、AWS SDK、および AWS CloudFormation からのみ作成できます。
-
EC2 フリート リクエストは、AWS リージョンにまたがることはできません。リージョンごとに別個の EC2 フリート を作成する必要があります。
-
EC2 フリート リクエストは、同じアベイラビリティーゾーンから複数の異なるサブネットにまたがることはできません。
EC2 フリートの前提条件
EC2 フリートを作成するには、以下の前提条件を設定する必要があります。
起動テンプレート
起動テンプレートには、インスタンスタイプやアベイラビリティーゾーンなど、起動するインスタンスに関する設定情報を指定します。起動テンプレートの詳細については、「Amazon EC2 起動テンプレートにインスタンス起動パラメータを保存する」を参照してください。
EC2 フリート用のサービスにリンクされたロール
AWSServiceRoleForEC2Fleet
ロールは、インスタンスのリクエスト、起動、終了、タグ付けを行う許可を EC2 フリートに付与します。Amazon EC2 は、このサービスにリンクされたロールを使用して、以下のアクションを完了します。
-
ec2:RunInstances
– インスタンスを起動します。 -
ec2:RequestSpotInstances
– スポットインスタンスをリクエストします。 -
ec2:TerminateInstances
– インスタンスを終了します。 -
ec2:DescribeImages
- インスタンスの Amazon マシンイメージ (AMI) を表示します。 -
ec2:DescribeInstanceStatus
- インスタンスのステータスを表示します。 -
ec2:DescribeSubnets
- インスタンスのサブネットを表示します。 -
ec2:CreateTags
– EC2 フリート、インスタンス、ボリュームにタグを追加します。
AWS CLI または API を使用して EC2 フリート を作成する前に、このロールが存在していることを確認します。
注記
instant
EC2 フリート に、このロールは必要ありません。
ロールを作成するには、IAM コンソールを次のように使用します。
EC2 フリート の AWSServiceRoleForEC2Fleet ロールを作成するには
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
ナビゲーションペインで Roles (ロール) を選択します。
-
[Create role] を選択します。
-
[信頼されたエンティティを選択] ページで、以下の操作を実行します。
-
[信頼できるエンティティタイプ] で、[AWS サービス] を選択します。
-
[ユースケース] の [サービスまたはユースケース] で、[EC2 - フリート] を選択します。
ヒント
必ず [EC2 - フリート] を選択してください。[EC2] を選択した場合、[EC2 - フリート] ユースケースは [ユースケース] リストに表示されません。[EC2 - フリート] ユースケースでは、必要な IAM アクセス許可を持つポリシーが自動的に作成され、ロール名として AWSServiceRoleForEC2Fleet が提案されます。
-
[Next] を選択します。
-
-
[アクセス許可を追加] ページで [次へ] を選択します。
-
[名前、確認、および作成] ページで、[ロールの作成] をクリックします。
EC2 フリート を使用する必要がなくなった場合は、AWSServiceRoleForEC2Fleet ロールを削除することをお勧めします。このロールがアカウントから削除された後で、別のフリートを作成した場合はロールを再度作成できます。
詳細については、「IAM ユーザーガイド」の「サービスにリンクされたロールの作成」を参照してください。
暗号化された AMI および EBS スナップショット用のカスタマーマネージド型キーへのアクセス権限の付与
暗号化された AMI または暗号化された Amazon EBS スナップショットを EC2 フリートで指定し、暗号化の AWS KMS キーを使用する場合は、カスタマーマネージド型キーを使用して、Amazon EC2 がユーザーの代わりにインスタンスを起動する許可を、AWSServiceRoleForEC2Fleet ロールに付与する必要があります。これを行うには、次の手順で示すように、カスタマーマネージド型キーに許可を追加する必要があります。
アクセス権限を設定するときは、付与がキーポリシーの代わりになります。詳細については、「AWS Key Management Service デベロッパーガイド」で「許可の使用」と「AWS KMS でのキーポリシーの使用」を参照してください。
AWSServiceRoleForEC2Fleet ロールにカスタマーマネージド型キーを使用する許可を付与するには
-
許可の作成 コマンドを使用して、カスタマーマネージド型キーに許可を付与し、オペレーションを実行する許可を追加するプリンシパル (AWSServiceRoleForEC2Fleet サービスにリンクされたロール) を指定します。カスタマーマネージド型キーは、
key-id
パラメーターとカスタマーマネージド型キーの ARN を指定されます。プリンシパルを指定するには、grantee-principal
パラメータと AWSServiceRoleForEC2Fleet サービスにリンクされたロールの ARN を使用します。aws kms create-grant \ --region
us-east-1
\ --key-id arn:aws:kms:us-east-1
:444455556666
:key/1234abcd-12ab-34cd-56ef-1234567890ab
\ --grantee-principal arn:aws:iam::111122223333
:role/AWSServiceRoleForEC2Fleet \ --operations "Decrypt" "Encrypt" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "CreateGrant" "DescribeKey" "ReEncryptFrom" "ReEncryptTo"
EC2 フリートユーザーのアクセス許可
ユーザーが EC2 フリートを作成または管理する場合、必ず必要な許可を付与してください。
EC2 フリートのポリシーを作成するには
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
ナビゲーションペインで、ポリシー を選択します。
-
[Create policy] (ポリシーの作成) を選択します。
-
[Create policy] (ポリシーの作成) ページで、JSON タブを選択し、テキストを以下に置き換えて [Review policy] (ポリシーの確認) を選択します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:ListRoles", "iam:PassRole", "iam:ListInstanceProfiles" ], "Resource":"arn:aws:iam::123456789012:role/DevTeam*" } ] }
ec2:*
は、ユーザーにすべての Amazon EC2 API アクションを呼び出す許可を付与します。特定の Amazon EC2 API アクションに制限するには、代わりにこれらのアクションを指定します。IAM ユーザーは、既存の IAM ロールを列挙する
iam:ListInstanceProfiles
アクション、EC2 フリートロールを指定するiam:PassRole
アクション、および既存のインスタンスプロファイルを列挙するiam:ListRoles
アクションを呼び出すには、許可が必要です。(オプション) ユーザーが IAM コンソールを使用してロールまたはインスタンスプロファイルを作成できるようにするには、次のアクションをポリシーに追加する必要もあります。
-
iam:AddRoleToInstanceProfile
-
iam:AttachRolePolicy
-
iam:CreateInstanceProfile
-
iam:CreateRole
-
iam:GetRole
-
iam:ListPolicies
-
-
[Review policy] (ポリシーの確認) ページでポリシー名と説明を入力し、[Create policy] (ポリシーの作成) を選択します。
-
アクセス権限を付与するには、ユーザー、グループ、またはロールにアクセス許可を追加します。
-
AWS IAM Identity Center のユーザーとグループ:
アクセス許可セットを作成します。「AWS IAM Identity Center ユーザーガイド」の「権限設定を作成する」の手順に従ってください。
-
IAM 内で、ID プロバイダーによって管理されているユーザー:
ID フェデレーションのロールを作成します。詳細については、「IAM ユーザーガイド」の「サードパーティー ID プロバイダー (フェデレーション) 用のロールの作成」を参照してください。
-
IAM ユーザー:
-
ユーザーが担当できるロールを作成します。手順については、「IAM ユーザーガイド」の「IAM ユーザー用ロールの作成」を参照してください。
-
(お奨めできない方法) ポリシーをユーザーに直接アタッチするか、ユーザーをユーザーグループに追加する。詳細については、「IAM ユーザーガイド」の「ユーザー (コンソール) へのアクセス権限の追加」を参照してください。
-
-
EC2 フリートの作成
EC2 フリートを使用して複数のインスタンスからなるフリートを起動する場合、必要な手順はフリートリクエストに以下のパラメータを指定することだけです。その他のパラメータには、デフォルト値が使用されます。
-
LaunchTemplateId
またはLaunchTemplateName
— 使用する起動テンプレートを指定します (インスタンスタイプやアベイラビリティーゾーンなど、起動するインスタンスのパラメータを指定します)。 -
TotalTargetCapacity
— フリートの合計ターゲット容量を指定します。 -
DefaultTargetCapacityType
— デフォルトの購入オプションをオンデマンドにするかスポットにするかを指定します。
起動テンプレートに指定されているパラメータをオーバーライドするには、1 つ以上のオーバーライドを指定します。各オーバーライドはインスタンスタイプ、アベイラビリティーゾーン、サブネット、最大料金によって異なり、オーバーライドごとに加重キャパシティを変えることができます。インスタンスタイプを指定する代わりに、インスタンスに必要な属性を指定でき、Amazon EC2 はそうした属性ですべてのインスタンスタイプを識別します。詳細については、EC2 フリートまたはスポットフリートのインスタンスタイプを選択するための属性を指定する をご参照ください。
EC2 フリートのタイプが instant
の場合、AMI ID ではなく Systems Manager パラメータを指定できます。Systems Manager パラメータは、オーバーライドまたは起動テンプレートに指定できます。詳細については、「AMI ID のかわりに Systems Manager パラメータを使用する」を参照してください。
JSON ファイルにフリートパラメータを指定できます。指定可能なすべてのパラメータについては、「EC2 フリートの設定オプションをすべて表示する」を参照してください。
フリート設定の例については、「EC2 フリートの CLI 設定の例」を参照してください。
EC2 フリートを作成するためのコンソールのサポートは現在ありません。
EC2 フリートを作成するには
-
create-fleet (AWS CLI) コマンドを使用して、フリートを作成し、フリート設定パラメータを記載した JSON ファイルを指定します。
aws ec2 create-fleet --cli-input-json file://
file_name.json
タイプ request
またはタイプ maintain
のフリートの出力例を次に示します。
{
"FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE"
}
ターゲット容量を起動したタイプ instant
のフリートの出力例を次に示します。
{
"FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE",
"Errors": [],
"Instances": [
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c5.large",
"AvailabilityZone": "us-east-1a"
}
},
"Lifecycle": "on-demand",
"InstanceIds": [
"i-1234567890abcdef0",
"i-9876543210abcdef9"
],
"InstanceType": "c5.large",
"Platform": null
},
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c4.large",
"AvailabilityZone": "us-east-1a"
}
},
"Lifecycle": "on-demand",
"InstanceIds": [
"i-5678901234abcdef0",
"i-5432109876abcdef9"
]
]
}
ターゲット容量の一部を起動し、起動されなかったインスタンスをエラーとするタイプ instant
のフリートの出力例を次に示します。
{
"FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE",
"Errors": [
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c4.xlarge",
"AvailabilityZone": "us-east-1a",
}
},
"Lifecycle": "on-demand",
"ErrorCode": "InsufficientInstanceCapacity",
"ErrorMessage": ""
},
],
"Instances": [
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c5.large",
"AvailabilityZone": "us-east-1a"
}
},
"Lifecycle": "on-demand",
"InstanceIds": [
"i-1234567890abcdef0",
"i-9876543210abcdef9"
]
]
}
インスタンスを起動しなかったタイプ instant
のフリートの出力例を次に示します。
{
"FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE",
"Errors": [
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c4.xlarge",
"AvailabilityZone": "us-east-1a",
}
},
"Lifecycle": "on-demand",
"ErrorCode": "InsufficientCapacity",
"ErrorMessage": ""
},
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c5.large",
"AvailabilityZone": "us-east-1a",
}
},
"Lifecycle": "on-demand",
"ErrorCode": "InsufficientCapacity",
"ErrorMessage": ""
},
],
"Instances": []
}
異常なスポットインスタンスを置き換える EC2 フリートを作成する
EC2 フリート は、2 分ごとにフリートのインスタンスのヘルスステータスをチェックします。インスタンスのヘルスステータスは healthy
または unhealthy
です。
EC2 フリート は Amazon EC2 によって提供されるステータスチェックを使用して、インスタンスのヘルスステータスを判断します。インスタンスステータスチェックまたはシステムステータスチェックのいずれかのステータスが 3 回の連続したヘルスステータスチェックで impaired
の場合、インスタンスは unhealthy
と判断されます。詳細については、「Amazon EC2 インスタンスのステータスチェック」を参照してください。
フリートを設定して、異常のある スポットインスタンス を置き換えることができます。ReplaceUnhealthyInstances
を true
に設定した後、unhealthy
として報告されたときにスポットインスタンスが置き換えられます。異常のあるスポットインスタンスを置き換えている間、最大数分間、フリートがターゲット容量を下回る場合があります。
要件
-
ヘルスチェックによる置き換えは、タイプ
request
またはinstant
のフリートではなく、ターゲットキャパシティを維持している EC2 フリート (タイプmaintain
のフリート) でのみサポートされます。 -
ヘルスチェックによる置き換えは、スポットインスタンス でのみサポートされます。この機能は オンデマンドインスタンス ではサポートされていません。
-
作成時のみ異常なインスタンスを置き換えるよう EC2 フリート を設定できます。
-
ユーザーは、
ec2:DescribeInstanceStatus
アクションを呼び出す許可を持っている場合のみ、ヘルスチェックの置き換えを使用できます。
異常のある スポットインスタンス を置き換えるように EC2 フリート を設定するには
-
「EC2 フリートの作成」で EC2 フリートを作成するための情報を使用します。
-
異常のあるスポットインスタンスを置き換えるようにフリートを設定するには、JSON ファイルの
ReplaceUnhealthyInstances
にtrue
を指定します。
EC2 フリートの設定オプションをすべて表示する
フリート設定パラメータの詳細なリストを見るには、JSON ファイルを次のように作成できます。各パラメータの説明については、AWS CLI コマンドリファレンスの「create-fleet」を参照してください。
使用可能なすべての EC2 フリートパラメータを含めて JSON ファイルを生成するには
create-fleet (AWS CLI) コマンドと --generate-cli-skeleton
パラメータを使用して、EC2 フリート JSON ファイルを生成し、出力のファイルへの保存を指示します。
aws ec2 create-fleet \ --generate-cli-skeleton input >
ec2createfleet.json
出力例
{
"DryRun": true,
"ClientToken": "",
"SpotOptions": {
"AllocationStrategy": "price-capacity-optimized",
"MaintenanceStrategies": {
"CapacityRebalance": {
"ReplacementStrategy": "launch"
}
},
"InstanceInterruptionBehavior": "hibernate",
"InstancePoolsToUseCount": 0,
"SingleInstanceType": true,
"SingleAvailabilityZone": true,
"MinTargetCapacity": 0,
"MaxTotalPrice": ""
},
"OnDemandOptions": {
"AllocationStrategy": "prioritized",
"CapacityReservationOptions": {
"UsageStrategy": "use-capacity-reservations-first"
},
"SingleInstanceType": true,
"SingleAvailabilityZone": true,
"MinTargetCapacity": 0,
"MaxTotalPrice": ""
},
"ExcessCapacityTerminationPolicy": "termination",
"LaunchTemplateConfigs": [
{
"LaunchTemplateSpecification": {
"LaunchTemplateId": "",
"LaunchTemplateName": "",
"Version": ""
},
"Overrides": [
{
"InstanceType": "r5.metal",
"MaxPrice": "",
"SubnetId": "",
"AvailabilityZone": "",
"WeightedCapacity": 0.0,
"Priority": 0.0,
"Placement": {
"AvailabilityZone": "",
"Affinity": "",
"GroupName": "",
"PartitionNumber": 0,
"HostId": "",
"Tenancy": "dedicated",
"SpreadDomain": "",
"HostResourceGroupArn": ""
},
"InstanceRequirements": {
"VCpuCount": {
"Min": 0,
"Max": 0
},
"MemoryMiB": {
"Min": 0,
"Max": 0
},
"CpuManufacturers": [
"amd"
],
"MemoryGiBPerVCpu": {
"Min": 0.0,
"Max": 0.0
},
"ExcludedInstanceTypes": [
""
],
"InstanceGenerations": [
"previous"
],
"SpotMaxPricePercentageOverLowestPrice": 0,
"OnDemandMaxPricePercentageOverLowestPrice": 0,
"BareMetal": "included",
"BurstablePerformance": "required",
"RequireHibernateSupport": true,
"NetworkInterfaceCount": {
"Min": 0,
"Max": 0
},
"LocalStorage": "excluded",
"LocalStorageTypes": [
"ssd"
],
"TotalLocalStorageGB": {
"Min": 0.0,
"Max": 0.0
},
"BaselineEbsBandwidthMbps": {
"Min": 0,
"Max": 0
},
"AcceleratorTypes": [
"inference"
],
"AcceleratorCount": {
"Min": 0,
"Max": 0
},
"AcceleratorManufacturers": [
"amd"
],
"AcceleratorNames": [
"a100"
],
"AcceleratorTotalMemoryMiB": {
"Min": 0,
"Max": 0
}
}
}
]
}
],
"TargetCapacitySpecification": {
"TotalTargetCapacity": 0,
"OnDemandTargetCapacity": 0,
"SpotTargetCapacity": 0,
"DefaultTargetCapacityType": "on-demand",
"TargetCapacityUnitType": "memory-mib"
},
"TerminateInstancesWithExpiration": true,
"Type": "instant",
"ValidFrom": "1970-01-01T00:00:00",
"ValidUntil": "1970-01-01T00:00:00",
"ReplaceUnhealthyInstances": true,
"TagSpecifications": [
{
"ResourceType": "fleet",
"Tags": [
{
"Key": "",
"Value": ""
}
]
}
],
"Context": ""
}