EC2 집합 생성 - Amazon Elastic Compute Cloud

EC2 집합 생성

EC2 플릿을 생성하려면 create-fleet AWS CLI 명령을 사용하여 JSON 파일에서 플릿 구성을 정의하고 파일을 참조합니다. JSON 파일에서 플릿의 총 목표 용량, 스팟 인스턴스 및 온디맨드 인스턴스에 대한 개별 목표 용량, AMI, 인스턴스 유형, 서브넷 또는 가용 영역, 하나 이상의 보안 그룹과 같은 구성을 정의하는 시작 템플릿을 지정해야 합니다. 시작 템플릿 구성을 재정의하는 파라미터, EC2 용량 풀에서 스팟 인스턴스 및 온디맨드 인스턴스를 선택하기 위한 할당 전략, 플릿에 대해 지불하려는 최대 금액 등의 추가 구성을 지정할 수도 있습니다. 자세한 내용은 EC2 플릿 또는 스팟 플릿에 대한 구성 옵션 단원을 참조하십시오.

EC2 플릿은 가용 용량이 있을 때 온디맨드 인스턴스를 시작하고, 최고 가격이 스팟 가격을 초과하고 가용 용량이 있을 때 스팟 인스턴스를 시작합니다.

플릿에 스팟 인스턴스가 포함되어 있고 유형이 maintain인 경우 Amazon EC2에서 스팟 인스턴스가 중단되어도 플릿 목표 용량을 유지하려고 합니다.

EC2 집합 제한 사항

EC2 집합에는 다음과 같은 제한이 적용됩니다.

  • EC2 플릿 생성은 Amazon EC2 API, AWS CLI, AWS SDK, AWS CloudFormation을 통해서만 사용 가능합니다.

  • EC2 플릿 요청을 AWS 리전으로 확장할 수 없습니다. 리전마다 따로 EC2 집합을 생성해야 합니다.

  • EC2 집합 요청으로 동일한 가용 영역의 서로 다른 서브넷을 확장할 수 없습니다.

EC2 집합 사전 조건

시작 템플릿

시작 템플릿은 인스턴스 유형과 가용 영역 등 시작할 인스턴스에 대한 구성 정보를 지정합니다. 시작 템플릿에 대한 자세한 내용은 Amazon EC2 시작 템플릿에 인스턴스 시작 파라미터 저장의 내용을 참조하세요.

EC2 집합의 서비스 연결 역할

AWSServiceRoleForEC2Fleet 역할은 EC2 플릿에 사용자 대신 인스턴스를 요청, 시작, 종료 및 태깅할 수 있는 권한을 부여합니다. Amazon EC2는 이 서비스 연결 역할을 사용하여 다음 작업을 완료합니다.

  • ec2:RunInstances – 인스턴스를 시작합니다.

  • ec2:RequestSpotInstances – 스팟 인스턴스 요청.

  • ec2:TerminateInstances – 인스턴스를 종료합니다.

  • ec2:DescribeImages - 인스턴스에 대한 Amazon Machine Image(AMI) 설명

  • ec2:DescribeInstanceStatus - 인스턴스 상태 설명

  • ec2:DescribeSubnets - 인스턴스의 서브넷 설명

  • ec2:CreateTags – EC2 집합, 인스턴스 및 볼륨에 태그를 추가합니다.

AWS CLI 또는 API를 사용하여 EC2 플릿을 생성하려면 먼저 이 역할이 있어야 합니다.

참고

instant EC2 집합에는 이 역할이 필요하지 않습니다.

역할을 생성하려면 다음과 같이 IAM 콘솔을 사용하세요.

