EC2 フリートの作成 - Amazon Elastic Compute Cloud

EC2 フリートの作成

EC2 フリートを作成するには、JSON ファイルにフリート設定を定義し、create-fleet AWS CLI コマンドでそのファイルを参照します。JSON ファイルでは、フリートの合計ターゲットキャパシティ、スポットインスタンスとオンデマンドインスタンスの個別のターゲットキャパシティ、および起動テンプレートを指定する必要があります。起動テンプレートにはフリート内のインスタンスの設定、例えば AMI、インスタンスタイプ、サブネットやアベイラビリティーゾーン、1 つ以上のセキュリティグループなどを定義します。必要に応じて、さらに別の設定を指定できます。例えば、起動テンプレート設定をオーバーライドするためのパラメータ、EC2 キャパシティプールからスポットインスタンスとオンデマンドインスタンスを選択するための配分戦略、フリートに対する最大支出金額などです。詳細については、「EC2 フリートまたはスポットフリートの設定オプション」を参照してください。

EC2 フリートは、キャパシティが使用可能であるときはオンデマンドインスタンスを起動し、最大料金がスポット料金を超えていてキャパシティが使用可能であるときはスポットインスタンスを起動します。

フリートにスポットインスタンスが含まれ、タイプが maintain である場合、Amazon EC2 はスポットインスタンスが中断したときにフリートのターゲットキャパシティを維持しようとします。

EC2 フリート の制限事項

以下の制限が EC2 フリート に適用されます。

  • EC2 フリートは、Amazon EC2 APIAWS CLIAWS SDK、および AWS CloudFormation からのみ作成できます。

  • EC2 フリート リクエストは、AWS リージョンにまたがることはできません。リージョンごとに別個の 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 ロールを作成するには
  1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションペインで Roles (ロール) を選択します。

  3. [Create role] を選択します。

  4. [信頼されたエンティティを選択] ページで、以下の操作を実行します。

    1. [信頼できるエンティティタイプ] で、[AWS サービス] を選択します。

    2. [ユースケース][サービスまたはユースケース] で、[EC2 - フリート] を選択します。

      ヒント

      必ず [EC2 - フリート] を選択してください。[EC2] を選択した場合、[EC2 - フリート] ユースケースは [ユースケース] リストに表示されません。[EC2 - フリート] ユースケースでは、必要な IAM アクセス許可を持つポリシーが自動的に作成され、ロール名として AWSServiceRoleForEC2Fleet が提案されます。

    3. [Next] を選択します。

  5. [アクセス許可を追加] ページで [次へ] を選択します。

  6. [名前、確認、および作成] ページで、[ロールの作成] をクリックします。

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 フリートのポリシーを作成するには
  1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションペインで、ポリシー を選択します。

  3. [Create policy] (ポリシーの作成) を選択します。

  4. [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

  5. [Review policy] (ポリシーの確認) ページでポリシー名と説明を入力し、[Create policy] (ポリシーの作成) を選択します。

  6. アクセス権限を付与するには、ユーザー、グループ、またはロールにアクセス許可を追加します。

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 インスタンスのステータスチェック」を参照してください。

フリートを設定して、異常のある スポットインスタンス を置き換えることができます。ReplaceUnhealthyInstancestrue に設定した後、unhealthy として報告されたときにスポットインスタンスが置き換えられます。異常のあるスポットインスタンスを置き換えている間、最大数分間、フリートがターゲット容量を下回る場合があります。

要件
  • ヘルスチェックによる置き換えは、タイプ request または instant のフリートではなく、ターゲットキャパシティを維持している EC2 フリート (タイプ maintain のフリート) でのみサポートされます。

  • ヘルスチェックによる置き換えは、スポットインスタンス でのみサポートされます。この機能は オンデマンドインスタンス ではサポートされていません。

  • 作成時のみ異常なインスタンスを置き換えるよう EC2 フリート を設定できます。

  • ユーザーは、ec2:DescribeInstanceStatus アクションを呼び出す許可を持っている場合のみ、ヘルスチェックの置き換えを使用できます。

異常のある スポットインスタンス を置き換えるように EC2 フリート を設定するには
  1. EC2 フリートの作成」で EC2 フリートを作成するための情報を使用します。

  2. 異常のあるスポットインスタンスを置き換えるようにフリートを設定するには、JSON ファイルの ReplaceUnhealthyInstancestrue を指定します。

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": "" }