ddps-lab / cloud-usage

MIT License
1 stars 1 forks source link

spot instances management code #39

Closed Kim-Yul closed 8 months ago

Kim-Yul commented 8 months ago

이전에 작업하던 스팟 사용량 인스턴스의 코드 풀하였습니다.

현재 EC2에서 작업하던 내용이라 람다에 올릴 수 있도록 양식을 수정해야 하는 일이 있습니다. 내일 이어서 작업 진행하겠습니다.

Kim-Yul commented 8 months ago

이전 이슈에서 발전된 사항 작성하였습니다.

한 리전 내의 모든 인스턴스 값 정확히 추출

이전에는 일차적으로 리전에 존재하는 하나의 인스턴스에 대한 정보만 가져올 수 있었습니다.

예를 들어

도쿄 리전에 인스턴스 1개
서울 리전에 인스턴스 2개

였을 때,

도쿄 리전에 인스턴스 1개
서울 리전에 인스턴스 1개

만 정확한 값을 추출할 수 있었습니다. 그러나 현재는 위와 다르게,

도쿄 리전에 인스턴스 1개
서울 리전에 인스턴스 2개

처럼 모든 인스턴스에 대한 정확한 값 추출이 가능합니다.

아래는 오레건 리전에 존재하던 두 인스턴스의 값을 추출하여 슬랙에 보낸 결과입니다.

Screenshot 2024-02-13 at 15 24 32

시간 계산 역시 제대로 되었습니다.

Screenshot 2024-02-13 at 15 25 05 Screenshot 2024-02-13 at 15 24 37

한 인스턴스의 모든 활동 추출

또한 한 인스턴스가 하루에 꺼졌다 켜졌다 한 모든 내용 역시 슬랙에 보낼 수 있도록 작성하였습니다.

Screenshot 2024-02-13 at 16 45 52

image

다음 진행 예정 사항

mh3ong commented 8 months ago

현재 EC2를 기준으로 코드가 작성되어 있어 람다에서 실행할 수 있도록 코드 수정이 진행이되면 빠르게 review 진행할 수 있도록 하겠습니다.

Kim-Yul commented 8 months ago

현재 람다 함수로 수정하였고, 제가 생각한 내에 에러 처리를 완료하였습니다.

function description

개발 목적 : 이벤트가 실행되는 시간을 기준으로 전날의 인스턴스 사용량에 대하여 데이터를 추출하고 슬랙으로 리포트합니다. 기능 :

최대한 제가 생각한 내의 모든 경우를 생각하여 모두 실현 가능하게 작성 완료하였습니다. 리뷰 및 추가 에러 사항을 통해 수정하도록 하겠습니다.

event bridge : usage_daily_instance_usage_report (time : 오전 8시 40분) event function : usage_daily_instance_usage_report

서울 리전의 이벤트 브릿지를 통해 이벤트가 실행되면, 서울 리전의 람다 함수 1개를 통해 모든 리전을 순차적으로 돌며 사용한 인스턴스의 데이터를 수집하고, 메세지로 다듬어 슬랙으로 전송합니다.


정상적으로 Start 하고 Stop 하였을 경우, 사용한 시간에 대하여 반영한다.

Screenshot 2024-02-19 at 16 24 47

Start time만 기록될 경우, (Start event time ~ 데이터 검색 종료 시간)까지의 사용 시간으로 반영한다.

Screenshot 2024-02-19 at 16 27 54

Stop time만 기록될 경우, (데이터 검색 시작 시간 ~ Stop event time)까지를 사용 시간으로 반영한다.

Screenshot 2024-02-19 at 16 28 01

이해를 덧붙이기 위한 설명

정상적인 케이스

특이한 케이스 1

특이한 케이스 2

에러 메세지 정상 반영

Screenshot 2024-02-19 at 21 05 02

에러 발생 시 정상적으로 슬랙에 에러 메세지를 전달할 수 있도록 구현한 코드 이용하였습니다.


코드 상 문제 또는 자세한 설명이 필요한 부분, 그리고 수정 사항은 리뷰 확인 후 차례대로 반영하도록 하겠습니다! @mh3ong @red0sena 리뷰 부탁드립니다!

Kim-Yul commented 8 months ago

추가적인 궁금점

함수나 파일 이름을 과거형으로 사용할 이유가 있을까요?

명명에 통일성이 없었던 것으로 판단하고 모두 현재형으로 수정하겠습니다.

Kim-Yul commented 8 months ago

