인프라코스트(Infracost) 소개 및 사용 방법

TL;DR

테라폼 코드 기반 비용분석 오픈소스

  • CLI로 실행
  • GIT PR Comment
  • IDE integration

1. Intro

Infracost는 221011 AWSKRUG 컨테이너 소모임 meetup에서, 유정열(당근마켓, AWS Hero)님의 발표로 처음 접하게 되었다. 그 당시에는 ‘재밌는 오픈소스 프로젝트네~’하고 인지만 하고 넘어갔었다.

그 다음으로 Infracost를 인지하게 되었던 것은, 테라폼 클라우드를 공부하며 관련 기능 탐구하던 도중이였다. Terraform cloud에는 유료기능으로 Cost Estimation(비용 예측)을 제공하는데, 해당 기능이 Infracost 기반으로 작동한다.

‘유료 기능으로 제공될만큼 성능이 올라왔다고?’ 라는 생각이 들었고, ‘오픈소스기반이니 무료로 구성해서 쓰면 댕꿀이겠네!’하는 생각까지 했다. 머리숱이 위험하다.

Infracost는 미국의 유명한 스타트업 인큐베이팅&액셀러레이터인 ycombinator에서 2021년 겨울(W21) 지원을 받기 시작했다. 이쯤이면 알아볼만하지.

Ycombinator에서 조회한 Infracost (링크)

본 글에서는 Infracost의 소개 및 작동방식, 실제 구성해서 사용하는 데모(CLI / Github Action / VScode 연동)을 정리하고자한다.


2. What is Infracost?

Infracost shows cloud cost estimates for Terraform. It lets DevOps, SRE and engineers see a cost breakdown and understand costs before making changes, either in the terminal or pull requests.

Infracost는 Terraform을 위한 클라우드 비용 예측 도구입니다. 이 도구를 사용하면 DevOps, SRE 및 엔지니어가 터미널이나 풀 리퀘스트를 통해 변경 사항을 만들기 전에 비용 분석을 볼 수 있으며 비용을 이해할 수 있게 도와줍니다.

Infracost Github 소개 문구

공식 github의 소개 문구에서도 볼 수 있듯, terraform과 연동하여 클라우드 비용 예측 및 분석을 수행하는 도구이다.

주요 CSP(AWS, Azure, GCP)의 클라우드에 대한 분석을 지원하며, 다양한 CI/CD 도구들(GitHub, GitLab, Bitbucket, Azure Pipelines, Jenkins, circleci, Atlantis)과의 연동을 지원하고, Terraform 외의 다른 IaC 도구들(Cloudformation, Pulumi)들과의 연동 또한 계획되어있다.

기본사용을 위한 Free 요금제와 인당/월간 50$의 SaaS 서비스인 Infracost Cloud 요금제가 있다.

  • 기본 요금제는 오픈소스로 제공되며, 비용 분석 및 차이점, CI/CD 통합등과 같은 필수기능이 제공된다.
  • 구독 요금제에서는 SSO, 팀 권한 관리, JIRA연동, 비용 Dashboard, Policy 및 Guardrail 설정등이 추가로 제공된다.

자세한 소개는 공식홈페이지 참조 바람


3. How does it works?

기능은 좋지만, 비용에 관한 문제인만큼 어떻게 구현되는지가 궁금했다. plan결과를 어디로 들고가는건지? 별도로 저장이 되는건지? 클라우드 비용분석인만큼 뭔가 액세스키같은 보안 권한을 요구할지? 별도의 키를 전달하지 않는데, 어떻게 비용을 예측하는지?

한줄요약: 테라폼 구성코드에서 비용발생 요소만 추려서, 자체 비용 DB와 대조하여 월간 비용을 계산하여 제공

Infracost 서비스는 CLI와 백엔드의 Cloud Pricing API로 구성된다.

CLI를 실행한다면;

  1. 비용과 관련있는 파라미터추출
    – CLI는 Terraform HCL 코드를 파싱하여 인스턴스타입/디스크 사이즈 같은 비용관련 요소를 추출한다.
  2. Cloud Pricing API를 통한 가격 조회
    – CLI가 클라우드 가격API를 호출하여 추출된 비용 요소의 단위 가격을 응답받음.
    – Plan JSON파일 또는 클라우드 credential/secret 전송하지 않음
  3. 월간 비용 계산
    – 리턴받은 단위 가격을 사용해 월간 비용 계산. 표, JSON, Diff, PR, Slack등의 형태로 결과 출력가능.
  4. Infracost Cloud (유료기능)
    – 구독중이라면, 최종 비용 분석 JSON을 사용자 계정의 인프라코스트 대시보드로 전송하여 추가 사용 가능.
