What's New

클라우드 비용 최적화 로드맵 #9 - FinOps 성숙 모델 5단계 따라가기

Super Engineer Choi 2024. 12. 24. 11:34

여는 말

안녕하세요. SK텔레콤 최준승입니다. 오늘은 비용 최적화 로드맵 9회차입니다. 이번 회차는 제목을 정하는데 시간이 오래 걸렸는데요. 고민 끝에 "FinOps 성숙 모델 5단계: Step-Up을 돕는 10가지 꿀팁들(부제)"로 제목을 지어봤습니다. 참고로 교육학에 나오는 매슬로우의 5단계 욕구 계층 이론을 읽다가 떠올린 제목인데요. FinOps 활동의 성숙도가 매슬로우의 이론처럼 명확히 구분되는 것은 아니지만 하위 단계가 어느 정도 밑받침되어야 상위 단계로 넘어갈 수 있는 특성은 비슷한 점이 있습니다. 오늘은 여러분이 FinOps 팀의 새로운 담당자가 되어 클라우드 비용을 최적화하는 여정을 함께 살펴보고, 중간중간 그 여정을 가속화할 수 있는 꿀팁 10가지를 섞어서 소개해 드리도록 하겠습니다. 이전 회차와 다르게 보조 그림 없이 텍스트 위주로 빠르게 전개하겠습니다.

1단계. 빌링 데이터 그대로 읽기

자, 여러분은 클라우드 운영팀의 엔지니어입니다. 담당 영역은 인프라 배포, 서비스 모니터링 및 장애 관리입니다. 클라우드 환경에서 비용이 얼마나 나오는지는 관심이 없습니다. 오로지 서비스가 정상적으로 배포되고 모든 모듈이 정상적으로 동작하고 있는 지에만 집중합니다.


시나브로 세월이 흘러 서비스의 규모도 점차 커지고 이를 관리하는 조직도 덩달아 확장되었습니다. 단위 팀의 역할은 더욱더 세분화되었고 이 과정에서 기존 운영팀 외에 플랫폼을 고도화하는 엔지니어링 팀과 비용을 관리하는 FinOps 팀이 새로 생겨났습니다. 여러분은 FinOps 팀에 새로 배치되었습니다. 클라우드 비용구조는 잘 모르는데 앞으로 역할을 잘할 수 있을지 걱정이네요. 새로운 세계로 적응이 필요한 시점입니다.

TIP-01 빌링 데이터에 빠르게 적응하는 법. 
Raw 레벨의 빌링 데이터는 매우 큰 사이즈이기 때문에 레코드 단위로 관찰해서는 비용 패턴을 파악하기 어렵습니다. 대신 묶어 보는 어떤 기준이 필요한데요. 제일 추천하는 구분 값은 세부 과금 항목입니다. AWS 환경의 경우 UsageType 항목으로 구분해서 보면 됩니다. 예를 들어 S3 서비스의 경우 Standard로 저장된 객체의 저장 요금이 하나의 UsageType, Get 계열 Request로 발생한 요청 요금이 하나의 UsageType입니다.
같은 과금 항목 내에서 특정 자원별 비용을 나눠서 보고 싶다면 2차 구분 값으로 Name 태그나 ResourceID 등을 활용하세요. 시간축으로도 묶어보는 기준이 필요한데요. 보통 월단위(Monthly)로 묶어 보는 게 일반적이고, 사용량이 등락하는 과금 항목은 일 단위(Daily)로 묶어서 추이를 관찰하는 것도 좋습니다. 
빌링 데이터에 익숙하지 않은 초기에는 각 과금 항목이 어떤 영역을 의미하는지 헷갈릴 수 있는데요. 1) 세부 과금 항목을 자세히 설명하는 공식 문서를 참고하거나 2) 빌링 데이터 내에서 단가를 설명하는 특정 필드를 적극적으로 활용하세요.

일단 여러분은 클라우드 비용 청구서부터 읽기 시작했습니다. 월별로 EC2 서비스 OOO$, S3 서비스 OOO$, RDS 서비스 OOO$ 형태로 개별 총액이 적혀 있네요. 이 정도 수준의 정보만으로는 어떤 항목에서 무엇을 얼마나 사용해서 비용이 나왔는지를 이해할 수 없었습니다. 좀 더 깊이 파보기로 합니다. 찾아보니 빌링 데이터라는 것이 있고 이 데이터를 다양한 기준으로 필터링해서 분석할 수 있다네요. 보름 정도 지나니 빌링 데이터의 각 필드가 뜻하는 바가 조금씩 보이기 시작했습니다.

 