리뷰에 남겨주신 내용을 바탕으로 코드를 수정하던 중 고려하지 못했던 사항이 있어 추가로 기능 개발 중입니다.

  1. Terminate event 는 언제든지 발생할 수 있다.

    • Terminate event 의 경우 인스턴스가 켜져 있는 상태에서도 실행할 수 있고, 꺼져 있는 상태에서도 실행할 수 있습니다. 이 부분을 고려하지 못하여 시간 상 에러가 발생하여 기능 개발 중입니다.
  2. Start, Stop, Terminate event 는 복수로 켜고 끌 수 있다.

    • 위 이벤트들은 한 개의 인스턴스 이상을 콘솔에서 켜고 끌 수 있습니다. cloudtrail 에서는 이를 하나의 이벤트에 저장하고 있는데, 기존 resource name 을 통해 인스턴스의 정보를 가져왔던 방법으로는 두 개 이상의 인스턴스 정보를 가져오는 것이 불가능하여 기능 개발 중입니다.
    • 즉, 다른 이벤트 key 값을 통해 복수 개의 인스턴스 정보를 가져와야 하며, 이로 인해 코드에 변화가 생길 예정입니다.

수정은 진행하였으나, 위 기능 개발하고 있어 정리되는 대로 다시 푸쉬하겠습니다.

kmu-leeky commented 8 months ago

유림아. 위의 제약 사항들이 모니터링을 하는데 굉장히 큰 제약 사항이 아니라면 우선 배포를 하고 결과를 보면서 발전시켜 나가도 좋을것 같아.

Kim-Yul commented 8 months ago

우선 리뷰한 내용이 반영된 코드 먼저 올리겠습니다! 둘 다 에러를 발생시킬 수 있는 상황이지만, 일반적인 케이스는 에러 발생 없이 진행 될 것 같습니다.

현재 세팅으로는 오전 8시 40분에 슬랙으로 전달 예정입니다! 내일부터 cloud-usage 채널에 올라갈 예정입니다

Kim-Yul commented 8 months ago

현재 최신 커밋(a114907)을 기준으로 람다 코드 올려두었습니다. 이벤트는 매일 오전 8시 40분에 실행될 예정이며, 아직 미흡한 부분이 있어 에러와 함께 출력될 수 있습니다. 다른 작업은 계속 진행하겠습니다.

고려 사항

  1. Terminate event 는 언제든지 발생할 수 있다.
  2. Start, Stop, Terminate event 는 복수로 켜고 끌 수 있다.
  3. 켜고 끄는 인스턴스의 수가 50개가 넘을 수 있다. (실험 등의 일반적이지 않을 때)

작업에 맞춰 README.md 파일 수정 예정입니다.

Kim-Yul commented 8 months ago

진행 사항

코드 리뷰 반영

  1. 글로벌 변수 수정 지양
    • 지역 변수로 수정한 후 파라미터로 값을 전달하여 사용하게끔 변경하였습니다.
  2. 명명 통일 (_ 사용)
    • usage 코드 포맷에 맞추어 변수 및 함수에 _ 사용 및 명명 규칙 통일하였습니다.
  3. Lambda value Caching
    • 기존 글로벌 변수였던 DATE 의 값이 Lambda에서 Caching 될 수 있다고 하여 지역 변수로 수정하였습니다.
    • 이를 통해 람다 함수가 실행될 때마다 값을 받아올 수 있도록 설정하였습니다.
  4. function description
    • README.md 파일을 추가하여 설명을 달아놓았습니다.
    • 간략하게 적어두었기 때문에, 추후 보완 예정입니다.

기능 개발

  1. 기존 코드는 콘솔 상에서 2개 이상의 인스턴스 타입 변동 시 인스턴스 아이디를 모두 받아오지 못하여 사용량이 누락되는 경우가 발생하였습니다. image
  1. AWS 시스템의 오류 또는 생성 실패로 같은 이벤트 중복 시 사용량 측정에 오류가 있었습니다.

    • 지난 목요일 사용량 중에는 RunInstances 시도 후 이 이벤트가 실패하여 다시 한 번 RunInstances 를 시도한 흔적이 있습니다.
    • 또는 TerminateInstances 를 하였음에도 또다시 TerminateInstances 를 하는 케이스가 발생하였습니다.
    • 이 부분에서 사용량 측정에 오류가 발생할 수 있어, 단 하나의 이벤트만 인식할 수 있도록 수정하였습니다.
    • RunInstances
    • RunInstances 가 제대로 생성되었을 때만 인스턴스의 정보를 수집하고, 인스턴스 정보가 수집된 이후의 RunInstances 이벤트는 모두 무시합니다.
    • StartInstances
    • 모든 인스턴스 정보를 수집하되, StartTime만 기록된 리스트에서 특수 케이스 외 모두 사용량 측정을 무시합니다.
    • 현재 StartTime만 기록된 리스트에서 특수 케이스 외 모두 사용량 측정 이 부분에서 특수 케이스를 분류하는 작업을 진행해야 합니다.
    • StopInstances
    • 시간 값 입력 시 자동으로 중복된 값을 처리하고 있어서 코드를 추가하지 않았습니다.
    • TerminateInstances
    • 가장 처음 실행된 이벤트 값인지 확인하고 그 값을 저장합니다.
    • 처음 실행된 이벤트가 아니라면 값이 저장되었다가 사라집니다.
  2. 50개 이상의 검색이 가능하도록 기능 개발하였습니다.

    • 지난 금요일 모니터링 결과, 목요일에 Run 인스턴스 이벤트만 94개 존재하였습니다.
    • 50개의 이벤트만 검색하였고, 모든 이벤트가 검색되지 않아 인스턴스 사용량 누락이 발생하였습니다.
    • 현재는 이전에 만든 코드를 최대한 재사용하여 50개 이상도 검색될 수 있도록 수정 완료하였습니다.

