[FinOps] 오픈소스 Bill bot 사용기 (슬랙으로 AWS비용 레포트 받는법)
IT/AWS

[FinOps] 오픈소스 Bill bot 사용기 (슬랙으로 AWS비용 레포트 받는법)

반응형

Bill bot 사용기

Intro

클라우드를 사용하면서 가장 궁금한것 중 하나가 바로 비용 입니다. 클라우드는 통신비처럼 매달 비용을 지불하게 되는데, 어떤 기준으로 가격이 책정되며 얼마인지 예상을 해보는게 기업입장에서는 가장 중요한 이슈겠죠. 기존의 일반적인 기업들은 인프라 장비를 구매 할때 TCO분석을 합니다. 3년 5년 길게는 10년 기준으로 계산하죠.
이 TCO기준으로 클라우드와 IDC간의 TCO분석도 하기도 합니다. 내가 10년동안 직접 장비를 소유했을때 비용과, 클라우드 서비스를 이용했을때 비용을 비교 해보면 대부분 클라우드가 비교적비쌉니다. 클라우드를 사용한다는 것은 그 비용안에 전기세, 장비 유지보수에 대한 인력비용 등등의 비용 개념이 더 들어가있기 때문이죠. 그래서 더 비쌀 수 밖에 없습니다. 그래서 aple to aple 비교 즉 정확한 비교는 불가하지만 장비를 구매하는 시간비용, 유지보수를 위한 인력 채용 비용 등등등 클라우드를 사용하면서 얻는 이점이 충분히 있습니다.
비용얘기가 너무 길어졌네요. 어쨌든 클라우드를 사용하면서 월마다 발생하는 비용이 새는곳은 없는지 감축할 수 있는 방안이 없을지 분석해보는 것이 매우 중요한 업무가 되었죠. 실제로 최근에 많은 기업들이 finops라는 직무로 사람을 채용해서 비용 분석, 자동화, 모니터링 등 비용관련된 직무를 채용하고 있습니다.

클라우드 비용 모니터링을 어떻게 해야할까?

이 비용 모니터링을 어떻게 할 수 있을까요? AWS계정이 여러개일 경우 통합으로 비용을 모니터링하기가 매우 어렵습니다. 어디에서 비용이 얼마나 나오고 있는지 눈으로 보기가 매우 힘이들죠. 대부분의 우리나라의 훌~륭한 클라우드 MSP기업들은 빌링 관리 웹콘솔을 제공합니다. 비용을 모니터링 하기위해서는 MSP업체에서 제공해주는 빌링콘솔을 이용하는것이 가장 쉬운 방법입니다. 물론 계약관계가 있어야겠죠.
하지만 클라우드 MSP기업들이 제공하는 서비스를 이용하는것 자체도 계약관계에 의해 비용이 들어갈 수 밖에 없습니다. 그 비용을 줄이기 위해서 자체적으로 빌링 콘솔을 구축하는것도 방법이 되겠습니다만, 인력 비용 시간을 고려하면 오늘 소개할 Bill bot이 정답이 될 수 있겠습니다.
서론이 무지 길었네요. 오늘 소개해드릴 것은 Bill bot이라는 오픈소스 솔루션 입니다.

Bill bot 이란?

비용 레포트를 매일, 매달 슬랙을 통해 레포트로 제공받을 수 있도록 만들어 놓은 오픈소스 솔루션입니다. 기여자는 독일출신의 AWS SA Christian Bonzelet , 스페인 출신의 개발자 Mauricio Klein 입니다. (지구에는 훌륭한 개발자가 많으네요 저는 아직 우물안의 개구리입니다. 저도 이런 오픈소스 기여자가 되어보고 싶네요! )
https://github.com/cremich/cdk-bill-bot

Bill bot아키텍처 설명

우선 S3에 CUR데이터를 쌓는게 핵심입니다. CUR은 AWS Cost and Usage Report의 약자로 비용 레포트를 의미합니다. 이렇게 S3에 저장해둔 CUR데이터를 Glue크롤러를 통해 크롤링을해서 Data catalog에 database를 생성/업데이트를 합니다.
여기 까지 AWS athena가 데이터를 쿼리할 수 있는 준비는 모두 끝났고, 이제 step function이 스케줄링된 시간에 의해서 동작을 하는데, 기본적으로 UTC기준 am8시로 설정이 되어있습니다. (한국시간으로는 pm 5시 입니다.)
step function은 아래와 같이 동작하는데요. 어제날짜를 계산해주는 람다 함수를 통해서 날짜를 가져오고 어제날짜의 빌링 데이터를 athena를 통해 query를 시작합니다. 쿼리 결과를 슬랙으로 보내주는 람다를 실행시켜서 슬랙으로 알람을 받을 수 있게 됩니다.