한 달 정도 지나니 이제 빌링 데이터로부터 다양한 정보를 취할 수 있게 되었습니다. 세부 과금항목별로 저번달의 사용량(및 비용)이 어떻게 찍히고 있는지 볼 수 있게 되었습니다. 일별 비용 패턴을 분석해서 단위 비용이 늘어나고 있는지 줄어들고 있는지도 쉽게 관찰할 수 있었습니다.

TIP-02 빌링 데이터를 분석하는 데 어떤 툴을 사용하는 게 좋을까?
빌링 데이터 원본은 하나지만 해당 데이터를 분석할 때는 하나 이상의 툴을 복합적으로 활용할 수 있습니다. 여기서는 일반적으로 사용하는 툴의 종류와 장단점을 짧게 언급하겠습니다. 

첫 번째는 CSP 자체적으로 제공하는 툴로 AWS에는 Cost Explorer가 있습니다. 가장 정석적으로 빌링 데이터를 볼 수 있는 툴이고요. 고급 분석까지는 어렵지만 초중급 수준에서 현재 비용을 파악하기엔 가장 적합한 툴입니다. 데이터 프로세싱 시점이 다른 툴에 비해 빠른 편이라 최신 비용을 확인하기에도 적합합니다. 

두 번째는 MSP가 제공하는 툴입니다. 보통 CMP(Cloud Management Platform) 내에서 비용에 포커싱 된 분석 기능을 제공하는 경우가 많고요. 사용자가 비용 패턴을 파악하기 쉽도록 각종 시각화 템플릿을 부가적으로 제공합니다. 비용 알람 등 사용자 편의 기능도 풍부한 편입니다. 툴에 따라서 복수의 CSP 비용도 통합하여 보여줄 수 있기 때문에 사용 편의성 측면에서는 제일 편리한 방법이고요. 단점이 있다면 빌링 데이터를 1차 가공해서 보여주는 경우가 많아서 사용자가 가공 기준을 정확히 이해하지 못하면 의도치 않은 왜곡이 생길 수도 있습니다. 또한 프로세싱에 소요되는 시간만큼 최신 비용 확인이 늦을 수 있습니다. 

이외에도 AWS의 CUDOS Dashboard처럼 CSP에서 특수 목적으로 구현해놓은 템플릿을 활용할 수도 있고요. Excel이나 Tableau 같은 외부 분석 툴을 사용할 수도 있습니다. 외부 분석 툴을 사용하게 되면 분석 관점에서 커스텀의 폭이 가장 넓은 것이 장점이지만 Raw 데이터를 Export 하는 과정에서 추가 비용이 발생할 수도 있습니다.

이제 빌링 데이터 자체가 의미하는 바는 50% 이상 이해할 수 있게 되었습니다. 현재의 비용 패턴을 내가 원하는 항목별로 분석할 수 있게 되었습니다. 하지만 이것은 현황을 이해하는 수준일 뿐 뭔가 새로운 개선점을 기획하기에는 부족한 수준임을 깨달았습니다. 빌링 데이터에 등장하는 수많은 변수들을 어떻게 조절해야 할지를 검토하려면 과금 정책에 대한 더 깊은 이해가 필요한 상황입니다.

2단계. 현재 비용을 완벽하게 이해하기

현재 클라우드 환경의 비용을 복합적으로 이해하기 위해서는 다양한 영역의 지식이 필요합니다. 먼저 자원 관점에서 어떤 서비스에 어떤 단위 자원이 있고 어떤 형태로 얽혀있는지에 대한 인사이트가 필요한데요. 여러분은 이미 운영팀으로 일해왔다는 콘셉트기 때문에 이 부분은 비교적 잘 알고 있었습니다. 그리고 FinOps 팀으로 배치된 이후에 앞서 1단계 작업을 거쳐 빌링 데이터 자체의 의미도 상당 부분 이해할 수 있게 되었고요. 여기서 한 가지 영역만 더 결합되면 비용을 완벽하게 이해할 수 있을 것 같은데요. 그것이 무엇일까요? 네, 맞습니다. CSP가 수립해 놓은 과금 정책입니다. 여러분은 과금 정책을 학습하기 위해 공식 문서의 요금 페이지를 읽기 시작합니다. 요금 페이지는 보통 서비스별로 나눠져 있어서 자주 사용하는 서비스 20개 정도의 페이지를 정독하는데 보름 정도의 시간이 걸렸습니다.

