Cloud/AWS

[Spot instance를 자동화 시켜보자] 1. 개발 백서

brotoo 2021. 9. 15. 11:59

AWS Spot instance 자동화 개발 백서

 

솔직히 온디맨드는 가격이 너무 비싸다! Spot 인스턴스를 사용해보자.

 

그런데 스팟은 마음대로 AWS에서 회수해가는데 이거 좀 애매하니까... 환경을 동일하게 세팅해주는 코드를 짜봤다.


0. basics

 

 - boto3


 - Cloud watch의 경우, instance의 상태에 관한 로그나 문제 사항 체크


 - SNS : 간단한 알림 전송하는 툴


 - Lambda : 간단한 코드를 돌릴 수 있게 만들어줌. def lambda_handler(event, context)를 main 함수로 생각하고 코드 작성
   

    trigger 기능이 굉장히 편한데, 어떤 이벤트(cloud watch, SNS)가 앞에서 발생하면 lambda함수를 실행하도록 설정 할 수 있다.  

1. 로직 


 1) spot instance 회수


 2) Cloud watch에서 회수 event 감지


 3) Lambda함수 (인스턴스 id 삭제 / template 사용 ec2 생성 /  private ipv4 출력)


 4) SNS에서 E-mail 알림 전송 

 


2. 개발 과정


 1) spot instance 회수 감지


  (1) IAM 권한 설정


    (1-1) IAM 서비스 들어가기 -> 정책 -> 정책 생성 -> JSON -> 아래 코드 입력 ( 참고 : 추후 트러블 슈팅 시, cloud watch의 로그에서 권한이 없다고 뜨는 경우가 있음. 이때, action 아래에 권한이 없다고 뜨는 명령어 추가해주면 됨.) 


    (1-2) IAM 서비스 에서 역할 선택 -> 역할 만들기 -> 사용사례 중 Lambda 선택 -> 정책에서 위에서 설정한 정책 선택 -> 다음 -> 이름 설정 


  (2) lambda 함수 설정


    (2-1) lambda 세팅


      - create 함수 -> 함수 이름 -> 런타임 : python3.7 -> 기존 역할 사용 


  (2) SNS -> Topics -> create new topic -> topic name 입력(현재 ITN_spot) -> create topic 클릭 -> create subscription
  

  (2-1) Email


     - Protocol : Email로 설정, Endpoint : 수신 받을 email 주소 


     -> email에 수신되었는 지 메일함 확인하여 인증


   (2-2) Lambda 함수 설정


     - protocol : lambda 설정하고 그냥 다음 버튼 쭉쭉 눌러서 설정


  (3) Cloud watch  


     - Rules(규칙) -> service name : EC2 -> Event type : EC2 Spot Instance Interruption Warning


       -> Targets : SNS_Topic -> topic : SNS의 Topic 이름 -> create rule -> name : 이름 정하기 
(cloudwatch_spot 으로 설정되어있음.)

 2)test 


 (1) EC2 스팟 요청 -> 스팟 인스턴스 요청 -> 총 목표 용량 : 2 이상 설정 -> 목표 용량 유지 체크 -> 요청 생성 


     -> 기다렸다가 요청 생성 완료되고 2 of 2 처럼 뜨면  -> actions -> 용량 수정 (1개 낮춰서 보기) -> cloudwatch 로그 그룹에서 로그 확인 가능