KMS 요금은 생각보다 조용히, 그러나 빠르게 늘어납니다.
대부분의 AWS 사용자들은 “암호화는 해야지” 정도로만 생각하고 KMS를 기본 설정 그대로 사용합니다. 하지만 어느 순간 Lambda나 Secrets Manager에서 뜻밖의 요금 청구서를 받게 됩니다. 바로 “API 호출 1,000건당 $0.03”이라는 작은 수치가 수만 건의 호출로 누적되며 발생하는 결과입니다.
이 글은 KMS 과금이 왜 그렇게 발생하는지, 서비스마다 어떤 호출 패턴이 숨어 있는지, 어떻게 하면 필요 없는 호출을 줄일 수 있는지를 이해하는 데 집중합니다. 보안은 필수지만, 불필요한 요금까지 필수는 아닙니다.
AWS Key Management Service(KMS)는 클라우드 환경에서 암호화 키를 안전하게 생성, 저장, 관리할 수 있는 관리형 서비스입니다. KMS를 사용하면 데이터의 기밀성을 유지하기 위해 필요한 암호화 기능을 직접 구현하지 않고도, AWS의 다양한 서비스와 연동해 키를 생성하고 관리하며 암호화/복호화 작업을 수행할 수 있습니다.
KMS는 두 가지 키 유형을 제공합니다.
대칭 키(Symmetric Key): 암호화와 복호화에 동일한 키를 사용하는 방식으로, 대부분의 AWS 서비스(S3, EBS, RDS, Lambda 등)에서 기본적으로 사용하는 방식입니다. 대칭 키는 보안성이 높고 관리가 단순해 주로 많이 사용됩니다.
비대칭 키(Asymmetric Key): 암호화와 복호화에 서로 다른 키(공개키/개인키)를 사용하는 방식으로, 디지털 서명, 키 교환, 인증서 관리와 같은 특수한 보안 요구에 활용됩니다. 비대칭 키는 AWS KMS에서 2019년부터 지원되며, 필요에 따라 선택적으로 사용합니다.
또한, KMS의 핵심 기능 중 하나는 키 정책(Key Policy)입니다. 키 정책은 특정 키에 대한 접근 권한을 제어하는 정책 문서로, “누가”, “어떤 권한으로” 해당 키를 사용할 수 있는지를 명확히 정의합니다. 이를 통해 KMS 키의 접근 권한을 세밀하게 통제할 수 있으며, 잘못된 접근으로 인한 데이터 노출을 방지할 수 있습니다.
KMS는 다양한 AWS 서비스와의 통합을 통해 암호화 키 관리의 복잡성을 크게 줄여줍니다.
S3 객체 암호화
EBS 볼륨 암호화
RDS 데이터베이스 암호화
Lambda 환경변수 암호화
DynamoDB 테이블 암호화
Secrets Manager 및 Parameter Store 데이터 암호화
이처럼 KMS는 클라우드 환경의 광범위한 서비스에서 암호화 키를 안전하게 관리하고, 보안 모범 사례를 실현하는 핵심 도구로 활용됩니다.
AWS Key Management Service(KMS)를 사용할 때, 선택할 수 있는 두 가지 주요 키 유형은 Customer Managed Key(CMK)와 AWS Managed Key입니다. 이 두 키는 사용 방식뿐 아니라 비용 구조에서 명확한 차이를 보이므로, 상황에 따라 전략적인 선택이 필요합니다.
AWS Managed Key
AWS Managed Key는 AWS가 소유하고 관리하는 키로, aws/s3, aws/ebs 등의 이름으로 자동 생성되어 서비스와 함께 사용됩니다. 이 키의 가장 큰 장점은 보관 요금이 전혀 발생하지 않는다는 점입니다.
예를 들어, S3에서 SSE-KMS 방식의 암호화를 선택하고 별도의 키를 지정하지 않으면 자동으로 AWS Managed Key가 사용되며, 이는 키 보관 비용 없이 API 호출에 대해서만 과금됩니다.
즉, 서비스 사용 중 발생하는 Encrypt, Decrypt 요청에 대해 1,000건당 $0.03의 요금만 부과됩니다. 보안 제어나 정책이 특별히 필요하지 않은 상황에서, AWS Managed Key는 운영과 비용 측면 모두에서 가장 합리적인 기본 선택지입니다.
Customer Managed Key (CMK)
반면 CMK는 사용자가 직접 생성하고 관리하는 키입니다. 키에 대해 사용자 정의 정책(Key Policy)을 설정하거나, 키 회전 주기 및 삭제 여부까지 세밀하게 통제할 수 있는 유연성을 제공합니다.
하지만 이러한 유연성은 곧 비용으로 이어집니다. CMK는 키 1개당 월 $1의 보관 요금이 발생하며, 여기에 더해 동일하게 API 호출 비용도 1,000건당 $0.03이 부과됩니다. API 요청은 Lambda 함수, Secrets Manager, S3, RDS 등의 서비스 동작 중 자동으로 발생하기 때문에, 호출 빈도가 높은 워크로드에서는 예상보다 큰 비용으로 누적될 수 있습니다.
어떤 상황에서 어떤 키를 선택해야 할까?
일반적으로는 AWS Managed Key를 사용해도 충분한 경우가 많습니다. 단순한 데이터 암호화나 읽기/쓰기 수준의 요구사항만 있다면, 보관 비용이 없고 설정이 간편한 AWS Managed Key가 유리합니다.
하지만 다음과 같은 경우에는 CMK가 필요할 수 있습니다.
보안 요건에 따라 세부적인 권한 제어가 필요할 때
부서 또는 사용자 그룹별로 키를 구분해 관리하고자 할 때
보안 감사, 인증 기준 등에서 수명 주기 관리나 삭제 설정이 요구될 때
AWS KMS의 요금은 크게 두 가지 기준에 따라 부과됩니다: 키 보관 비용과 API 요청 비용입니다. 이 두 항목을 이해하는 것이 KMS 비용 최적화의 출발점입니다. KMS의 과금 구조는 아래 링크에서 확인할 수 있습니다.
Customer Managed Key(CMK) 1개당 월 $1의 고정 요금이 발생합니다. 키 자체는 크기나 사용량과 관계없이, 단순히 보관 중이라는 사실만으로 요금이 발생합니다. 예를 들어, CMK를 10개 생성해 보관만 해도 별도의 API 호출이 없더라도 매월 $10의 비용이 청구됩니다.
AWS에서 제공하는 AWS Managed Key(예: aws/s3, aws/ebs)는 보관 요금이 발생하지 않으므로, 기본 서비스 통합 목적의 키만 필요하다면 AWS Managed Key 사용이 비용적으로 유리합니다.
CMK를 활용해 암호화/복호화 작업을 수행할 때마다 API 호출 요금이 부과됩니다. 요금 단위는 Encrypt, Decrypt, GenerateDataKey 요청 1,000건당 $0.03입니다.
예를 들어, Lambda 함수가 호출될 때마다 Secrets Manager의 비밀번호를 Decrypt하면, 매번 KMS:Decrypt 요청이 발생하며, 이 호출 횟수가 많아질수록 비용이 누적됩니다. KMS API 요청 비용은 소액이지만, 사용 패턴에 따라 쉽게 수천~수만 건 단위로 증가할 수 있어 주의가 필요합니다.
GenerateDataKeyPair, ReEncrypt, Sign/Verify 등의 고급 API 호출도 동일한 단위 요금(1,000건당 $0.03)으로 부과됩니다. KMS 요금은 리전에 따라 동일하며, 각 리전별 청구가 별도로 이루어집니다.
결과적으로, KMS의 비용은 “키 개수” + “API 호출 횟수”의 조합으로 결정되며, 비용 최적화를 위해서는 두 가지 모두를 관리하는 전략이 필요합니다.
KMS는 AWS의 다양한 서비스와 긴밀하게 통합되어 있으며, 서비스별로 KMS 호출 패턴과 비용 발생 방식이 다르다는 점을 이해하는 것이 중요합니다. 각 서비스별 특징을 살펴보면 다음과 같습니다.
S3 (Simple Storage Service)
S3 버킷에 SSE-KMS(Server-Side Encryption with KMS)를 활성화하면, 객체 업로드(쓰기) 또는 다운로드(읽기) 시마다 KMS의 Encrypt 또는 Decrypt API가 호출됩니다. 대량의 S3 요청이 발생할 경우, KMS 호출 수도 그에 비례해 증가해 비용 부담이 커질 수 있습니다. 특히, 다수의 작은 파일(예: 로그 파일) 업로드/다운로드 시 주의가 필요합니다.
EBS (Elastic Block Store)
EBS 볼륨을 암호화하면, 해당 볼륨의 데이터는 자동으로 KMS 키로 암호화되지만, 일반적인 EBS I/O 작업 자체는 KMS 호출을 직접적으로 유발하지 않습니다.
다만, 스냅샷 생성 또는 볼륨 복원 시에는 KMS의 Encrypt 및 Decrypt API가 호출되어 요금이 발생할 수 있습니다.
Lambda
Lambda 함수에서 환경 변수 암호화, Secrets Manager 연동, 또는 다른 암호화된 리소스를 사용하면 실행 시마다 Decrypt 호출이 발생할 수 있습니다. 특히, Secrets Manager의 GetSecretValue 호출이 내부적으로 KMS Decrypt를 트리거하므로, Lambda 함수가 빈번하게 실행되는 경우 KMS 호출 수가 급격히 증가할 수 있습니다.
RDS (Relational Database Service)
RDS는 DB 인스턴스 수준에서 KMS 암호화를 설정하면 데이터 저장 및 백업 시 KMS를 사용하지만, DB 쿼리 처리 자체에서는 추가적인 KMS 호출이 발생하지 않습니다.
다만, RDS 스냅샷 복원, 복제본 생성 등 관리 작업에서 KMS 호출이 발생하며, 이 때 소량의 API 호출 요금이 청구될 수 있습니다.
DynamoDB
DynamoDB 테이블을 KMS로 암호화하면 데이터 저장 시점에서만 KMS 호출이 발생하며, 쿼리(읽기/쓰기) 작업에는 KMS 호출이 추가로 발생하지 않습니다.
따라서 DynamoDB는 KMS 호출 부담이 상대적으로 적은 서비스입니다.
S3, Lambda, Secrets Manager는 KMS 호출이 빈번히 발생하는 서비스로 주의해야 하며, EBS와 RDS는 관리 작업에서만 제한적으로 발생, DynamoDB는 상대적으로 KMS 호출 부담이 낮은 서비스입니다. 서비스별 KMS 호출 패턴을 이해하고, 필요 없는 호출을 줄이는 전략이 필요합니다.
AWS KMS는 여러 서비스에서 사용되지만, 서비스마다 요금이 발생하는 방식이 다르기 때문에 이를 이해하는 것이 비용 최적화의 핵심입니다.
예를 들어, S3, Lambda, Secrets Manager는 데이터를 저장하거나 가져올 때마다 KMS의 Encrypt, Decrypt, GenerateDataKey 같은 API 호출을 동반하며, 호출 빈도에 따라 요금이 누적됩니다. 특히, Lambda는 Secrets Manager와 함께 사용하는 경우 실행 횟수에 비례해 Decrypt 호출이 많아져 요금이 빠르게 증가할 수 있습니다.
반면, EBS, RDS, DynamoDB는 저장 시 암호화에는 KMS를 사용하지만, 일상적인 데이터 접근이나 쿼리 처리 시에는 별도의 KMS 호출이 발생하지 않아 상대적으로 요금 부담이 적습니다. 다만, 스냅샷 생성이나 복원, 복제본 생성 등의 관리 작업에서 간헐적인 호출이 발생할 수 있습니다.
이처럼 같은 ‘저장 서비스’라도 KMS 호출 방식이 직접 호출 기반인지, 시스템 내부 자동 호출인지, 또는 정기 호출인지 단발성 호출인지에 따라 요금 구조가 완전히 달라집니다.
또한, 요금이 급격히 증가하는 경우는 대체로 “고빈도 호출이 숨어 있는 구조”에서 발생합니다. 예를 들어, 다량의 로그 파일을 S3에 저장하거나, 자주 호출되는 Lambda 함수가 매번 비밀값을 복호화하는 경우입니다. 이런 구조는 사용량은 적은데 요금은 높은 상황을 초래하므로, CloudTrail이나 Cost Explorer를 통해 서비스별 KMS 호출량을 모니터링하는 것이 중요합니다.
암호화는 AWS 보안의 핵심이고, KMS는 그 중심에 있습니다. 하지만 키 하나를 생성하고 잊어버린 순간, 매월 생각 이상의 과금이 청구됩니다.
특히 Lambda와 Secrets Manager, 자주 호출되는 S3 로그 저장 구조는 ‘고빈도 KMS 호출’이라는 비용 지뢰를 숨기고 있습니다.
단순한 스토리지에는 AWS Managed Key로 충분합니다.
권한 제어나 정책 통제가 필요한 경우에만 Customer Managed Key를 신중하게 선택하세요.
CloudTrail과 Cost Explorer로 KMS 호출량을 주기적으로 모니터링하세요.
보안과 비용의 균형, 그 첫걸음은 “KMS 호출은 누가, 얼마나 자주, 왜 발생하는가?“라는 질문에서 시작됩니다. 보안을 유지하면서도, 비용은 지킬 수 있습니다.