TIP-03 요금 페이지를 영리하게 활용하는 법.
서비스별 최신 과금 정책을 이해하는 데 있어 요금 페이지는 일종의 교과서에 가깝습니다. 서비스별 요금 페이지에는 세부 과금 항목별 단가, 과금 적용 시 특이사항, 시뮬레이션 예시 등의 정보가 순서대로 정리되어 있는데요. 처음에는 이 내용을 처음부터 끝까지 정독해 보기를 추천합니다. 

그리고 어느 정도 전체적인 과금 구조가 이해되고 나면, 그다음 단계로 과금 시 특이사항(보통 작은 글씨의 주석으로 처리된)을 주의 깊게 읽어보는 것이 좋습니다. 예를 들어 사용량 산정 시 최솟값이 정의되어 있거나, 특정 타입 사용 시 최소 과금 기간이 있다거나 하는 것들은 보통 해당 영역에 기재되어 있는 경우가 많습니다. 

요금표에 정리되어 있는 시뮬레이션 예시는 CSP가 제공하는 요금 계산기 페이지를 통해 검증해 보는 것도 좋습니다. 요금 계산기 페이지를 직접 사용해 보면 어떤 사용량 항목을 입력해야 하는지, 그 값이 바뀌었을 때 어떤 식으로 요금이 산출되는지를 명료하게 알 수 있습니다. 

요금 페이지에 등장하는 용어가 정확하게 이해되지 않을 때는 공식 기술문서 페이지를 번갈아 보는 것이 좋습니다. 제공하는 서비스 또는 지원하는 세부 유형을 리전 별로 확인하는 용도로 요금 페이지를 활용할 수도 있습니다. 예를 들어 m7i.large 유형의 EC2 인스턴스 타입을 서울 리전에서 제공하는지 확인하고 싶을 때, EC2 요금 페이지의 서울 리전 항목에 m7i.large 항목이 있으면 지원(없으면 미지원)인 셈입니다.

한 달 정도 지나니 이제 서비스 자원을 어떻게 구성하면 과금 정책이라는 여과지를 거쳐 어떤 식으로 최종 비용이 발생하는지 이해할 수 있게 되었습니다. 과금 정책을 공부해 보니 각 서비스별로 과금하는 방식이 크게 다르다는 사실도 알게 되었습니다. 특히 서비스 자원이 새로 생성되거나 변경/삭제되는 시점이 있을 때마다 해당 시점 전후로 빌링 데이터를 비교해 보는 것이 큰 도움이 되었습니다. 다른 말로 내가 어떤 자원을 조정했을 때 향후 비용이 어떻게 달라질지에 대한 예측도 어느 정도 가능해진 셈입니다.

TIP-04 과금 정책의 정확한 이해가 왜 중요할까?
보통 클라우드의 단위 비용은 단가 x 사용량으로 계산합니다. 그럼 비용을 최적화하려면 단가 또는 사용량을 줄이면 되겠네요? 맞습니다. 하지만 그 전략을 짜기에 앞서 해당 서비스의 과금 정책을 반드시 정확하게 이해하고 넘어가야 합니다. 

일례로 단위 비용을 계산할 때 사용량을 어떤 기준으로 측정하는지를 알아야 하는데요. 어떤 네트워크 자원이 하나 있다고 가정해 봅시다. 이 자원이 생성된 시점부터 삭제되기 전까지의 시간을 사용량으로 측정하는지, 아님 연동 자원이 매핑된 상태의 지속 시간을 측정하는지를 알아야 합니다. 해당 자원을 경유하는 네트워크 처리량이 사용량이 될 수도 있습니다. 사용량 단위에 최솟값이 있을 수도 있고 특정 조건에서 무료 사용량으로 분리될 수도 있습니다. 

핵심은 이런 부대조건을 종합적으로 감안하여 실제 과금에 영향을 끼치는 영역의 단가나 사용량을 최적화해야 한다는 것입니다. 이런 성격의 작업을 정교하게 설계하려면 과금 정책의 이해뿐만 아니라 각 서비스의 특성이나 단위 자원의 관계 또한 명확히 이해하고 있어야 합니다.

