Amazon EventBridge로 EC2 Fleet 또는 Spot Fleet의 이벤트 모니터링·대응하기

Amazon EventBridge로 EC2 Fleet 또는 Spot Fleet의 이벤트 모니터링·대응하기 (Monitor and programmatically respond to the events emitted by your EC2 Fleet or Spot Fleet using Amazon EventBridge)

EC2 Fleet이나 Spot Fleet의 상태가 바뀌면 알림을 보내요. 이 알림은 Amazon EventBridge(이전 이름 Amazon CloudWatch Events)로 보내지는 이벤트로 제공돼요. 이벤트는 최선 노력(best effort) 기반으로 발행돼요.

출처: 문서

본문

Amazon EventBridge로 이벤트에 응답해 프로그래밍 방식의 동작을 트리거하는 규칙을 만들 수 있어요. 예를 들어 두 개의 EventBridge 규칙을 만들 수 있어요. 하나는 플릿 상태가 바뀔 때, 다른 하나는 플릿의 인스턴스가 종료될 때 트리거돼요. 첫 규칙에서 플릿 상태가 바뀌면 SNS 주제를 호출해 이메일 알림을 보내도록, 둘째 규칙에서 인스턴스가 종료되면 Lambda 함수를 호출해 새 인스턴스를 시작하도록 구성할 수 있어요.

참고: maintain과 request 유형의 플릿만 이벤트를 보내요. instant 플릿은 동기식 일회성 요청을 제출하고 응답에서 플릿 상태를 즉시 알 수 있으므로 이벤트를 보내지 않아요. EventBridge로 플릿 이벤트를 모니터링하려면 요청 유형이 maintain 또는 request여야 해요.

EC2 Fleet 또는 Spot Fleet 이벤트를 모니터링하는 EventBridge 규칙 만들기

EC2 Fleet이나 Spot Fleet에 대한 상태 변경 알림이 발행되면 JSON 파일로 이벤트가 Amazon EventBridge로 전송돼요. EventBridge가 규칙에 정의된 패턴과 일치하는 이벤트 패턴을 감지하면 규칙에 지정된 대상(들)을 호출해요.

이벤트의 다음 필드가 규칙에 정의된 이벤트 패턴을 구성해요.

  • "source": "aws.ec2fleet" – 이벤트가 EC2 Fleet에서 왔음을 식별.
  • "detail-type": "EC2 Fleet State Change" – 이벤트 유형을 식별.
  • "detail": { "sub-type": "submitted" } – 이벤트 하위 유형을 식별.

EventBridge 규칙으로 알림 보내기