앞으로 할 작업

  1. 메세지 형식을 알아보기 쉽게 수정할 예정입니다. [수정 전] image [수정 후] image

  2. DDD 실험과 같이 특수한 상황일 때 사용량 메세지를 어떻게 해야할 지 고민 중입니다. 가능하면 전달하지 않는 방향을 고려 중입니다.

Kim-Yul commented 8 months ago

현재 코드 작업 완료하였습니다. 람다에는 현재 최종으로 올라간 커밋(6b18e7c)의 버전이 올라가 있습니다. 교수님의 의견대로 검색 기간 내에 인스턴스가 종료되지 않았을 때 '인스턴스 실행 중' 이라는 문구를 달긴 하였습니다. 그러나 이 경우 이때 사용한 사용량은 측정이 어려운데, 얼마나 사용하였는지 추가하지 않아도 될까요? 이와 관련한 수정 사항이 없으면, 코드 리뷰 -> 수정 -> 머지 작업 진행하겠습니다.

kmu-leeky commented 8 months ago

그러면 그냥 인스턴스 실행 중 (12H 11M ) 이런식으로 해서 괄호안에서 시작 후 동작중인 현재까지 소요시간 만이라도 기록해주면 어떨까?

Kim-Yul commented 8 months ago

괜찮은 것 같습니다! 수정 해두고 다시 커밋하겠습니다!

Kim-Yul commented 8 months ago

현재 코드는 수정 완료하였습니다. 그러나 실제로 결과를 확인 해보니 가독성이 굉장히 떨어지는 것 같아 고민 중입니다.

[변경 전]

image

[변경 후]

image

가독성과 관련하여 확인 한 번 부탁드립니다. 현재 코드는 변경 전의 포맷으로 전달 예정입니다. 어떤 것이 괜찮아 보이실까요?

Kim-Yul commented 8 months ago

변경 후의 포맷으로 코드 수정 후 커밋하겠습니다. 또한, 스팟 이슈 에서 발생한 내용으로 미팅 진행하였고, 이 내용은 현재 풀리퀘에서 해결하겠습니다.

이후 코드 리뷰 요청드리며 이 이슈 마무리하고, 새 이슈에서 트래픽 진행하겠습니다.

Kim-Yul commented 8 months ago

미팅 진행 사항 및 포맷 변경하였습니다. 모니터링 이후 에러 사항 발생 시 코드 수정이 있을 수 있습니다. 현재 람다에 최신 커밋(f1b075c)으로 올라가 있습니다. 내일 오전 모니터링 이후 코드 리뷰 부탁드립니다!

Kim-Yul commented 8 months ago

추가 반영 사항입니다.

image

지난 미팅으로 50건이 넘는 스팟리퀘스트와 관련하여 정확한 인스턴스 사용량 대신 몇 번 요청이 있었는지 표현하기로 하였습니다. 성규님께 여쭤본 결과 요청 횟수가 일치하는 것을 확인하였습니다. 이중 리퀘스트 요청 평균 XX건이라고 표현한 이유가 다음과 같이 min값과 max의 값을 이용하여 평균값을 추출하였기 때문이었습니다.

image

그러나 현재 확인한 건 min과 max 값이 모두 일치하고 있어서 현재는 리퀘스트 요청 약 XX건으로 수정하는 것이 어울릴 것 같아 수정해둔 상태입니다.

에러 발생하는 원인 역시 수정하였습니다. 코드 리뷰 -> 수정 -> 머지 과정 진행하겠습니다. 코드 리뷰 부탁드립니다!

Kim-Yul commented 8 months ago

리뷰해주신 내용 반영하여 최신 커밋(1334694) 올렸습니다. 지난 주 모니터링과 일치하게 이상 없이 작동하는 것을 확인하였습니다. 추가로 수정하실 사항 없으시면 해당 풀리퀘 머지 하도록 하겠습니다!