이제 비용 가시성 확보라는 1차 과제를 어느 정도 완수한 느낌이 듭니다. 서비스별로 어떤 비용 최적화 기법이 있는지도 찾아보기 시작했습니다. 현재 구성과 비교해 보니 어떤 부분은 최적화할만한 여지가 별로 없어 보이는 반면, 어떤 부분은 절반 이상의 비용을 줄일 수 있을 것 같습니다. 전에는 관심이 없어서 몰랐었는데 CSP에서는 이미 Cost Optimization과 관련된 다양한 추천 정보를 제공하고 있었네요. MSP가 제공하는 CMP에서도 비용 최적화 포인트를 다양하게 추천해 주고 있었습니다.


새해가 밝아 FinOps 팀의 KPI를 수립하기 시작했습니다. 올해 FinOps 팀의 KPI 중 하나는 클라우드 비용 10% 절감입니다. 물론 다른 가치(가용성, 보안, 성능 등)을 훼손하는 것은 안됩니다. 따라서 단순히 비용을 절감하는 관점이 아니라 클라우드를 활용하는 전반적인 성숙도를 개선하고 그 과정에서 비용도 함께 최적화할 수 있는 방법을 찾아보라고 합니다. 그런 방법 중에 어떤 것부터 시작하는 게 좋을지 고민해야 할 시점입니다.

3단계. 서비스 영향도 없이 최적화하기

여러분은 먼저 단위 서비스별 비용을 검토하기 시작했습니다. 아무래도 모수가 커야 최적화 시 절감비용도 커질 테니 전체 비용에서 차지하는 비율이 높은 서비스가 선순위 대상입니다. 몇 가지 서비스를 우선순위에 올려놓고 이번에는 해당 서비스 내에서 상세 과금 항목별로 분석하기 시작했습니다. 비용 패턴을 분석하고 어떤 리소스로부터 과금되고 있는지도 순서대로 확인을 마쳤습니다. 일부는 현재 사용 중이 아닌 불필요한 자원도 보이네요.


이제 어떤 영역부터 최적화를 시작해야 할지 결정해야 할 시점입니다. 아무래도 개선 활동이 처음이다 보니 워크 로드에 부정적인 영향을 주지 않았으면 좋겠는데요. 비용을 최적화하려면 어떤 자원의 변경이나 재구성이 필연적일 것이고, 그런 작업이 필수라면 서비스에 영향을 끼칠 확률을 배제할 수 없겠죠. 이때 같은 팀의 박 씨가 힌트를 주고 지나갑니다. 자원을 건드리지 않고도 비용을 줄일 수 있는 방법이 많다던데? 약정부터 한번 검토해 보는 게 어때?

TIP-05 약정을 알차게 뽑아먹는 법
약정 프로그램은 간단한 물량 계약으로 비용을 줄일 수 있는 효과적인 전략입니다. 처음 약정을 도입할 때는 약정이 가진 리스크를 최소화하는 것이 가장 중요한데요. 여기서 말하는 대표적인 리스크는 구매한 약정이 On-Demand 사용분에 매칭되지 않는 것입니다. 우선 전체적인 할인율이 좀 낮더라도 초기 약정 물량은 보수적으로 산정하는 것이 좋습니다. 약정 이후에 On-Demand 사용량이 축소될 수 있기 때문입니다. 

약정 기간도 장기 상품(3년)보다는 단기 상품(1년) 위주로 구매하는 것이 좋습니다. 전체 물량을 한 번에 구매하지 않고 월별로 나눠서 구매하여 순차적으로 일몰 되도록 하는 것도 리스크를 분산시키는 효과적인 전략입니다. 

약정 상품 내에서도 On-Demand에 적용되는 범위가 다른 상품들이 있는데요. 약정이 적용되는 범위(특정 인스턴스 타입, 특정 AZ 등)가 고정된 상품의 할인율이 일반적으로 더 높습니다. 이때 상대적으로 할인율이 좀 낮더라도 적용 범위가 탄력적인 상품을 구매하는 것이 좋습니다. 