deployment_overview.png
Cloud Pricing API 아키텍쳐 (링크)

원문 또는 자세한 설명은 Infracost FAQ 문서 참고 바람


4. Demo

로컬 터미널에서의(cli) 사용 방법 / Github Action과 연동하여 PR시 커밋 메시지 연동 / VScode extension 사용 방법의 예시를 보여줄 것이다.

4.1. 사전 준비

기본적으로 인프라코스트에 가입하고, API 키를 발급받아야한다.

가입 및 API키 발급

가입 및 로그인은 https://www.infracost.io/의 우측 상단 Sign up/Log in을 눌러할 수 있다. 잘 할 수 있을것이라 믿는다.

로그인 후, 상단의 Org Settings를 클릭하여 API Key를 받을 수 있다. 키 영역을 클릭하면 실제 키를 볼수도 있으며, 우측 Copy 버튼을 통해 키 노출 없이 복사만 할수도 있다. 이건 좋은듯.

4.2. CLI 사용

전반적으로 공식문서의 Get Started 과정을 따라갈 것이다.

설치 및 구성 과정

Mac을 사용할 경우 brew를 통해 간단히 설치 할 수 있고, 명령어로 인증이 가능하다.

# 설치
brew install infracost

infracost --version # Should show 0.10.18

# API 키 인증
infracost auth login

# 키 정보는 ~/.config/infracost/credentials.yml에 저장된다.

다른 Linux 기반 배포판의 경우, 설치 스크립트를 통해 사용자의 OS/CPU을 자동으로 감지하여 설치하고 위치 또한 잡아준다. 편하다..

로컬 터미널에서 바로 실행하지않고, 가상환경의 Linux를 사용한다면 infracost auth login 명령어 사용시 웹 브라우저로 연결되지 않는다. 그런경우 아래의 cli 명령어로 인증할 수 있다.

# 설치
# Downloads the CLI based on your OS/arch and puts it in /usr/local/bin
curl -fsSL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh | sh

# API 키 인증
infracost auth login

# 별도 대시보드 접속 대신, cli로 인증 
infracost configure set api_key 위에서복사한API키

# CI/CD시 INFRACOST_API_KEY 환경 변수로 전달 가능

인증 과정 중에 infracost configure로 무엇을 더 설정할 수 있나 만져보다가 기본 통화옵션을 변경할 수 있는것을 보았다. 기본값은 USD지만, 이를 KRW로 변환하여 비용 예측값을 원화로 볼 수 있다. ISO 4217의 통화코드를 지원하며, 자세한 설명은 링크 참조. 사실 기준환율/기준시점은 어딘지 궁금하지만 일단 넘어간다.

# 출력 통화를 원화로 설정
infracost configure set currency KRW

# CI/CD시 INFRACOST_CURRENCY 환경 변수로 전달 가능

이후 비용을 계산할 샘플 코드를 다운로드한다.

# 현재 위치에 샘플코드 다운로드
git clone https://github.com/infracost/example-terraform

명령어 실행 및 결과

CLI 사용시 주로 사용할 명령어는 breakdown과 diff가 있다.

1) infracost breakdown

breakdown이라는 단어가 처음엔 생소했다. 기본적으로는 고장/장애라는 뜻이지만 단수로 명세서 라는 의미가 있었다. 그 뜻인듯 하다.

위에서 클론한 샘플코드의 디렉토리로 이동해 비용을 분석한다.

# 디렉토리 이동
cd example-terraform

# 현재 경로의 모든 비용 분석
infracost breakdown --path .
infracost breakdown –path . 결과

infracost breakdown 명령어에 다른 flag들을 던져서 활용할 수도 있다.

  • -h : 도움말 출력
  • -p : 분석할 경로 지정
  • –format : 결과 양식, 기본값은 table이며 json, table, html등
  • –terraform-var / –terraform-var-file : 테라폼 코드의 변수값 전달
# help 페이지
infracost breakdown -h

# 다른 디렉토리의 azure 코드 분석 결과를 json으로 출력
infracost breakdown -p ./azure --format json

# terraform plan 결과를 별도의 json으로 출력해서, 해당 파일 기반 breakdown
## 하지만 지금 예제에서는 사용불가..

