월말 클라우드 청구서가 수천 달러인데 "어느 팀이, 어떤 서비스가 이만큼 썼는지" 아무도 설명하지 못합니다. 리소스가 수백 개로 늘면 청구서는 거대한 덩어리가 되어 누구도 책임지지 않는 비용이 됩니다. 이 문제를 푸는 가장 기본적인 도구가 태그(tag) 입니다. 태그는 리소스에 붙이는 키=값 메타데이터로, 이걸 일관되게 붙여두면 비용을 팀·환경·서비스별로 쪼개 볼 수 있습니다.
먼저 태그 표준을 정한다
태그는 "있으면 좋은 것"이 아니라 표준을 정하고 강제해야 의미가 있습니다. 사람마다 Team, team, 소속팀으로 제각각 붙이면 집계가 안 됩니다. 최소한 아래 키를 표준으로 박습니다.
| 태그 키 | 예시 값 | 용도 |
|---|---|---|
CostCenter | team-payments | 비용 귀속 주체 |
Environment | prod / staging / dev | 환경별 비용 분리 |
Service | checkout-api | 서비스 단위 추적 |
Owner | klksm13@example.com | 책임자 연락처 |
키 이름의 대소문자와 표기를 하나로 통일하는 게 핵심입니다. 태그 키는 대소문자를 구분하므로 Environment와 environment는 다른 태그로 집계됩니다.
비용 배분 태그를 활성화한다
태그를 붙이는 것만으로는 청구서에 나타나지 않습니다. 비용 배분 태그(cost allocation tags) 를 따로 활성화해야 비용 리포트에서 그 태그로 묶어 볼 수 있습니다. AWS라면 Billing 콘솔에서 활성화하며, 활성화 후 데이터가 채워지는 데 하루 정도 걸립니다.
적용과 강제 순서
- 기존 리소스에 태그 일괄 부여 — 누락된 리소스를 찾아 표준 태그를 붙입니다.
로컬 터미널
aws resourcegroupstaggingapi tag-resources \
--resource-arn-list <ARN1> <ARN2> \
--tags CostCenter=team-payments,Environment=prod
- 태그 누락 리소스 탐지 — 어떤 리소스에
CostCenter가 없는지 찾습니다.
로컬 터미널
aws resourcegroupstaggingapi get-resources \
--tag-filters Key=CostCenter --query 'ResourceTagMappingList[].ResourceARN'
- 신규 리소스에 태그 강제 — 정책으로 필수 태그 없는 생성을 막습니다. 아래는
CostCenter태그 없이 인스턴스 생성을 거부하는 IAM 정책 예시입니다.
JSON
{
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"Null": { "aws:RequestTag/CostCenter": "true" }
}
}
- 비용 리포트 확인 — Cost Explorer에서
CostCenter태그로 그룹화하면 팀별 금액이 갈립니다.
요점 정리
- 태그는 표준(키 이름·표기)을 먼저 정하고 강제해야 집계가 된다.
- 태그를 붙여도 비용 배분 태그를 활성화하지 않으면 청구서에 안 나온다.
- 기존 리소스는 일괄 부여, 신규 리소스는 IAM 정책으로 누락을 막는다.
- Cost Explorer에서 태그로 그룹화하면 팀·환경·서비스별 비용이 보인다.
태그 표준을 설계하고 비용 배분 태그·리포트를 직접 다뤄보는 실습은 클라우드 트랙에서 회원가입 없이 무료로 할 수 있습니다.