Amazon EC2가 EC2 Fleet 상태 변경 알림을 보낼 때마다 이메일, 문자 메시지 또는 모바일 푸시 알림을 보내는 규칙을 만드는 예시예요. 규칙을 만들기 전에 Amazon SNS 주제를 먼저 만들어야 해요.

  1. Amazon EventBridge 콘솔(https://console.aws.amazon.com/events/)을 엽니다.
  2. Create rule을 선택해요.
  3. Define rule detail에서 규칙 이름(및 선택적 설명)을 입력하고, Event bus에 default를 선택하고, Rule type에 Rule with an event pattern을 선택한 뒤 Next를 선택해요. (같은 리전과 같은 이벤트 버스에서 규칙 이름은 다른 규칙과 같을 수 없어요.)
  4. Build event pattern에서 이 예시의 EC2 Fleet Instance Change 이벤트와 일치하는 다음 이벤트 패턴을 지정해요.
    {
     "source": ["aws.ec2fleet"],
     "detail-type": ["EC2 Fleet Instance Change"]
    }
    
    이벤트 패턴은 Event pattern form 템플릿이나 **Custom pattern (JSON editor)**으로 지정할 수 있어요.
    • 템플릿 사용: Event pattern form 선택 → Event source는 AWS services → AWS Service는 EC2 Fleet → Event type은 EC2 Fleet Instance Change. 템플릿을 맞춤 구성하려면 Edit pattern으로 예시와 일치하도록 변경.
    • (대안) 사용자 지정: Custom pattern (JSON editor) 선택 → Event pattern 상자에 패턴 추가.
  5. Next를 선택해요.
  6. **Select target(s)**에서 Target types는 AWS service, Select a target은 SNS topic을 선택해 이벤트 발생 시 알림을 보내요. Topic에서 기존 주제를 선택해요.
  7. Next → (선택) Tags → Review and create에서 규칙 세부 정보를 검토하고 Create rule을 선택해요.

EventBridge 규칙으로 Lambda 함수 트리거하기

Amazon EC2가 인스턴스가 시작됐다는 EC2 Fleet 인스턴스 변경 알림을 보낼 때마다 Lambda 함수를 트리거하는 규칙을 만드는 예시예요. 신호는 EC2 Fleet Instance Change 이벤트, 하위 유형 launched로 발행돼요. 규칙을 만들기 전에 Lambda 함수를 만들어야 해요.

Lambda 함수는 AWS Lambda 콘솔(https://console.aws.amazon.com/lambda/)에서 Create function으로 만들 수 있어요.

규칙 생성: 위 절차와 비슷하게 콘솔에서 규칙을 만들되, 이벤트 패턴에 EC2 Fleet Instance Change 이벤트와 launched 하위 유형을 지정해요.

{
 "source": ["aws.ec2fleet"],
 "detail-type": ["EC2 Fleet Instance Change"],
 "detail": {
   "sub-type": ["launched"]
}

**Select target(s)**에서 Select a target은 SNS topic 대신 Lambda function을 선택하고 Function에서 만든 함수를 선택해요.

EC2 Fleet 이벤트 유형

EC2 Fleet 이벤트 유형은 5가지이며, 각 유형마다 여러 하위 유형이 있어요.

  • EC2 Fleet State Change
  • EC2 Fleet Spot Instance Request Change
  • EC2 Fleet Instance Change
  • EC2 Fleet Information
  • EC2 Fleet Error

EC2 Fleet State Change

EC2 Fleet이 상태를 바꾸면 이 이벤트를 Amazon EventBridge로 보내요. 예시 데이터:

{
    "version": "0",
    "id": "715ed6b3-b8fc-27fe-fad6-528c7b8bf8a2",
    "detail-type": "EC2 Fleet State Change",
    "source": "aws.ec2fleet",
    "account": "123456789012",
    "time": "2020-11-09T09:00:20Z",
    "region": "us-east-1",
    "resources": [
        "arn:aws:ec2:us-east-1:123456789012:fleet/fleet-598fb973-87b7-422d-be4d-6b0809bfff0a"
    ],
    "detail": {
        "sub-type": "active"
    }
}

sub-type의 가능한 값:

  • active – EC2 Fleet 요청이 검증되었고 Amazon EC2가 대상 수의 실행 인스턴스를 유지하려 시도 중.
  • deleted – 요청이 삭제되었고 실행 중인 인스턴스가 없음. 인스턴스 종료 2일 후 삭제됨.
  • deleted_running – 요청이 삭제되어 추가 인스턴스를 시작하지 않음. 기존 인스턴스는 중단되거나 종료될 때까지 계속 실행.
  • deleted_terminating – 요청이 삭제되고 인스턴스가 종료 중. 모든 인스턴스가 종료될 때까지 이 상태 유지.
  • expired – 요청이 만료됨. TerminateInstancesWithExpiration으로 생성되었다면 이후 terminated 이벤트가 인스턴스 종료를 나타냄.
  • modify_in_progress – 요청이 수정 중. 수정이 완전히 처리될 때까지 이 상태 유지.
  • modify_succeeded – 요청이 수정됨.
  • submitted – 요청이 평가 중이고 Amazon EC2가 대상 수의 인스턴스를 시작할 준비 중.
  • progress – 요청이 충족되는 과정 중.

EC2 Fleet Spot Instance Request Change

플릿의 Spot 인스턴스 요청이 상태를 바꾸면 보내져요. sub-type 값: active(요청이 충족되고 연결된 Spot 인스턴스 있음), cancelled(요청 취소 또는 만료), disabled(Spot 인스턴스 중지), submitted(요청 제출됨).

{
    "version": "0",
    "id": "19331f74-bf4b-a3dd-0f1b-ddb1422032b9",
    "detail-type": "EC2 Fleet Spot Instance Request Change",
    "source": "aws.ec2fleet",
    "detail": {
        "spot-instance-request-id": "sir-rmqske6h",
        "description": "SpotInstanceRequestId sir-rmqske6h, PreviousState: cancelled_running",
        "sub-type": "cancelled"
    }
}

EC2 Fleet Instance Change

플릿의 인스턴스가 상태를 바꾸면 보내져요. sub-type 값: launched(새 인스턴스 시작), terminated(인스턴스 종료), termination_notified(축소 중 Spot 인스턴스가 종료될 때 인스턴스 종료 알림 전송).

{
    "detail-type": "EC2 Fleet Instance Change",
    "detail": {
        "instance-id": "i-0c594155dd5ff1829",
        "description": "{\"instanceType\":\"c5.large\",\"image\":\"ami-6057e21a\",\"productDescription\":\"Linux/UNIX\",\"availabilityZone\":\"us-east-1d\"}",
        "sub-type": "launched"
    }
}

EC2 Fleet Information

충족 중 오류가 있을 때 보내져요. 정보 이벤트는 플릿이 대상 용량 충족을 시도하는 것을 막지 않아요. 하위 유형: fleetProgressHalted(모든 시작 사양의 가격이 Spot 가격보다 낮아 유효하지 않음), launchSpecTemporarilyBlacklisted(구성이 유효하지 않고 여러 시작 시도 실패), launchSpecUnusable(시작 사양의 가격이 Spot 가격보다 낮아 유효하지 않음), registerWithLoadBalancersFailed(로드 밸런서 등록 실패).

EC2 Fleet Error

충족 중 오류가 있을 때 보내져요. 오류 이벤트는 플릿이 대상 용량 충족을 시도하는 것을 막아요. 하위 유형: iamFleetRoleInvalid(플릿에 인스턴스 시작·종료 권한이 없음), allLaunchSpecsTemporarilyBlacklisted(모든 구성이 유효하지 않고 여러 시작 시도 실패), spotInstanceCountLimitExceeded(시작할 수 있는 Spot 인스턴스 수 한도 도달), spotFleetRequestConfigurationInvalid(구성이 유효하지 않음).

Spot Fleet 이벤트 유형

참고: Spot Fleet은 투자 계획이 없는 레거시 API를 사용해요. EC2 Fleet이나 Auto Scaling 그룹 사용을 권장해요.

Spot Fleet 이벤트 유형은 5가지이며, 각 유형마다 여러 하위 유형이 있어요. source가 aws.ec2spotfleet이고 리소스 ARN이 spot-fleet-request/... 형식이라는 점만 빼고, EC2 Fleet 이벤트 유형과 동일하게 동작해요.

  • EC2 Spot Fleet State Change – Spot Fleet 상태 변경 시. 하위 유형: active, cancelled, cancelled_running, cancelled_terminating, expired, modify_in_progress, modify_succeeded, submitted, progress.
  • EC2 Spot Fleet Spot Instance Request Change – 플릿의 Spot 인스턴스 요청 상태 변경 시. 하위 유형: active, cancelled, disabled, submitted.
  • EC2 Spot Fleet Instance Change – 플릿의 인스턴스 상태 변경 시. 하위 유형: launched, terminated, termination_notified.
  • EC2 Spot Fleet Information – 충족 중 오류 시. 하위 유형: fleetProgressHalted, launchSpecTemporarilyBlacklisted, launchSpecUnusable, registerWithLoadBalancersFailed.
  • EC2 Spot Fleet Error – 충족 중 오류 시. 하위 유형: iamFleetRoleInvalid, allLaunchSpecsTemporarilyBlacklisted, spotInstanceCountLimitExceeded, spotFleetRequestConfigurationInvalid.

예시(EC2 Spot Fleet State Change):

{
    "version": "0",
    "id": "d1af1091-6cc3-2e24-203a-3b870e455d5b",
    "detail-type": "EC2 Spot Fleet State Change",
    "source": "aws.ec2spotfleet",
    "account": "123456789012",
    "time": "2020-11-09T08:57:06Z",
    "region": "us-east-1",
    "resources": [
        "arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-4b6d274d-0cea-4b2c-b3be-9dc627ad1f55"
    ],
    "detail": {
        "sub-type": "submitted"
    }
}

더 알아보기