여러 프로젝트가 한 AWS 계정을 함께 쓰고 있어서 어느 프로젝트가 얼마를 쓰는지 알 수 없었다. 청구서가 총액 한 줄로 나오는데 프로젝트는 넷이고 그것을 나눌 방법이 없었다.
Table of contents
Open Table of contents
조치 — 세 축으로 붙인 태그
두 가지 방법이 있었는데 Organizations 로 계정을 프로젝트별로 나누는 것과 한 계정에 두고 태그로 가르는 것이다. 뒤쪽을 골랐다. 이유는 이미 섞여 있는 자원을 계정 간에 옮기는 것이 태그를 붙이는 것보다 훨씬 무거워서다. 대신 태그가 빠진 자원은 영영 나눠지지 않는 것을 감수했다. Project 와 Environment 와 Owner 라는 세 축을 정해 자원마다 붙였다.
붙이고 나서 Cost Explorer 를 태그별로 보니 프로젝트별 비중이 처음으로 드러났다. 그중에 태그가 하나도 없는 항목도 조금 남아 있었다.
태그 없는 자원의 정체
resourcegroupstaggingapi get-resources 로 태그가 비어 있는 자원을 조회하니 십여 개가 나왔고 대부분 오래전에 만들어진 것이었다. 그중 하나는 무엇에 쓰는 자원인지 아무도 알지 못했다.
지우기 전에 껐다 보고 아무 일도 안 일어나는 것을 확인한 뒤 지웠다. 나눠 보려고 붙인 태그가 정체 모를 자원까지 드러낸 셈이다.
안 붙이면 못 만들게
태그 붙이는 것을 잊을 자리 자체를 없애려고 SCP 로 막았다. AWS 공식 문서대로 aws:RequestTag/Project 조건은 요청에 실린 태그를 정책의 값과 비교하므로 그것이 없는 생성 요청은 거부된다.
급할 때 막히면 곤란하므로 관리자는 예외로 두되 관리자가 만든 것은 따로 알림이 가게 했다. 예외를 두면서 그 예외가 보이게 만든 것이다.
주의 — 값의 표기 통일
같은 프로젝트인데 대소문자와 접미사가 달라 네 가지 표기로 적히는 문제가 있었다. 그러면 청구서에서 각각 다른 항목으로 따로 세어진다.
Tag Policies 에 허용 값 목록을 넣어 그 목록에 있는 것만 쓰게 하고 이미 붙은 것은 찾아서 맞췄다. 나눠 보는 축은 값이 통일돼야 비로소 축이 된다.
자동 부여와 못 나누는 것
Terraform 으로 만드는 자원은 default_tags 로 기본 태그가 자동으로 붙게 해서 손으로 만드는 것만 신경 쓰면 되게 했다. ManagedBy 태그도 함께 넣어 코드로 만든 것과 손으로 만든 것을 갈랐다.
비용 보고는 담당별로 자기 것만 보내고 전월 대비 늘어난 항목을 함께 적어서 보냈다. 다만 전송료처럼 자원에 안 붙는 항목은 태그로 못 나눠서 공통 비용으로 두고 사용량 비율로 배분했는데 전부 나눌 수 없다는 사실과 어떻게 배분했는지를 함께 적어 뒀다.
정리
- 나눠 볼 방법이 하나뿐이면 그것을 제대로 해 둔다
- 태그 없는 자원을 찾으면 정체 모를 것이 나온다
aws:RequestTag조건으로 태그 없이 못 만들게 막으면 잊을 자리가 없어진다- 예외를 두더라도 그 예외가 보이게 한다
- 태그 값을 정해진 것만 쓰게 한다
- Terraform 으로 만드는 것은
default_tags로 자동으로 붙게 한다 - 담당에게 자기 것과 늘어난 항목을 함께 보낸다
- 태그로 못 나누는 것이 있고 그 배분 방식을 적어 둔다