마지막으로 On-Demand 비용과 약정 적용 시 비용을 월별로 비교하여 BEP(손익분기점)을 계산해 보는 것도 좋은 전략입니다. 예를 들어 1년 약정 구매 시 4개월이 경과된 시점부터는 무조건 On-Demand보다 약정이 싸다면, 4개월 이상 반드시 쓰는 자원에 대해서는 리스크 없이 약정을 구매할 수 있습니다.

박 씨가 알려준 대로 CSP는 약정 프로그램을 풍부하게 제공하고 있었습니다. 서비스별로 제공하는 약정 상품의 종류와 할인율이 달랐습니다. 약정이 On-Demand에 적용되지 않으면 그냥 버려진다는 사실도 알게 되었습니다. 현재 On-Demand의 사용량이 앞으로 어떻게 달라질지 모르니, 우선 몇몇 서비스를 기준으로 현재 On-Demand 사용량의 70%를 커버하도록 약정 물량을 계산해 놓았습니다. CSP나 MSP가 제공하는 약정 추천 기능도 보조 지표로 참고했습니다.


약정을 구매하는 과정은 어렵지 않았습니다. 특정 서비스에 약정을 구매하고 1개월 후에 월비용을 비교해 보았더니 지난달에 비해 약 20%의 비용이 줄어들었습니다. 앞으로도 On-Demand 사용량이 비슷하다면 절감 효과는 약정이 만료되는 시점까지 지속될 예정입니다. 서비스에 영향을 주지 않고 이렇게 쉽게 비용을 최적화할 수 있다니 놀라울 따름입니다. 이때 같은 팀의 정 씨가 또 힌트를 주고 지나갑니다. 어떤 서비스는 과금 방식만 살짝 바꿔서 비용을 줄이는 방법도 있다던데?

TIP-06 자원 특성의 변경 없이 과금 방식만 달라지는 영역이 정말 있을까?
네, 있습니다. 여기서 과금 방식만 달라진다는 의미는 자원 특성의 변경 없이 비용을 산출하는 함수만 달라진다는 뜻입니다. 예를 들어 AWS의 S3 서비스에서 객체를 저장할 때 Standard와 Standard-IA 계층이 있다면 이것은 단가도 다르지만 성능 특성 및 제약 사항도 다릅니다. 따라서 이런 케이스는 오늘 설명하려는 영역이 아니고요. 

반면 DynamoDB 서비스에도 테이블 계층이라는 개념이 있는데요. 테이블 단위로 Standard 또는 Standard-IA 계층 중 하나를 선택할 수 있고 선택 여부에 따라 각기 다른 비용 함수가 적용됩니다. 테이블의 성능, 내구성, 가용성은 두 계층이 완전 동일합니다. Standard 계층의 테이블은 상대적으로 읽기/쓰기 단가가 싸고 저장 단가가 비쌉니다. 반대로 Standard-IA 계층의 테이블은 읽기/쓰기 단가가 비싸고 저장 단가가 쌉니다. 따라서 읽기/쓰기 사용량이 많지 않고 저장하는 데이터량이 큰 테이블은 Standard-IA 계층을 사용하는 것이 유리합니다. 최적화 과정에서 계층을 실시간으로 변경할 때도 서비스 영향도가 없다는 것이 장점입니다. 

AWS 환경의 경우 비슷한 케이스가 몇 개 더 있는데요. Aurora의 스토리지 요금 옵션(Standard, I/O-Optimized)이나 CloudTrail Lake의 요금 옵션(1-year Retention vs 7-year Retention)도 기능 특성은 유지한 상태에서 과금 방식만 선택적으로 변경할 수 있습니다. 다만 변경 횟수가 기간별로 제한되어 있거나 일방향(one-way)으로만 가능한(=비가역적인) 경우도 있어 주의해야 합니다.

마침 Aurora 비용을 모니터링하던 중에 스토리지의 I/O 비용이 비정상적으로 높은 클러스터를 발견했습니다. 그리고 비용을 시뮬레이션 해본 후 해당 클러스터의 요금 옵션을 Standard에서 I/O-Optimized로 변경했습니다. 변경 과정에서 특이사항은 없었습니다. 클러스터 노드 비용과 스토리지 저장 비용은 약간 상승했지만 그 이상의 스토리지 I/O 비용이 줄어들면서 전체적인 Aurora 비용을 30%가량 절감할 수 있었습니다.