Bill bot 실제로 구축해보기

오픈소스 Bill bot을 구축하는건 비교적 간단 합니다. 훌륭한 개발 자 분들이 cloud formation으로 구성해놨기 때문에 슬랙 웹훅 URL만 입력하면 끝입니다. 정말 간단하죠? 또 CDK를 사용하고 계시다고 하면 CDK로도 배포할 수 있게 구성을 해놓았습니다. 저는 cloudformation으로 돌려봤고 간단히 구성할 수 있었습니다. 한가지 유의할점은 제공되는 템플릿은 모든 리소스가 버지니아 리전(us-east-1)에 생성되는 점인데요 그 이유는 s3에 쌓이는 CUR 데이터가 버지니아 리전에 쌓이기 때문입니다.
cloudformaiton은 아래 git url에서 launch stack 버튼으로 이동이 가능하고 URL은 아래와 같습니다.
https://github.com/cremich/cdk-bill-bot

어떻게 CUR 데이터가 S3에 쌓일까?

아키텍처상 다른 리소스들은 어느정도 이해가 되는데 어떻게 billing 레포트가 S3에 쌓이는건지가 궁금했습니다. s3에 아래와 같이 bucket policy를 설정하여 일,월간 비용 보고서를 받을 수 있게 됩니다.
https://docs.aws.amazon.com/ko_kr/cur/latest/userguide/cur-s3.html

  • s3 bucket policy설정
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "billingreports.amazonaws.com"
            },
            "Action": [
                "s3:GetBucketAcl",
                "s3:GetBucketPolicy"
            ],
            "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": "arn:aws:cur:us-east-1:${AccountId}:definition/*",
                    "aws:SourceAccount": "${AccountId}"
                }
            }
        },
        {
            "Sid": "Stmt1335892526596",
            "Effect": "Allow",
            "Principal": {
                "Service": "billingreports.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": "arn:aws:cur:us-east-1:${AccountId}:definition/*",
                    "aws:SourceAccount": "${AccountId}"
                }
            }
        }
    ]
}

실제로 아래와 같이 s3에 parquet 형태로 비용 레포트가 제공이 되는걸 확인할 수 있습니다.

흔히 아는 csv형태가 아닌 parquet 형태로 제공되는 이유는 cloudformation에서 AWS CUR 을 아래와 같이 설정하였기 때문이고, athena에서 parquet 형태로 쿼리가 가능하기 때문입니다.

"Type": "AWS::CUR::ReportDefinition",
   "Properties": {
    "Compression": "Parquet",
    "Format": "Parquet",
    "RefreshClosedReports": true,
    "ReportName": "billbotdefaultcostsreport8D835249",
    "ReportVersioning": "OVERWRITE_REPORT",
    "S3Bucket": {
     "Ref": "costsreportbucket6C1166F4"
    },
    "S3Prefix": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::AccountId"
       },
       "-cur"
      ]
     ]
    },
    "S3Region": "us-east-1",
    "TimeUnit": "HOURLY"
   },
   "Metadata": {
    "aws:cdk:path": "bill-bot-default/costs-report/report"
   }
  },

여기서 특이한점은 비용 레포트의 파일이 업데이트되는 시간이 정해진게 아니고 모두 다 다르다는 점입니다. 공식 문서를 보니 하루에 3번 업데이트 된다고 합니다. 실제 레포트 파일의 버저닝 정보를보면 3번이 아닌 경우도 있네요.
공식 문서에 “다른 AWS 서비스는 다른 시간에 사용량 기반 결제 정보를 제공하므로 특정 시간 또는 요일에 대한 업데이트가 다른 시간에 들어오는 것을 알 수 있습니다.” 라고 나온걸 보니 비용 업데이트는 딱히 정해진 시간은 없는 것 같습니다.

반응형