Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[마소콘 2019] 서버리스를 활용한 분산 처리- 김민준

[마소콘 2019] 서버리스를 활용한 분산 처리- 김민준

2019년 11월 23일 마이크로소프트웨어 콘퍼런스, 마소콘 2019
서버리스를 활용한 분산 처리- 김민준

MICROSOFTWARE

November 27, 2019
Tweet

More Decks by MICROSOFTWARE

Other Decks in Programming

Transcript

  1. Contents • 프롤로그 • AWS Lambda • Amazon SNS, Amazon

    SQS • AWS API Gateway • CloudWatch • 에필로그 • 데모
  2. 프롤로그 오류가 발생했는데요. 죄송한데 확인 좀 해주시겠어요? 업체를 통해서 JAVA로

    개발된 프로그램인데요. 업체가 대응이 너무 느려서… 혹시 한번 보기만 해주시겠어요? 서버 정보는… %$%$^#%#
  3. 프롤로그 아.. 정신없네요… 실행되고 있는 이 많은 Agent 프로그램이 업체

    것인가요 ? 관리프로그램은 존재하지 않는 것인가요 ? 이건 제가 볼 수 없어요..
  4. 프롤로그 제가 확인해보니 업체는 관세청의 API를 주기적으로 호출을… 그리고 그것을

    수많은 Agent 프로그램으로 분할 처리 이렇게 서버에서 돌다가 하나라도 Agent 가 죽을 경우에는 그에 따른 대응방법으로는 재실행밖에 없는데, 그 방법도 수동이네요? 이거 비싼 건가요 ?
  5. 프롤로그 아~ 그래요? 그럼 직접 구현해주실래요? C#으로 되시죠? 기존에 몇

    개 있잖아요? 비슷하게 해서 하면 될 것 같은데요? 저도 관세청에 API 정보를 좀 보니깐 어려워 보이진 않네요. 진행해보시죠.
  6. 서버리스(Serverless)를 직역하자면, “서버가 없다” 라는 의미가 있습니다. 하지만, 사실상 서버가

    없는것은 아닙니다. 그저, 특정 작업을 수행하기 위해서 컴퓨터를 혹은 가상머신에 서버를 설정하고, 이를 통하여 처리 하는 것이 아님을 의미합니다. 그 대신에, BaaS (Backend as a Service) 혹은 FaaS (Function as a Service) 에 의존하여 작업을 처리하게 됩니다. FaaS 를 제공하는 서비스 중에선, AWS Lambda, Azure Functions, Google Cloud Functions 등이 있습니다. Serverless (출처 : 벨로퍼트 블로그)
  7. FaaS 는 프로젝트를 여러개의 함수로 쪼개서 (혹은 한개의 함수로 만들어서),

    매우 거대하고 분산된 컴퓨팅 자원에 여러분이 준비 해둔 함수를 등록하고, 이 함수들이 실행되는 횟수 (그리고 실행된 시간) 만큼 비용을 내는 방식을 말합니다. 우리가 등록한 함수는 특정 이벤트가 발생했을때 실행됩니다. - 주기적으로 실행되게끔 설정 할 수 있습니다. 5분마다, 1시간마다, 하루마다 이런식으로 말이죠. 크롤링 작업, 주기적 처리를 할 때 좋습니다. - 웹 요청을 처리 할 수도 있습니다. 예를 들어서 특정 URL 로 들어오면 어떠한 작업을 하게끔 할 수 있죠. 이를 통하여 백엔드 API 를 구성 할 수도 있습니다. - 콘솔을 통하여 직접 호출 할 수도 있습니다. FaaS (Function as a Service) (출처 : 벨로퍼트 블로그)
  8. 프롤로그 근데 AWS Lambda를 닷넷으로 하려니.. Visual Studio 을 구매해

    주셔야겠네요ㅎㅎ 사주세요. 4달라 4달라 4달라~~~~
  9. 결국 Visual Studio Code 로 샘플 작업을 진행했습니다…. (개인 블로그에

    있는 Visual Studio Code 로 .NET Core 2.1 사용하여 AWS Lambda 만들기 글)
  10. 그런데 Python으로 알고리즘 문제 풀고 놀던 때라… Python 으로 해볼까?

    했죠.. (알고리즘 문제풀기 스터디를 Python 으로 했던 사진..)
  11. SAP을 SOAP(XML)로 데이터를 끌어오는데, Zeep 라는 라이브러리를 사용. Zeep 의

    github에서 동일한 이슈가 존재하는지 확인. (Zeep 라이브러리 내부에 lxml이 존재한다.)
  12. 결론적으로 문제점은… 나의 작업 환경은 Windows (Local) AWS Lambda 의

    환경은 Amazon Linux. 빌드 환경이 전혀 다르기 때문에 동작이 불가능한 것. !=
  13. 결론적으로 문제점은… 나의 작업 환경은 Windows (Local) AWS Lambda 의

    환경은 Amazon Linux. 빌드 환경이 전혀 다르기 때문에 동작이 불가능한 것. != Github에서 Amazon Linux 에서 빌드한 파일을 다운받아서 파일 교체를 통해 처리 완료.
  14. 올리고 내리며 알게 된 사실… Cold Start 그리고 Warm Start…

    첫 호출에는 Cold Start -> 지연시간 발생
  15. Warm 상태를 유지하기 위해 일반적으로 5분정도라고 하지만 실제 AWS Serverless

    Hero의 2017년 자료를 보니 구현한 언어, 메모리 등의 여러 조건으로 다른 결과를 보인다. (출처 https://theburningmonk.com/2017/06/aws-lambda-compare-coldstart-time-with-different-languages-memory-and-code-sizes/ )
  16. 다시 작업으로 들어가면… 20분마다 실행하여, 데이터를 SAP에서 끌어오고, 관세청 API를

    호출 그리고 그 값을 다시 SAP로 보내주는 것이 해당 작업의 목적이었다.
  17. 결국 AWS Lambda 의 메모리를 조금씩 올리면서 확인. 하지만 이렇게

    하는것이 진짜 최선일까? 점점 올라가는 메모리만큼이나 답답함이 커졌고, 청구될 비용도 커짐… 하지만 비용보다 구현이 우선이기에 어떻게 풀어갈지 고민을 했음.
  18. 구조를 변경하기로 결심! 처리하는 녀석을 나눠보자. Lambda를 하나 더 생성함.

    1. 사내 시스템에서 처리해야 할 데이터를 가져와서 2번 람다로 전달 2. 전달받은 데이터로 관세청 API를 스크래핑하고 사내 시스템으로 다시 전달 TO-BE AS-IS
  19. Layers가 존재하는 것을 확인. 특징은 버전별로 엎어 치기 개념이다. (하지만

    과거 버전의 Layers도 Lambda 에서는 사용이 가능하다.) 우선 pip list 로 사용한 라이브러리들을 확인하고 경로에 들어가 복사하여 하나의 폴더에 몰아 넣었다. 그런데 레이어를 올리는 폴더구조에도 규칙이 있음.
  20. 처리해야 할 데이터를 가져오는 과정보다 관세청과 통신하는 시간이 훨씬 오래

    걸린다는 점이다. 관세청 API는 XML 기반으로 제공된다. 데이터 1개를 관세청 API에 요청하면, 관세청 API는 로우 데이터 n개로 돌아왔다. 즉, 나는 20만 바퀴를 돌려야 한다는 뜻이었다. 멀티 프로세싱으로 나눠 돌려도 그것은 부담일 수밖에 없다.
  21. 처리해야 할 데이터를 가져오는 과정보다 관세청과 통신하는 시간이 훨씬 오래

    걸린다는 점이다. 관세청 API는 XML 기반으로 제공된다. 데이터 1개를 관세청 API에 요청하면, 관세청 API는 로우 데이터 n개로 돌아왔다. 즉, 나는 20만 바퀴를 돌려야 한다는 뜻이었다. 멀티 프로세싱으로 나눠 돌려도 그것은 부담일 수밖에 없다.
  22. 다른 방법으로 분산처리를 할 수 있을까 ? SQS SNS (Amazon

    Simple Notification Service) (Amazon Simple Queue Service)
  23. 나에게 주어진 조건 1. 20분 마다 실행. (가능하면 10분…. 더

    가능하면 5분….) 2. 폴링 작업의 특성상 반복적으로 같은 오류가 발생하지 않는다면, 그냥 계속 재실행을 통해 오류에 대해서 대응. 3. 결과값은 받을 필요 없음. 3. 순서는 중요하지 않음. 4. 어떻게… 실행만 문제 없이…
  24. Amazon SNS 를 여러 번 호출하여 처리하기로 결정 DATA를 나누고,

    반복문을 통해 SNS 을 총 3번 호출 -> 각 Lambda 가 1개씩 분할 실행
  25. 그런데 아무리 짧은 주기로 반복해서 데이터를 갖고 온다고 하지만 즉각적으로

    봐야할 급한 데이터가 있을 수 있다. 5분 10분을 기다리기만 할 수는 없다…..
  26. 그런데 아무리 짧은 주기로 반복해서 데이터를 갖고 온다고 하지만 즉각적으로

    봐야할 급한 데이터가 있을 수 있다. 5분 10분을 기다리기만 할 수는 없다….. 직접 실행 필요 ?
  27. 그런데 아무리 짧은 주기로 반복해서 데이터를 갖고 온다고 하지만 즉각적으로

    봐야할 급한 데이터가 있을 수 있다. 5분 10분을 기다리기만 할 수는 없다….. 직접 실행 필요 ?
  28. 그런데 아무리 짧은 주기로 반복해서 데이터를 갖고 온다고 하지만 즉각적으로

    봐야할 급한 데이터가 있을 수 있다. 5분 10분을 기다리기만 할 수는 없다….. 직접 실행 필요 ? API Gateway
  29. 근데 예약작업은 어떻게? CloudWatch 클라우드워치를 사용하면 모든 AWS 서비스에 대한

    측정항목(Metrics)을 기준으로, 실시간으로 실행 중인 애플리케이션과 리소스를 대시보드(Dashboard)를 생성해 직접 원하는 정보를 모니터링할 수 있다. 물론, 사용자는 상황에 따라 인스턴스를 추가하거나 중지 할 수 있다. 그리고 앞서 계속 확인하던 로그를 분석하는 클라우드워치 로그 인사이트(CloudWatch Logs Insights)라는 서비스도 내재해 있다. 이벤트(Event)를 이용하면 AWS 서비스끼리 예약 작업도 만들 수 있다. 나는 클라우드워치를 이용해 크론탭(Crontab) 기능을 사용하기로 했다. 클라우드워치에서 ‘이벤트-규칙’ 메뉴에 들어가면 규칙을 생성할 수 있다. 규칙 입력방식은 이벤트 패턴과 일정 등 두 가지가 있다.
  30. 그러면 왜 RDBMS를 쓰는 것인가 ? AWS 서비스 안 쓰고?

    운영담당자 기존의 업무 방식이 존재하는데… 마음대로 다른 방법을 요구할 수 없다고 판단….
  31. 결과 기존 대비 약 4배 많은 작업량을 처리함에도 비용은 99.98%를

    절약했다. 또한 기존에는 모니터링이 전혀 불가능했으며, 장애가 발생한 후에만 처리할 수 있었다. 현재는 장애 발생 시 즉각 알림 이메일이 발송돼, 빠른 대응을 할 수 있어 운영상 안정성이 크게 향상했다. 그리고 현재(약 6개월)까지 장애가 발생하고 있지 않다.
  32. 결과 기존 변경 인프라 VM웨어의 가상머신 (VM) AWS 서버리스 비용

    100% 0.02%(기존 대비 99.98% 절약) 처리량 20분마다 처리 5분 (기존 대비 4배) 장애 평균 월 2회 현재가지 0회(약 6개월 이상 운영중) 모니터링 불가능 가능 기존 대비 약 4배 많은 작업량을 처리함에도 비용은 99.98%를 절약했다. 또한 기존에는 모니터링이 전혀 불가능했으며, 장애가 발생한 후에만 처리할 수 있었다. 현재는 장애 발생 시 즉각 알림 이메일이 발송돼, 빠른 대응을 할 수 있어 운영상 안정성이 크게 향상했다. 그리고 현재(약 6개월)까지 장애가 발생하고 있지 않다.
  33. 다시 작업을 진행 1. 업데이트 진행된 EC2를 접속 2. 사용했던

    라이브러리 전부 설치 3. FTP를 통해 다운로드 4. Layers 신규 생성하여, 라이브러리 파일(zip) 업로드 5. 테스트 6. 정상 동작 확인 완료 7. 모든 Lambda 에 Layers를 신규 버전으로 교체
  34. 정리 1. 동일한 라이브러리는 Layers 를 이용하면 여러 Lambda 재사용

    가능. 2. 하지만 Amazon Linux 가 버전업이 예정되어 있다면, 안전하게 테스트 진행 3. 분산처리의 방법은 자신에게 주어진 환경에 맞는 방법을 선택 (SNS 를 단독 사용하여도 좋고, SQS 를 섞어 사용해도 좋고…) 4. CloudWatch 를 이용하면 Lambda 를 예약작업으로 사용 가능 5. API Gateway 를 이용하면, 외부에서도 Lambda 를 실행 할 수 있음. 6. 다른 Cloud 서비스도 비슷한 것이 아주 많음. (예 Azure Function)
  35. 정리 1. 동일한 라이브러리는 Layers 를 이용하면 여러 Lambda 재사용

    가능. 2. 하지만 Amazon Linux 가 버전업이 예정되어 있다면, 안전하게 테스트 진행 3. 분산처리의 방법은 자신에게 주어진 환경에 맞는 방법을 선택 (SNS 를 단독 사용하여도 좋고, SQS 를 섞어 사용해도 좋고…) 4. CloudWatch 를 이용하면 Lambda 를 예약작업으로 사용 가능 5. API Gateway 를 이용하면, 외부에서도 Lambda 를 실행 할 수 있음. 6. 다른 Cloud 서비스도 비슷한 것이 아주 많음. (예 Azure Function) 사용한 서비스를 모두 자세히 설명할 수 없었습니다. AWS Documentation을 참고하세요!! (궁서체)
  36. 데모_ 관세환율 스크래핑 1. AWS Console을 이용하여 실행. 2~5. API

    Gateway로 처리, Lambda에서 데이터(날짜범위)값을 갖고 옴. 6~8. SNS를 통해 Invoke된 Lambda는 각각 할당 받은 만큼 처리한다. 9. 처리가 완료된 데이터는 DynamoDB로 저장한다.