# terraform plan -out tfplan.binary
# terraform show -json tfplan.binary > plan.json
# infracost breakdown --path plan.json

2) infracost diff

diff 명령어를 사용해서 현재 테라폼 구성파일의 비용 뿐만 아니라, 변동을 가했을때 이전/이후의 금액차이만을 볼 수도 있다.

# 변경 이전의 기준 분석 결과를 json파일로 저장
infracost breakdown --path . --format json --out-file infracost-base.json

# ec2의 인스턴스 타입, 디스크 유형 변경
# vi main.tf
# L11) instance_type = "m5.4xlarge" > instance_type = "t3.small"
# L19) volume_type = "io1" > volume_type = "gp2"

sed -i 's/m5.4xlarge/t3.small/g' ./main.tf
sed -i 's/io1/gp2/g' ./main.tf

# 기준 결과와 변경된 결과 출력
infracost diff --path . --compare-to infracost-base.json
infracost diff 결과. 항목별/전체 감소액을 볼 수 있다.

3) –usage-file

클라우드 환경에서 비용은 크게 두가지, 사용 시간에 따른 비용 부과 / 사용량에 따른 비용 부과 방식이 있다. 전자의 경우 EC2 등, 후자의 경우 Lambda 등이 해당한다.

기본적으로 infracost는 전자에 따른, 월간 사용시간에 따른 비용 산출을 제공한다. 그래서 처음에는 반쪽짜리 기능만 제공한다고 생각했는데, 또 옵션을 알아보던 도중 –usage-file을 통해 예상 사용량을 던져주면 사용량 기준 비용 또한 예측이 가능하다는 것을 알았다.

# with --usage-file 
infracost breakdown -p . --usage-file infracost-usage.yml
w/usage-file

현재 설정 가능한 사용량 입력 예시는 infracost github에서 찾아볼 수 있다. infracost/infracost-usage-example.yml,

4.3. Github Action 연동

Infracost를 CI/CD 환경에 덧붙여 활용할 수도 있다. 특히 GitOps 환경을 구현하여 인프라 관리를 git repo기반으로 수행할 경우, 별도의 Github Action을 붙여 인프라 환경에 대한 비용 가시성을 높일 수 있다.

아래의 예시를 사용하면, 해당 repo의 브랜치에서 main으로 PR을 생성할 경우, main 브랜치의 구성 파일과 pr브랜치의 구성파일의 차이를 diff 해서 차이를 pr comment로 달아준다.

예시 Github Action(이후 GHA) 코드를 사용해서 PR comment를 붙이는 과정을 소개할 것이며, GHA yaml 구성이나 기본 사용법은 알고있다고 가정한다.

작업한 예시는 https://github.com/nasir17git/logonme 블로그 레포 참조

구성 과정

1) Secrets로 key 및 환경 변수 값 생성

깃레포에서, Settings > Secrets and variables > Actions > New repository secret

name: INFRACOST_API_KEY / secret: API키입력

name: INFRACOST_CURRENCY / secret: KRW

2) .github/workflows/infracost.yml 생성

해당위치에, infracost GHA의 예시파일을 생성한다.

L18의 .jobs.infracost.env.TF_ROOT에 GHA가 작동할 working dir의 경로를 넣는다.

L80의 .jobs.infracost.steps.Post Infracost comment에서, behavior을 update에서 new로 변경하였다.

+ L19 .jobs.infracost.env에 INFRACOST_CURRENCY: ${{ secrets.INFRACOST_CURRENCY }} 로 넣어줘야 원화 출력이 가능할듯

3) branch 생성 후 코드를 변경하고 PR생성

PR을 생성하면 GHA가 작동하여 결과를 해당 PR의 코멘트로 달아준다.

사용 예시

PR 코멘트 예시

https://github.com/nasir17git/logonme/pull/3

4.4. VScode extension

Infracost는 VScode extension으로도 존재한다. 설치하면 테라폼코드 작성시 리소스/모듈별 예상 금액이나, 디렉토리내 구성파일들의 예상 비용등을 조회할 수 있다.

설치 과정

일반적인 VScode 확장프로그램 설치와 비슷하게, 마켓플레이스의 검색으로 설치하고 구성할 수 있다. 단순 설치과정은 extension 의 소개 페이지에 있으니 패스

사용 예시

1) terraform resouce/module 상단의 비용 예측

