일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Lamda
- SageMaker
- Validation
- CHECK
- terraform
- serverless
- 병목
- lambda
- kubernetes
- rds
- fcm
- cloudwatch
- IaC
- amazonqcli
- sns
- aws
- Today
- Total
잡다한 IT 지식
AWS 요금 폭탄을 막는 실전 보안 및 예산 관리 가이드 본문
AWS를 처음 접하는 많은 분들이 가장 두려워하는 요소 중 하나는 예기치 않은 요금 폭탄입니다.
특히, 단순한 실수나 보안 미숙으로 인해 수십만 원~수백만 원의 비용이 청구되는 경우도 드물지 않습니다.
이번 글에서는 요금 폭탄이 발생하는 주요 원인부터, 이를 방지하기 위한 실질적인 방법들(API 키 보호, STS 사용, 예산 알림 시스템)까지 정리해보았습니다.
1. 요금 폭탄의 가장 흔한 원인: API 키 노출
AWS에서 발생하는 치명적인 과금 사고의 대표적인 원인은 API Key 노출입니다.
특히, 다음과 같은 경우가 자주 보고됩니다:
- GitHub와 같은 공개 SCM에 키를 실수로 커밋
- 메신저, 공유 문서 등을 통해 키가 외부로 유출
키가 노출되면 어떻게 되나요?
- 노출된 키는 그 계정이 가진 권한 내에서 모든 작업이 가능합니다.
- 실제 사례로는 GPU 인스턴스를 생성해 암호화폐를 채굴하는 공격이 대표적입니다.
- 심하면 수백~수천만 원대의 요금이 발생할 수 있습니다.
2. API Key 노출을 막는 방법
2.1 GitHub Secret 사용
CI/CD 도구(GitHub Actions 등)에서는 민감한 정보를 코드에 직접 적지 않고, 깃허브의 Secrets로 분리해 저장해야 합니다.
예시: GitHub Actions에서 AWS 키 사용
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- 키는 GitHub 서버에 암호화된 상태로 저장되며, 실행 중에만 참조됩니다.
- 코드 상에 노출되지 않으므로 실수로 커밋될 위험이 없습니다.
2.2 AWS STS(Security Token Service) 사용
API 키를 단기 토큰으로 대체하여 보안을 강화하는 방법입니다.
STS의 특징:
- 최소 15분, 최대 24시간 동안만 유효한 토큰 발급
- 유효 시간이 지나면 더 이상 사용할 수 없음
- 토큰이 탈취되더라도 피해를 최소화 가능
워크플로우 요약:
- CI/CD 도구가 GitHub OIDC로 인증
- AWS에서 AssumeRole 호출로 임시 권한 획득
- STS 토큰으로 제한된 작업 수행
3. AWS 예산 초과 알림 시스템 구축
예산을 초과하면 자동으로 Slack으로 알림을 받는 구조입니다.
AWS Budgets + SNS + Slack 연동을 통해 간단하게 구성할 수 있습니다.
AWS Budget을 통해 예산을 설정하고 예산을 초과하면 Slack에 Alert를 보내는 방법입니다.
구성 흐름
- AWS Budgets에서 하루/주/월 예산 설정
- 예산 초과 시 SNS로 알림 발송
- SNS → AWS Chatbot → Slack 채널 알림
Terraform 코드
resource "aws_sns_topic" "slack_budget_alert" {
name = "slack-budget-alert-topic"
}
data "aws_iam_policy_document" "sns_chatbot_policy" {
statement {
actions = ["SNS:Publish"]
effect = "Allow"
principals {
type = "Service"
identifiers = ["budgets.amazonaws.com"]
}
resources = [
aws_sns_topic.slack_budget_alert.arn
]
}
}
resource "aws_sns_topic_policy" "this" {
arn = aws_sns_topic.slack_budget_alert.arn
policy = data.aws_iam_policy_document.sns_chatbot_policy.json
}
resource "aws_budgets_budget" "monthly_budget" {
name = "monthly-budget-alert"
budget_type = "COST"
limit_amount = var.budget_limit_amount
limit_unit = "USD"
time_unit = "DAILY"
notification {
comparison_operator = "GREATER_THAN"
threshold = var.budget_threshold_percentage
threshold_type = "PERCENTAGE"
notification_type = "ACTUAL"
subscriber_sns_topic_arns = [aws_sns_topic.slack_budget_alert.arn]
}
}
# variables.tf
variable "budget_limit_amount" {
type = string
description = "총 사용할 금액."
default = "3.00"
}
variable "budget_threshold_percentage" {
type = string
description = "알림이 올 사용량 퍼센트."
default = "10"
}
이후 SNS에 들어가서 Alert를 보낼 대상을 설정하면 됩니다.
4. 결론
- AWS에서는 API Key 노출이 가장 큰 보안 리스크입니다.
- GitHub Secrets와 STS를 활용하면 노출 가능성을 줄일 수 있습니다.
- Budgets + SNS + Slack을 활용한 알림 시스템은 설정이 간단하면서도 매우 효과적입니다.
- 처음부터 보안을 고려한 구성은 비용 낭비와 사고를 예방하는 가장 확실한 방법입니다.
5. 참고 자료
'AWS > 실습' 카테고리의 다른 글
AWS Q Developer Vibe Coding으로 게임 만들기 (0) | 2025.06.02 |
---|---|
AWS - kubespray로 클러스터 구축 (0) | 2025.05.20 |