Spot Fleet 권한
Spot Fleet 권한
중요 — Spot Fleet은 투자가 예정되지 않은 레거시 API를 사용해요. 대신 EC2 Fleet이나 Auto Scaling 그룹을 사용할 것을 권장합니다. 자세한 내용은 "어떤 플릿 방법을 사용해야 할까?"를 참고하세요.
사용자가 Spot Fleet을 생성·관리한다면 필요한 권한을 부여해야 해요.
출처: 문서
본문
Amazon EC2 콘솔로 Spot Fleet을 만들면 AWSServiceRoleForEC2SpotFleet과 AWSServiceRoleForEC2Spot이라는 두 개의 서비스 연결 역할과 aws-ec2-spot-fleet-tagging-role이라는 역할이 생성되어, 사용자를 대신해 리소스를 요청·시작·종료·태그할 권한을 Spot Fleet에 부여해요. AWS CLI나 API를 사용한다면 이 역할들이 존재하는지 확인해야 합니다.
Spot Fleet 사용자에게 권한 부여
Spot Fleet용 정책 생성
- IAM 콘솔(https://console.aws.amazon.com/iam/)을 엽니다.
- 탐색 창에서 Policies → Create policy를 선택합니다.
- Create policy 페이지에서 JSON을 선택하고 텍스트를 다음으로 바꿉니다.
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:RunInstances",
"ec2:CreateTags",
"ec2:RequestSpotFleet",
"ec2:ModifySpotFleetRequest",
"ec2:CancelSpotFleetRequests",
"ec2:DescribeSpotFleetRequests",
"ec2:DescribeSpotFleetInstances",
"ec2:DescribeSpotFleetRequestHistory"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::*:role/aws-ec2-spot-fleet-tagging-role"
},
{
"Effect": "Allow",
"Action": [
"iam:CreateServiceLinkedRole",
"iam:ListRoles",
"iam:ListInstanceProfiles"
],
"Resource": "*"
}
]
}
위 예제 정책은 대부분의 Spot Fleet 사용 사례에 필요한 권한을 사용자에게 부여해요. 특정 API 작업으로 제한하려면 그 작업만 지정하세요.
필수 EC2 및 IAM API — 다음 API가 정책에 포함되어야 해요.
ec2:RunInstances– Spot Fleet에서 인스턴스를 시작하는 데 필요ec2:CreateTags– Spot Fleet 요청, 인스턴스, 볼륨을 태그하는 데 필요iam:PassRole– Spot Fleet 역할을 지정하는 데 필요iam:CreateServiceLinkedRole– 서비스 연결 역할 생성에 필요iam:ListRoles– 기존 IAM 역할을 열거하는 데 필요iam:ListInstanceProfiles– 기존 인스턴스 프로필을 열거하는 데 필요
중요 — 시작 사양이나 시작 템플릿에서 IAM 인스턴스 프로필의 역할을 지정한다면, 사용자에게 그 역할을 서비스에 전달(pass)할 권한을 부여해야 해요. 이렇게 하려면 IAM 정책에서
iam:PassRole작업의 리소스로"arn:aws:iam::*:role/ IamInstanceProfile-role "을 포함하세요.
Spot Fleet API — 다음 Spot Fleet API 작업을 필요에 따라 정책에 추가하세요: ec2:RequestSpotFleet, ec2:ModifySpotFleetRequest, ec2:CancelSpotFleetRequests, ec2:DescribeSpotFleetRequests, ec2:DescribeSpotFleetInstances, ec2:DescribeSpotFleetRequestHistory.
선택 IAM API — (선택) IAM 콘솔에서 사용자가 역할이나 인스턴스 프로필을 만들 수 있게 하려면 정책에 다음 작업을 추가해야 해요: iam:AddRoleToInstanceProfile, iam:AttachRolePolicy, iam:CreateInstanceProfile, iam:CreateRole, iam:GetRole, iam:ListPolicies.
- Review policy를 선택합니다.
- Review policy 페이지에서 정책 이름과 설명을 입력하고 Create policy를 선택합니다.
접근을 제공하려면 사용자, 그룹, 역할에 권한을 추가하세요. (AWS IAM Identity Center의 사용자·그룹은 권한 세트 생성, ID 공급자를 통해 IAM에서 관리하는 사용자는 ID 페더레이션용 역할 생성, IAM 사용자는 수임할 역할 생성. 자세한 지침은 각각 해당 IAM 사용 설명서 참고.)
Spot Fleet용 서비스 연결 역할
Amazon EC2는 사용자를 대신해 다른 AWS 서비스를 호출하는 데 필요한 권한을 위해 서비스 연결 역할을 사용해요. 서비스 연결 역할은 AWS 서비스에 직접 연결되는 고유한 유형의 IAM 역할이며, 링크된 서비스만 수임할 수 있으므로 권한을 AWS 서비스에 위임하는 안전한 방법을 제공합니다.
Amazon EC2는 **AWSServiceRoleForEC2SpotFleet**이라는 서비스 연결 역할로 사용자를 대신해 인스턴스를 시작·관리합니다.
중요 — Spot Fleet에서 암호화된 AMI나 암호화된 Amazon EBS 스냅샷을 지정한다면, Amazon EC2가 사용자를 대신해 인스턴스를 시작할 수 있도록
AWSServiceRoleForEC2SpotFleet역할에 CMK 사용 권한을 부여해야 해요. 자세한 내용은 "암호화된 AMI 및 EBS 스냅샷과 함께 사용할 CMK 접근 부여"를 참고하세요.
AWSServiceRoleForEC2SpotFleet이 부여하는 권한
이 역할은 사용자를 대신해 인스턴스를 요청·시작·종료·태그할 권한을 Spot Fleet에 부여해요. Amazon EC2는 이 서비스 연결 역할로 다음 작업을 완료합니다.
ec2:RequestSpotInstances– Spot Instances 요청ec2:RunInstances– 인스턴스 시작ec2:TerminateInstances– 인스턴스 종료ec2:DescribeImages– 인스턴스용 AMI 설명ec2:DescribeInstanceStatus– 인스턴스 상태 설명ec2:DescribeSubnets– 인스턴스용 서브넷 설명ec2:CreateTags– Spot Fleet 요청, 인스턴스, 볼륨에 태그 추가elasticloadbalancing:RegisterInstancesWithLoadBalancer– 지정된 인스턴스를 지정된 로드 밸런서에 추가elasticloadbalancing:RegisterTargets– 지정된 타깃을 지정된 타깃 그룹에 등록
서비스 연결 역할 생성
대부분의 경우 서비스 연결 역할을 수동으로 만들 필요는 없어요. Amazon EC2는 콘솔에서 처음 Spot Fleet을 만들 때 AWSServiceRoleForEC2SpotFleet 서비스 연결 역할을 생성합니다. 2017년 10월(이 서비스 연결 역할을 지원하기 시작한 시점) 이전에 활성 Spot Fleet 요청이 있었다면, Amazon EC2가 계정에 이 역할을 이미 만들었습니다.
AWS CLI나 API로 Spot Fleet을 만든다면 먼저 이 역할이 존재하는지 확인해야 해요.
콘솔로 역할 생성
- IAM 콘솔(https://console.aws.amazon.com/iam/)을 엽니다.
- 탐색 창에서 Roles → Create role을 선택합니다.
- Select trusted entity 페이지에서 Trusted entity type으로 AWS service를 선택하고, Use case에서 EC2를 선택한 뒤 EC2 - Spot Fleet을 선택합니다.
참고 — EC2-Spot Fleet 사용 사례는 필요한 IAM 권한이 있는 정책을 자동으로 만들고 역할 이름으로
AWSEC2SpotFleetServiceRolePolicy를 제안해요. - Next를 선택합니다.
- Add permissions 페이지에서 Next를 선택합니다.
- Name, review, and create 페이지에서 Create role을 선택합니다.
AWS CLI로 역할 생성
aws iam create-service-linked-role --aws-service-name spotfleet.amazonaws.com
Spot Fleet을 더 이상 사용하지 않는다면 AWSServiceRoleForEC2SpotFleet 역할을 삭제할 것을 권장합니다. 계정에서 이 역할을 삭제한 뒤 콘솔로 Spot Fleet을 요청하면 Amazon EC2가 역할을 다시 만듭니다.
암호화된 AMI 및 EBS 스냅샷과 함께 사용할 CMK 접근 부여
Spot Fleet 요청에서 암호화된 AMI나 암호화된 Amazon EBS 스냅샷을 지정하고 암호화에 고객 관리형 키를 사용한다면, Amazon EC2가 사용자를 대신해 인스턴스를 시작할 수 있도록 AWSServiceRoleForEC2SpotFleet 역할에 CMK 사용 권한을 부여해야 해요. 이를 위해 다음 절차처럼 CMK에 grant를 추가해야 합니다.
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/aws-service-role/spotfleet.amazonaws.com/AWSServiceRoleForEC2SpotFleet \
--operations "Decrypt" "Encrypt" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "CreateGrant" "DescribeKey" "ReEncryptFrom" "ReEncryptTo"
Spot Instances용 서비스 연결 역할
Amazon EC2는 **AWSServiceRoleForEC2Spot**이라는 서비스 연결 역할로 사용자를 대신해 Spot Instances를 시작·관리합니다. 자세한 내용은 "Spot Instance 요청용 서비스 연결 역할"을 참고하세요.
Spot Fleet 태깅용 IAM 역할
aws-ec2-spot-fleet-tagging-role IAM 역할은 Spot Fleet 요청, 인스턴스, 볼륨을 태그할 권한을 Spot Fleet에 부여해요.
중요 — 플릿의 인스턴스를 태그하도록 선택하고 목표 용량 유지도 선택하면(Spot Fleet 요청이
maintain유형), 사용자와IamFleetRole에 설정된 권한의 차이로 플릿 인스턴스의 태깅 동작이 일관되지 않을 수 있어요.IamFleetRole에CreateTags권한이 없으면 플릿이 시작한 인스턴스 중 일부가 태그되지 않을 수 있습니다. 이 불일치를 고치는 동안에는 모든 인스턴스가 태그되도록IamFleetRole에aws-ec2-spot-fleet-tagging-role역할을 사용할 것을 권장합니다. 또는 기존 역할을 사용하려면 기존 역할에AmazonEC2SpotFleetTaggingRoleAWS 관리형 정책을 연결하고, 그 외에는 기존 정책에CreateTags권한을 수동으로 추가해야 합니다.
IAM 역할 생성
- IAM 콘솔(https://console.aws.amazon.com/iam/)을 엽니다.
- 탐색 창에서 Roles → Create role을 선택합니다.
- Select trusted entity 페이지의 Trusted entity type에서 AWS service를 선택합니다.
- Use case의 Use cases for other AWS services에서 EC2를 선택한 뒤 EC2 - Spot Fleet Tagging을 선택합니다.
- Next를 선택합니다.
- Add permissions 페이지에서 Next를 선택합니다.
- Name, review, and create 페이지의 Role name에 역할 이름(예:
aws-ec2-spot-fleet-tagging-role)을 입력합니다. - 페이지 정보를 검토하고 Create role을 선택합니다.
교차 서비스 혼동된 대리인(confused deputy) 방지
혼동된 대리인 문제(confused deputy problem)는 작업을 수행할 권한이 없는 엔터티가 더 높은 권한의 엔터티로 하여금 그 작업을 수행하도록 강제할 수 있는 보안 문제예요. aws-ec2-spot-fleet-tagging-role 신뢰 정책에서 aws:SourceArn과 aws:SourceAccount 글로벌 조건 컨텍스트 키를 사용해 Spot Fleet이 다른 서비스에 부여하는 리소스 권한을 제한할 것을 권장합니다.
신뢰 정책에 조건 키 추가하기
- IAM 콘솔(https://console.aws.amazon.com/iam/)을 엽니다.
- 탐색 창에서 Roles를 선택합니다.
- 이전에 만든
aws-ec2-spot-fleet-tagging-role을 찾아 링크(체크박스가 아님)를 선택합니다. - Summary 아래에서 Trust relationships 탭을 선택하고 Edit trust policy를 선택합니다.
- JSON 문에 혼동된 대리인 문제를 방지하기 위해
aws:SourceAccount와aws:SourceArn글로벌 조건 컨텍스트 키를 포함한Condition요소를 다음과 같이 추가합니다.
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:ec2:us-east-1:111122223333:spot-fleet-request/sfr-*"
},
"StringEquals": {
"aws:SourceAccount": "111122223333"
}
참고 —
aws:SourceArn값에 계정 ID가 포함되어 있고 두 글로벌 조건 컨텍스트 키를 모두 사용한다면, 같은 정책 문에서aws:SourceAccount값과aws:SourceArn값의 계정이 같은 계정 ID여야 해요.
최종 신뢰 정책은 다음과 같습니다.
{
"Version":"2012-10-17",
"Statement": {
"Sid": "ConfusedDeputyPreventionExamplePolicy",
"Effect": "Allow",
"Principal": {
"Service": "spotfleet.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:ec2:us-east-1:111122223333:spot-fleet-request/sfr-*"
},
"StringEquals": {
"aws:SourceAccount": "111122223333"
}
}
}
}
- Update policy를 선택합니다.
다음 표는 aws:SourceArn의 잠재 값으로 aws-ec2-spot-fleet-tagging-role의 범위를 다양한 세부 수준으로 제한하는 방법을 제공합니다.
| API 작업 | 호출 서비스 | 범위 | aws:SourceArn |
|---|---|---|---|
| RequestSpotFleet | AWS STS (AssumeRole) | 지정된 계정의 spot-fleet-requests에 대한 AssumeRole 기능 제한 | arn:aws:ec2::123456789012:spot-fleet-request/sfr- |
| RequestSpotFleet | AWS STS (AssumeRole) | 지정된 계정·지정된 리전의 spot-fleet-requests로 제한(다른 리전에서는 이 역할을 사용할 수 없음) | arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-* |
| RequestSpotFleet | AWS STS (AssumeRole) | sfr-11111111-1111-1111-1111-111111111111 플릿에만 영향을 주는 작업으로 제한(다른 Spot Fleet에는 사용할 수 없고, 새 Spot Fleet 시작에도 사용할 수 없음) | arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-11111111-1111-1111-1111-111111111111 |
더 알아보기 (Learn more)
- Spot Fleet 요청 상태와 Spot Fleet 생성 문서를 확인하세요.