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 로그 그룹에서 로그 확인 가능