비용 최적화 활동을 방망이 깎는 일에 비유한다면 이제 가장 바깥쪽의 껍데기는 어느 정도 정리한 느낌입니다. 방망이의 코어에 가까이 가지 않고서는 더 이상의 개선 활동이 어려울 것 같은데요. 이제 실제 서비스 자원 단위로 조정 작업을 계획하고 상응하는 리스크를 짊어지면서 일을 진행해야 할 시점입니다. 순서는 어떻게 정해야 할까요? 상대적으로 쉽고, 기대 효과가 크며, 영향도가 적은 것부터 시작하면 됩니다.

4단계. 쉬운 영역부터 순차적으로 공략하기

이제 드디어 서비스 컴포넌트를 구성하는 자원까지 손을 대야 하는 시점이 왔습니다. 무엇을 가장 먼저 시작할까 고민하다가 마치 집을 청소하듯이 미사용 자원을 정리하는 작업부터 시작하기로 합니다. 클라우드 환경에 서비스를 처음 구축하고 4년 정도 되니 정체를 알 수 없는 자원들이 마구 섞여 있는데 어디에서부터 손을 대야 할지 모르겠습니다. 태그 정책도 최근에 수립한지라 태깅이 되어 있지 않은 자원도 많은 상황입니다.

TIP-07 미사용 자원을 빠르게 찾아내는 법
일반적인 최적화 전략은 단가 또는 사용량을 낮추기 위한 방법을 찾습니다. 반면 미사용 자원은 확인 후 삭제 시 사용량을 0으로 만들기 때문에 효과가 즉각적이고 최적화 효율도 좋습니다. 문제는 "특정 자원이 미사용 자원임을 확신할 수 있느냐"인데요. 수많은 사용자(+자동화된 도구)가 제어하는 공용 환경에서 "이 자원 쓰고 있는 거 정말 맞아요?"라고 일일이 확인하는 것은 불가능합니다. 

따라서 데이터 기반으로 미사용 자원을 찾고 검증하는 과정이 필요한데요. 1차 선정 기준으로 빌링 데이터를 활용하는 것도 좋은 방법입니다. 특히 네트워크 속성의 미사용 자원을 찾는데 효과적인데요. 예를 들어 AWS 환경에서 NAT Gateway의 시간 비용은 지속적으로 발생하는데, 처리 비용(통과하는 네트워크 사용량)이 일정 기간(1개월 이상) 부과되지 않는다면 미사용 자원임을 의심할 수 있습니다. 

그리고 2차 검증으로 해당 NAT Gateway를 목적지로 라우팅 처리된 규칙이 없는 건지, 아님 규칙은 있는데 다른 사유가 있는지 등을 확인해 최종적으로 미사용 자원임을 판단할 수 있습니다. 미사용 자원을 빠르게 찾아내는 것이 중요한 이유는 이 최적화 활동이 주기적으로 반복되는 속성의 작업이기 때문입니다.

각 서비스별로 미사용 자원을 판단하는 기준을 세우고, 해당 기준에 부합하는 자원들을 순차적으로 삭제하는 일에 착수했습니다. 1차 식별된 미사용 자원 목록은 위키에 공지하고 별도의 피드백이 없는 경우 1개월 후에 삭제를 진행하였습니다. 삭제 시 생길 수 있는 기타 이슈는 담당 임원이 책임지기로 했습니다. 노드에 붙어있지 않은 블록 스토리지나 NIC에 붙어있지 않은 IP 주소 자원부터 정리를 시작했습니다. 이어 불필요하거나 중복 데이터를 담고 있는 스토리지까지 정리하고 나니 월 8,300$가량의 비용을 줄일 수 있었습니다. 이후의 관리를 위해 태깅 정책을 강화하여, 특정 태그를 지정하지 않으면 자원을 생성하지 못하도록 강제하였습니다.

TIP-08 경험상 최적화 효율이 좋은 영역을 추천한다면?
최적화 활동에 시간과 인력을 투자하는 것도 비용입니다. 따라서 투입하는 비용은 적을수록, 회수하는(절감되는) 비용은 크면 클수록 좋습니다. ROI 같은 비율 개념으로 접근하는 것도 좋습니다. 가끔 보면 비용 최적화를 할 때는 반드시 높은 수준의 기술적인 작업이 동반되어야 한다고 생각하는 분들이 있는데요. 물론 일리가 있는 의견이지만 ROI를 계산해 보면 I값(위험 비용 포함)이 너무 큰 과제들은 작업 순서가 후순위로 밀리는 경우가 많습니다. 비용을 깎아내는 더 쉽고 빠른 방법이 있다면 (비록 멋은 없더라도) 일단 그것부터 순차적으로 정리해 놓고 더 이상 깎아낼 것이 없을 때 더 높은 난이도의 작업에 도전하는 것이 바람직합니다. 