EC2 집합에 대한 AWSServiceRoleForEC2Fleet 역할 생성
  1. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 역할을 선택합니다.

  3. 역할 생성을 선택합니다.

  4. 신뢰할 수 있는 엔터티 선택(Select trusted entity) 페이지에서 다음을 수행합니다.

    1. 신뢰할 수 있는 엔터티 유형에서 AWS 서비스를 선택합니다.

    2. 사용 사례에서 서비스 또는 사용 사례EC2 - 플릿을 선택합니다.

      작은 정보

      EC2 - 플릿을 선택해야 합니다. EC2를 선택하면 EC2 - 플릿 사용 사례가 사용 사례 목록에 나타나지 않습니다. EC2 - 플릿 사용 사례는 필요한 IAM 권한으로 정책을 자동으로 생성하고 AWSServiceRoleForEC2Fleet을 역할 이름으로 제안합니다.

    3. Next(다음)를 선택합니다.

  5. 권한 추가 페이지에서 다음을 선택합니다.

  6. 이름 지정, 검토 및 생성 페이지에서 역할 생성을 선택합니다.

EC2 집합이 더 이상 필요 없으면 AWSServiceRoleForEC2Fleet 역할을 삭제하는 것이 좋습니다. 계정에서 이 역할을 삭제한 후 다른 플릿을 생성하면 다시 역할을 만들 수 있습니다.

자세한 내용은 IAM 사용 설명서서비스 연결 역할을 참조하세요.

암호화된 AMI 및 EBS 스냅샷에 사용할 고객 관리형 키에 대한 액세스 권한 부여

EC2 플릿에 암호화된 AMI 또는 암호화된 Amazon EBS 스냅샷을 지정하고 암호화에 AWS KMS 키를 사용하는 경우 Amazon EC2에서 자동으로 인스턴스를 시작하려면 고객 관리형 키를 사용할 권한을 AWSServiceRoleForEC2Fleet 역할에 부여해야 합니다. 이렇게 하려면 다음 절차에 표시된 바와 같이 고객 관리형 키에 대한 권한 부여를 추가해야 합니다.

권한을 제공할 때 권한 부여는 키 정책을 대체합니다. 자세한 내용은 AWS Key Management Service 개발자 안내서에서 권한 부여 사용AWS KMS의 키 정책 사용을 참조하세요.

