몇 달 전에, 다른 AWS Reseller를 이용하는 고객사에서 OpsNow 사용 문의가 왔습니다. 기존 Reseller를 유지하면서 OpsNow를 사용할 때, 약간의 어려움이 있습니다. 아시는 바와 같이 OpsNow를 사용하려면, Cloud Service Provider에서 제공하는 사용 비용과 사용 자원 정보를 수집해야 합니다.

자원 정보는 IAM 정보만으로 수집이 가능한데, 비용 정보는 대부분의 경우 Reseller가 보유한 지급인 계정 (Payer Account)에 고객사의 계정이 연결 계정 (Linked Account)으로 등록이 되기 때문에 Reseller에서 비용정보를 공유해 주어야 OpsNow에서 비용정보를 수집할 수 있습니다.

Reseller에서는 CUR 데이터에 포함되는 단가 노출을 이유로 비용 데이터를 외부에 제공하기 꺼려합니다. 하지만 고객 입장에서는 본인들의 데이터를 공유해 달라고 요청할 권리가 있으므로 Reseller에서도 원가 정보를 제외한 데이터를 제공해야 할 의무가 있게 됩니다. 결국, 고객의 요청에 따라 Reseller에서는 AWS에서 제공하는 원본 CUR이 아닌 별도의 파일을 CUR과 유사한 형태로 만들어서 OpsNow에 제공하였습니다.

요약

결론부터 말씀드리자면,

  • CUR 데이터에서 최대한 많은 컬럼을 제공받으세요.
  • S3의 데이터 적재 구조를 바로 다음에 설명할 글처럼 맞춰주세요.
  • 언제든지 OpsNow에 계정을 등록해서 Cost 정보도 이용이 가능합니다!

데이터 수집의 Customize

고객사가 이렇게 힘들게 데이터를 받아 왔는데, 그러면 OpsNow에서도 당연히 이러한 데이터를 수집할 수 있는 파이프라인을 제공해야 하겠지요? 그래서 다음과 같은 형태로 S3에 데이터를 적재해달라고 요청하였습니다. 사실, AWS의 CUR 데이터가 적재되는 형태와 완전히 동일하면 좋겠지만… 생각보다 어려운 일이더군요.

  • S3에서 Prefix는 yyyyMM으로 구분
  • 폴더 안에 하나의 혹은 여러 개의 csv.gz 데이터 제공
  • 순수 gzip 압축

이렇게 제공된 데이터는 다음과 같은 트리를 가집니다.

202010/
|-- ***_202010_001.csv.gz
|-- ***_202010_002.csv.gz
|-- ***_202010_003.csv.gz
|-- ***_202010_004.csv.gz
|-- ***_202010_005.csv.gz
|-- ***_202010_006.csv.gz
|-- ***_202010_007.csv.gz
`-- ***_202010_008.csv.gz
202011/
|-- ***_202011_001.csv.gz
|-- ***_202011_002.csv.gz
|-- ***_202011_003.csv.gz
`-- ***_202011_004.csv.gz
Code language: Bash (bash)

이제, 이렇게 구조가 갖추어진 S3에서 데이터를 수집하는 파이프라인을 구축합니다. OpsNow에서는 수집할 파일 목록을 생성하는 get_metadata 함수와 제공된 파일 목록을 병렬 수집하는 get_cur_file 함수가 존재합니다.

get_metadata 함수는 AWS의 CUR 구조에서 발생하는 Manifest.json 파일을 읽도록 설계가 되었는데, 커스텀 파이프라인을 구축하는 상황에서 이를 기대할 수는 없습니다. 그래서 해당 연월 Prefix를 가지는 모든 파일을 조회하는 방식으로 파일 목록을 얻도록 별도의 함수를 개발하였습니다. 물론, 이러한 방식으로 수집할 대상에 대한 별도의 구분자가 필요했지요.

데이터 처리의 Customize

이제 데이터 처리 부분도 개선해야 합니다. 고객사가 열심히 노력을 했지만, 단가 노출을 이유로 실제 제공받은 컬럼은 제한적입니다. AWS에서 제공하는 CUR에는 200~300여개의 컬럼이 제공되는 것에 반해, 고객사는 50개의 컬럼만 제공받았습니다. 특히, 단가가 들어가는 Rate 컬럼들과 ItemDescription 컬럼이 제공되지 않아서 이러한 컬럼을 제외하고 처리가 가능하도록 수정해야 했습니다.

스파크 소스를 열심히 살펴보면서 컬럼이 없더라도 정상 처리가 되도록 이곳 저곳을 수정합니다. ItemDescription 컬럼은 다양한 정보를 가지고 있기 때문에 생각 외로 많은 곳에서 이용되고 있었습니다. 그리고 CUR 데이터에서 해당 컬럼은 Not Null이었으므로 별도 처리가 없었는데, 이제는 Null 처리가 필요하게 되었습니다. 구체적인 처리 내용은 물론 비공개 입니다. 😅

모든 처리가 완료된 후에 화면을 살펴봅니다.

Cost의 Billing 화면

빌링 데이터가 잘 나타나고 있습니다. 이 외의 부가 서비스 항목들도 잘 나오고 있는데, 일부 데이터가 나타나지 않는 부분이 존재합니다.

  • 각종 테이블의 단가 컬럼이 비어있습니다.
  • 일부 서비스의 OS 컬럼이 비어있습니다.

OS 정보는 처리 방식에 따라 나오고 안나오고 하고 있습니다. 레거시 코드에서 ItemDescription 컬럼을 이용하여 OS 정보를 얻고 있었기 때문입니다. 이 부분의 처리 방식을 일원화하면서 정상 처리되도록 개선해야 할 숙제가 생겼네요. 😊

자, 이제 CUR 데이터를 요청하셔서 S3에 제공받으시고 OpsNow에 등록을 요청하시면 되겠습니다!