여기서는 비교적 서비스 영향도는 낮고 비용 민감도가 높은 영역을 몇 가지 추천해 드리겠습니다. 먼저 컴퓨팅 영역은 스케줄링의 가성비가 좋습니다. 먼저 단일 노드를 기준으로 반드시 24시간 기동할 필요 없는 것들을 서비스별로 찾아서 스케줄링을 걸어보세요. 스토리지 영역은 수명주기 관리가 핵심입니다. 특히 백업이나 로그처럼 지속적으로 생성되는 데이터에는 반드시 자동화된 방식으로 수명 주기를 관리하세요. 네트워크 영역은 클라우드 환경 내부에서 인터넷 구간으로 나가는 트래픽을 최소화해보세요. 그것을 도와주는 다양한 기능과 수법이 이미 마련되어 있습니다.

미사용 자원을 정리하는 작업 외에도 가성비가 좋은 과제들을 위주로 다양한 최적화 활동을 수행했습니다. 서비스 및 단위 자원별로 최근 사용률을 모니터링하여 노드의 Right-Sizing을 수행하기도 하고, 일부 데이터는 아카이빙 계층으로 이동하여 스토리지의 저장 비용을 낮췄습니다. 전체적인 구성의 틀을 바꾸지 않는 범위 내에서 적용 가능한 최적화 활동은 대부분 수행한 것 같습니다. 이 작업에 꼬박 4개월이 걸렸습니다. 이제 그다음엔 무엇을 해야 할까요?

5단계. 최적화 활동을 반복 설계하기

지금까지 많은 일들이 있었습니다. 우선 비용 가시성을 확보할 수 있게 되었고, 큰 영향도 없이 몇몇 최적화 과제를 완수했습니다. 연초 대비 월비용은 15~20%가량 줄어들었고 목표했던 10% 절감 목표는 이미 초과 달성한 상태입니다. 이제 남은 건 어려운 난이도의 과제들인데요. 일부는 애플리케이션 레벨의 튜닝이나 인프라 구성 변경을 동반해야 하는 작업들입니다. 단위 과제를 목록화하고 기술적 난이도와 함께 비용 기대효과를 종합적으로 고려하여 우선순위를 정했습니다. 하나당 보통 3-4개월이 소요되는 긴 호흡의 과제들입니다.

TIP-09 복잡도가 높은 환경에서 새롭게 등장하는 숙제들
예를 들어 AWS 환경에서 하나의 AWS Account로 하나의 구글 앱 서비스를 제공한다고 생각해 봅시다. 비용을 관리하고 통제하는 관점에서는 가장 쉬운 단계입니다. 시간이 지나 제공하는 구글 앱 서비스가 3개로 늘었습니다. AWS Account 환경도 구글 앱 서비스별로 1개에서 3개(개발/검증/운영)로 분리되었습니다. 눈을 떠보니 AWS Account 수는 9개가 되었고, 일부 DB 정보는 공유하며, 사설 네트워크도 다양하게 얽혀서 연동되어 있네요. 

보통 이렇게 구성의 복잡도가 높아질수록 비용을 관리하는 난이도도 함께 높아지는데요. 예를 들어 "공용 네트워크 자원에서 발생하는 비용을 어떤 기준으로 배분할지" 같은 숙제가 새롭게 생겨날 수 있습니다. 백업이나 로그같이 비용에 큰 영향을 주는 사용자 정책도 환경별로 일관성 있게 배포하고 통제할 수 있어야 합니다. 더불어 보안 모듈이나 인증서 / 라이선스처럼 개별 구성하면 n 배로 비용이 불어나는 계층은 자원 공유를 통해 중복을 최소화할 수 있는 포인트가 있는지도 검토할 수 있습니다.

