잡다한 IT 지식

AWS 요금 폭탄을 막는 실전 보안 및 예산 관리 가이드 본문

AWS/실습

AWS 요금 폭탄을 막는 실전 보안 및 예산 관리 가이드

가나무마 2025. 6. 23. 21:09

AWS를 처음 접하는 많은 분들이 가장 두려워하는 요소 중 하나는 예기치 않은 요금 폭탄입니다.
특히, 단순한 실수나 보안 미숙으로 인해 수십만 원~수백만 원의 비용이 청구되는 경우도 드물지 않습니다.

이번 글에서는 요금 폭탄이 발생하는 주요 원인부터, 이를 방지하기 위한 실질적인 방법들(API 키 보호, STS 사용, 예산 알림 시스템)까지 정리해보았습니다.

1. 요금 폭탄의 가장 흔한 원인: API 키 노출

AWS에서 발생하는 치명적인 과금 사고의 대표적인 원인은 API Key 노출입니다.
특히, 다음과 같은 경우가 자주 보고됩니다:

  • GitHub와 같은 공개 SCM에 키를 실수로 커밋
  • 메신저, 공유 문서 등을 통해 키가 외부로 유출

키가 노출되면 어떻게 되나요?

Github를 통해 API 키가 탈취. 해커는 해당 키를 통해 AWS 서비스 접근

  • 노출된 키는 그 계정이 가진 권한 내에서 모든 작업이 가능합니다.
  • 실제 사례로는 GPU 인스턴스를 생성해 암호화폐를 채굴하는 공격이 대표적입니다.
  • 심하면 수백~수천만 원대의 요금이 발생할 수 있습니다.

2. API Key 노출을 막는 방법

2.1 GitHub Secret 사용

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 서버에 암호화된 상태로 저장되며, 실행 중에만 참조됩니다.
  • 코드 상에 노출되지 않으므로 실수로 커밋될 위험이 없습니다.

악의적인 사용자가 secrets에 접근이 불가능하므로 API Key 탈취가 불가능하다.

 

 

2.2 AWS STS(Security Token Service) 사용

API 키를 단기 토큰으로 대체하여 보안을 강화하는 방법입니다.

STS 워크플로우

STS의 특징:

  • 최소 15분, 최대 24시간 동안만 유효한 토큰 발급
  • 유효 시간이 지나면 더 이상 사용할 수 없음
  • 토큰이 탈취되더라도 피해를 최소화 가능

워크플로우 요약:

  1. CI/CD 도구가 GitHub OIDC로 인증
  2. AWS에서 AssumeRole 호출로 임시 권한 획득
  3. STS 토큰으로 제한된 작업 수행

 

3. AWS 예산 초과 알림 시스템 구축

예산을 초과하면 자동으로 Slack으로 알림을 받는 구조입니다.
AWS Budgets + SNS + Slack 연동을 통해 간단하게 구성할 수 있습니다.

AWS Budget을 통해 예산을 설정하고 예산을 초과하면 Slack에 Alert를 보내는 방법입니다.

구성 흐름

  1. AWS Budgets에서 하루/주/월 예산 설정
  2. 예산 초과 시 SNS로 알림 발송
  3. SNS → AWS Chatbot → Slack 채널 알림

2.5달러를 초과하면 SNS가 Slack으로 Alert를 보낸다.

 

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를 보낼 대상을 설정하면 됩니다.

SNS 화면
SNS로 알림을 보낼 대상 선택
Slack을 엔드포인트로 설정했을 때 결과값

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