리소스 작성후 파일 저장시, 매 블럭마다 바로 긁어와서 달아준다.

소개 페이지의 해당기능 소개

모듈에도 적용가능하며, 해당 금액을 클릭시 어떤 리소스로 인해 해당 금액들이 발생하는지 상세내역 또한 볼 수 있다.

예상금액 클릭시

2) 디렉토리 내 예상 비용

설치후 좌측에 인프라코스트 로고가 생긴다. 해당 버튼을 누르면 열려있는 폴더 기준으로 하위디렉토리를 다 긁어서 어떤 비용이 발생하는지 볼 수 있다.


5. Outro

그래서 써요 안써요?

위에서 보듯이 CLI, CI/CD, IDE 각 환경에서 Infracost를 사용하는 기본 예시들을 살펴보았다. 개인적인 호기심 충족으로 써볼수는 있겠지만, 팀 차원에서 도입하는것 + 그 효용에 있어서는 아래와 같은 이유로 인해 의문이 들었다.

  1. Infracost을 어느 시점에서 적용할지
  2. 결국 예상 비용이 정확한지
  3. 회사의 terraform coverage가 얼마나 되는지
  4. 그래서 무엇이 바뀌는지?

다시말해서,

  1. Infracost를 어느 시점에서 적용할지
    – 코드 작성 도중(IDE) / 코드 작성 완료 후(CLI) / 팀 리뷰시(CI/CD)
    – 모든 단계에 넣는 것은 비효율적
  2. 결국 예상비용이 정확한지
    – (usage-file을 알기전) 사용 시간에 기반한 리소스 비용(EC2등)은 추산할 수 있으나 사용량에 기반한 리소스 비용은 계산할 수 없었다고 생각 > 반쪽짜리 예측
    – 과거 사용량 기반해서 넣어준다고해도, On-demand 요금제 기준임. Spot인스턴스나 RI/SP 적용된 할인금액 반영은 어려운듯하였다
  3. 회사의 terraform coverage가 얼마나 되는지
    – Infracost는 실제 CSP의 리소스가 아닌, 테라폼 구성코드내의 리소스만 분석한다.
    – 재사용성이 높고 통일성이 필요한 (EC2,SG,ALB 등) 리소스는 테라폼으로 커버하는것이 좋다
    – 그 반대의 리소스 (RDS,Lambda,Cloudfront)는 개별 특수성이 심해서 테라폼으로 관리하는것을 권장하지 않는다. 일부만 제외하고 예측하면 그 의미가..?
  4. 그래서 무엇이 바뀌는지?
    – 여기에서 나 자신을 설득하지 못하였다.
    – 아ㅋㅋ 그래서 뭐 어쩔껀데ㅋㅋ 그래서 안만들거야? 인스턴스 타입 줄일거야? 너가 뭘 할수 있는데 ㅋㅋㅋ
    – 유휴자원 분석이라면 모를까 단순 비용 예측으로는 의사 결정에 변화를 주기 힘들것이라고 생각하였음.

IDE와 CLI로 구성은 해놓았기 때문에 개인적으로는 가끔 사용하면서 비용적인 부분을 인지하는데 사용하고 있긴하다. 테라폼 작업 시 우리 회사 운영VPC의 인프라 규모가 이렇구나, 이번 신규 서비스를 위한 인프라 비용은 이정도구나하고 인지도는 올라가지만 업무 생산성/효율성에 있어서 어떤 도움이 되는지는 의문이 든다.

Actual Costs

결론들어서 겁나 까기만해서 다시 당근하나 놓고간다면

구독플랜 사용시 Actual Costs(실제 비용)이라는 서비스를 사용할 수 있다. 23년3월 현재 기준 private beta 서비스 단계로, 별도의 신청을 해야 사용 가능하다.

해당 서비스는 AWS CUR(Cost&usage Report, 비용 및 사용 보고서)를 기반으로 인프라코스트의 비용 전망을 향상할 수 있는 서비스이다.

테라폼 구성코드가 아닌 실제 비용 리포트를 기반으로 작동하니 리소스 추이 분석 및 예측 면에서도 발전이 있을것이라 생각한다.

하지만 또 가만 생각하면 액세스 키보다 더 중요하고 기밀자료인 실제 비용 보고서를 공유한다고? 그럴만한 회사가 있으려나? 싶기도 하다.. 뭐 정식버전 나와봐야 알 수 있을듯

Leave a Reply