스팟 인스턴스 중단 공지
스팟 인스턴스 중단 공지 (Spot Instance interruption notices)
스팟 인스턴스 중단 공지는 Amazon EC2가 스팟 인스턴스를 중지하거나 종료하기 2분 전에 발행하는 경고예요. 중단 동작으로 최대 절전(hibernation)을 지정하면 최대 절전 과정이 즉시 시작되므로 중단 공지는 받지만 2분 경고는 받지 않아요.
출처: 문서
본문
스팟 인스턴스 중단을 우아하게 처리하는 가장 좋은 방법은 애플리케이션을 결함 허용(fault-tolerant)으로 설계하는 거예요. 이를 위해 스팟 인스턴스 중단 공지를 활용할 수 있어요. 이 중단 공지를 5초마다 확인할 것을 권장해요.
중단 공지는 EventBridge 이벤트와 인스턴스 메타데이터의 항목으로 제공돼요. 중단 공지는 최선 노력(best effort)으로 발행돼요.
EC2 Spot Instance Interruption Warning 이벤트
Amazon EC2가 스팟 인스턴스를 중단하려고 하면 실제 중단 2분 전에 이벤트를 발행해요(최대 절전은 제외 — 공지는 받지만 2분 전에 받지는 않아요, 최대 절전이 즉시 시작되기 때문이에요). 이 이벤트는 Amazon EventBridge로 감지할 수 있어요. 이벤트 규칙을 만들고 사용하는 자세한 예시는 "Taking Advantage of Amazon EC2 Spot Instance Interruption Notices"를 참고하세요.
다음은 스팟 인스턴스 중단 이벤트의 예시예요. instance-action의 가능한 값은 hibernate, stop, terminate예요.
{
"version": "0",
"id": "12345678-1234-1234-1234-123456789012",
"detail-type": "EC2 Spot Instance Interruption Warning",
"source": "aws.ec2",
"account": "123456789012",
"time": "yyyy-mm-ddThh:mm:ssZ",
"region": "us-east-2",
"resources": ["arn:aws:ec2:us-east-2a:instance/i-1234567890abcdef0"],
"detail": {
"instance-id": "i-1234567890abcdef0",
"instance-action": "action"
}
}
참고: 스팟 인스턴스 중단 이벤트의 ARN 형식은
arn:aws:ec2:availability-zone:instance/instance-id예요. 이 형식은 EC2 리소스 ARN 형식과 달라요.
instance-action
instance-action 항목은 동작과 그 동작이 발생할 대략적인 UTC 시간을 지정해요.
Amazon EC2가 스팟 인스턴스를 중지하거나 종료하도록 표시했다면 instance-action 항목이 인스턴스 메타데이터에 있어요. 그렇지 않으면 없어요. IMDSv2(Instance Metadata Service Version 2)로 instance-action을 다음과 같이 검색할 수 있어요.
Linux:
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/spot/instance-action
Windows:
[string]$token = Invoke-RestMethod `
-Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} `
-Method PUT -Uri http://169.254.169.254/latest/meta-data/spot/instance-action
다음 예시 출력은 이 인스턴스가 중지될 시간을 나타내요.
{"action": "stop", "time": "2017-09-18T08:22:00Z"}
다음 예시 출력은 이 인스턴스가 종료될 시간을 나타내요.
{"action": "terminate", "time": "2017-09-18T08:22:00Z"}
Amazon EC2가 인스턴스를 중지·종료할 준비를 하지 않거나, 사용자가 인스턴스를 직접 종료했다면 instance-action은 인스턴스 메타데이터에 없고, 검색하려 하면 HTTP 404 오류를 받아요.
termination-time
termination-time 항목은 인스턴스가 종료(shutdown) 신호를 받을 대략적인 UTC 시간을 지정해요.
참고: 이 항목은 이전 버전과의 호환성을 위해 유지돼요.
instance-action을 사용하세요.
Amazon EC2가 스팟 인스턴스를 종료하도록 표시했다면(중단 동작이 terminate로 설정된 스팟 인스턴스 중단 또는 영구 스팟 인스턴스 요청 취소로 인해), termination-time 항목이 인스턴스 메타데이터에 있어요. 그렇지 않으면 없어요. IMDSv2로 다음과 같이 검색할 수 있어요.
Linux:
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
if curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/spot/termination-time | grep -q .*T.*Z; then echo termination_scheduled; fi
Windows:
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/meta-data/spot/termination-time
다음은 예시 출력이에요.
2015-01-05T18:02:00Z
Amazon EC2가 인스턴스를 종료할 준비를 하지 않거나(스팟 인스턴스 중단이 없거나 중단 동작이 stop 또는 hibernate로 설정된 경우), 사용자가 스팟 인스턴스를 직접 종료했다면 termination-time 항목은 인스턴스 메타데이터에 없거나(HTTP 404 오류) 시간 값이 아닌 값을 포함해요.
Amazon EC2가 인스턴스를 종료하지 못하면 요청 상태가 fulfilled로 설정돼요. termination-time 값은 이제 과거가 된 원래 대략적인 시간과 함께 인스턴스 메타데이터에 남아 있어요.