AWSServiceRoleForEC2Fleet 역할에 고객 관리형 키를 사용할 수 있는 권한을 부여하려면
  • create-grant 명령을 사용하여 고객 관리형 키에 대한 권한 부여를 추가하고 허용된 작업을 수행할 수 있는 권한이 부여된 보안 주체(AWSServiceRoleForEC2Fleet 서비스 연결 역할)를 지정합니다. 고객 관리형 키는 key-id 파라미터와 고객 관리형 키의 ARN으로 지정됩니다. 보안 주체는 AWSServiceRoleForEC2Fleet 서비스 연결 역할의 grantee-principal 파라미터 및 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. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 Policies를 선택합니다.

  3. [Create policy]를 선택합니다.

  4. 정책 생성 페이지에서 JSON 탭을 선택한 다음, 텍스트를 다음과 같이 바꾸고 정책 검토를 선택합니다.

    { "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:ListRoles 작업, EC2 집합 역할을 지정하는 iam:PassRole 작업 및 기존 인스턴스 프로파일을 열거하는 iam:ListInstanceProfiles 작업을 호출할 수 있는 권한이 있어야 합니다.

    (선택 사항) 사용자가 IAM 콘솔을 사용하여 역할 또는 인스턴스 프로파일을 생성할 수 있도록 하려면 정책에 다음 작업도 추가해야 합니다.

    • iam:AddRoleToInstanceProfile

    • iam:AttachRolePolicy

    • iam:CreateInstanceProfile

    • iam:CreateRole

    • iam:GetRole

    • iam:ListPolicies

  5. 정책 검토 페이지에 정책 이름과 설명을 입력한 다음 정책 생성을 선택합니다.

  6. 액세스 권한을 제공하려면 사용자, 그룹 또는 역할에 권한을 추가하세요:

    • AWS IAM Identity Center의 사용자 및 그룹:

      권한 세트를 생성합니다. AWS IAM Identity Center 사용 설명서권한 세트 생성의 지침을 따릅니다.

    • 보안 인증 공급자를 통해 IAM에서 관리되는 사용자:

      ID 페더레이션을 위한 역할을 생성합니다. IAM 사용 설명서서드 파티 자격 증명 공급자의 역할 만들기(페더레이션)의 지침을 따릅니다.

    • IAM 사용자:

      • 사용자가 맡을 수 있는 역할을 생성합니다. IAM 사용 설명서에서 IAM 사용자의 역할 생성의 지침을 따릅니다.

      • (권장되지 않음)정책을 사용자에게 직접 연결하거나 사용자를 사용자 그룹에 추가합니다. IAM 사용 설명서에서 사용자(콘솔)에 권한 추가의 지침을 따르십시오.

EC2 집합 생성

EC2 플릿을 사용하여 인스턴스 플릿을 시작하려면 플릿 요청에서 다음 파라미터만 지정하면 되고, 플릿은 다른 파라미터에 대한 기본값을 사용합니다.

  • LaunchTemplateId 또는 LaunchTemplateName - 사용할 시작 템플릿을 지정합니다(인스턴스 유형 및 가용 영역 등 시작할 인스턴스에 대한 파라미터 포함).

  • TotalTargetCapacity - 플릿의 총 목표 용량을 지정합니다.

  • DefaultTargetCapacityType - 기본 구매 옵션이 온디맨드 또는 스팟인지 여부를 지정합니다.

시작 템플릿에 지정된 파라미터를 재정의하기 위해 하나 이상의 재정의를 지정할 수 있습니다. 각각은 인스턴스 유형, 가용 영역, 서브넷, 최고 가격에 따라 달라질 수 있으며 다른 가중치 용량을 포함할 수 있습니다. 인스턴스 유형을 지정하는 대신 인스턴스에 있어야 하는 속성을 지정하면 Amazon EC2는 해당 속성으로 모든 인스턴스 유형을 식별할 수 있습니다. 자세한 내용은 EC2 플릿 또는 스팟 플릿의 인스턴스 유형 선택에 대한 속성 지정 섹션을 참조하세요.

instant 유형의 EC2 플릿의 경우 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 집합은 분마다 플릿의 인스턴스 상태를 확인합니다. 인스턴스의 상태는 healthy 또는 unhealthy입니다.

EC2 집합은 Amazon EC2에서 제공하는 상태 확인을 사용하여 인스턴스의 상태를 판단합니다. 세 번의 연속 상태 확인에서 인스턴스 상태 또는 시스템 상태가 unhealthy인 경우, 해당 인스턴스의 상태는 impaired으로 확인됩니다. 자세한 내용은 Amazon EC2 인스턴스 상태 확인 섹션을 참조하세요.

플릿을 구성하여 비정상 스팟 인스턴스를 교체할 수 있습니다. ReplaceUnhealthyInstancestrue로 설정한 이후 스팟 인스턴스는 unhealthy로 보고될 때 교체됩니다. 플릿은 비정상 스팟 인스턴스가 교체되는 동안 최대 몇 분간 목표 용량을 밑돌 수 있습니다.

요구 사항
  • 상태 확인 교체는 목표 용량을 유지하는 EC2 집합(maintain 유형 플릿)에만 지원되지만 request 또는 instant 유형 플릿에서는 지원되지 않습니다.

  • 상태 확인 교체는 스팟 인스턴스에 대해서만 지원됩니다. 이 기능은 온디맨드 인스턴스에 대해 지원되지 않습니다.

  • 비정상 인스턴스를 생성할 경우에만 이를 교체하도록 EC2 집합을 구성할 수 있습니다.

  • 사용자는 ec2:DescribeInstanceStatus 작업을 호출할 권한이 있는 경우에만 상태 확인 대체를 사용할 수 있습니다.

비정상 스팟 인스턴스를 교체하도록 EC2 집합을 구성하려면
  1. EC2 집합 생성에서 EC2 플릿 생성을 위한 정보를 사용합니다.

  2. 비정상 스팟 인스턴스를 교체하도록 플릿을 구성하려면 JSON 파일에서 ReplaceUnhealthyInstances에 대해 true를 지정합니다.

모든 EC2 플릿 구성 옵션 보기

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