몇몇 우선 과제를 선정하여 1년간에 걸쳐 최적화 작업을 진행하였습니다. 특정 DB는 튜닝을 통해 쿼리 효율을 높여 자원 사용률을 낮췄습니다. DB 클러스터 스펙을 반으로 줄여 노드 비용을 40%가량 줄었습니다. 애플리케이션 레벨에서도 특정 자원을 길게 붙잡고 있는 로직을 수정하여 연관 서비스의 비용을 줄였습니다. 워크플로우를 병렬처리 방식으로 변경하고 투입되는 노드를 동적으로 구성하여 인프라 효율을 개선하였습니다. 불필요하게 나눠져 있던 클러스터를 통합하고 관리 포인트를 최소화하였습니다.


이 지난한 작업을 통해 월 비용을 10%가량 더 줄일 수 있었습니다. 다만 이 수준의 최적화 작업에는 오랜 시간과 유료 컨설팅, 그리고 조직간 광범위한 협업 등이 필요했습니다. 이 모든 투입 요소가 비용이었습니다. 물론 길게 보면 투자 대비 회수하는 금액이 더 크겠지만, 그 과정의 위험 비용을 포함하면 단기적으로는 쉽지 않은 여정이었습니다.

TIP-10 비용 최적화 활동은 왜 반복해야 할까?
비용 최적화 활동을 수레바퀴처럼 반복해야 하는 이유는 클라우드 환경이 매우 동적으로 움직이기 때문입니다. 클라우드 환경에 구성된 단위 자원들은 끊임없이 생성/변경/삭제되고 해당 자원들의 라이프 사이클에 맞춰 비용도 등락을 반복합니다. 자원의 사용률(컴퓨팅 노드의 CPU, Memory 등)도 사용 패턴에 따라 달라지고 일부는 스케일링되어 확장/축소됩니다. 

결국 지난달과 이번 달의 비용 구성은 매번 다를 수밖에 없고 클라우드의 동적인 환경을 제한할 수도 없기 때문에 비용 모니터링은 반복적으로 후행해야 합니다. 동적 스케일링을 구현할 수 없는 자원은 최근 사용률에 맞춰 주기적으로 Right-Sizing을 해야 합니다. 스케일링이 구현된 자원도 전체 효율을 극대화하기 위해 unit 스펙을 조정할 수도 있습니다. 

이 모든 활동은 지속적으로 관찰하고, 테스트하고, 적용하고, 다시 관찰하는 일의 반복입니다. 따라서 비용 최적화는 반복적이고, 반복해야만 합니다. 더불어 이 최적화 활동에 투입하는 인력도 일종의 관리 비용이므로 일부 영역부터 순차적으로 자동화하거나, 구성 표준화 등을 통해 관리 포인트를 최소화할 필요가 있습니다.

1년 반의 최적화 작업이 끝나고 기존 월비용의 25~30%의 금액이 최적화 과정에서 사라졌습니다. 정량적으로 측정되는 효과 외에도 전사적으로 엔지니어의 역량 수준도 크게 개선되었습니다. 어느덧 비용을 의식한 아키텍처링이 표준으로 자리 잡았고 그 과정에서 각종 절감 아이디어를 수집하고 협업하는 문화도 개선되었습니다. 클라우드 환경에 새로 구축되는 서비스들도 표준 최적화 지침에 맞게 비용 효율적으로 설계되었습니다.

마치며

정리하겠습니다. 오늘은 FinOps 성숙 모델 5단계를 시간순으로 살펴보았는데요. 사실 오늘 9회차 이야기는 1회차부터 8회차까지 다뤘던 내용의 요약본이었습니다. 같은 글감을 바탕으로 FinOps 담당자가 레벨 업 하는 과정을 시간순으로 재구성한 내용이었고요. 어찌 보면 제가 FinOps 바닥에서 겪었던 시행착오의 기억이기도 합니다.


다음 10회차는 비용 최적화 로드맵의 종점 회차입니다. 먼저 지난 1년간의 내용을 한번 쭉 되돌아보고요. 그동안 딱히 끼워 넣을 자리가 없어서 넣지 못했던 최적화 기법들도 언급해 보려고 합니다. 그리고 비용 최적화를 함에 있어 결국 무엇이 핵심인지를 최종 정리하고 마치도록 하겠습니다. 다음 회차에서 뵙겠습니다. 끝.

 

▶ 더 읽어보기

 

 

▶ 최준승 님 / Cloud Architect 팀 / jsch@sk.com