민프

[AWS] 환경변수 관리: SSM Parameter Store vs Secrets Manager – 무엇을 선택해야 할까? (SSM - nestjs 적용 예시) (feat. Redis) 본문

DevOps/[AWS]

[AWS] 환경변수 관리: SSM Parameter Store vs Secrets Manager – 무엇을 선택해야 할까? (SSM - nestjs 적용 예시) (feat. Redis)

민프야 2025. 7. 2. 22:00

서비스 운영을 하다 보면 JWT_SECRET, DB_PASS, REDIS_HOST 같은 민감한 설정값을 안전하게 관리해야 합니다.

예전에는 .env 파일로 로컬에 숨겨두곤 했지만, 클라우드 인프라에서는 AWS Systems Manager Parameter Store(SSM) 또는 AWS Secrets Manager를 활용하는 것이 안전하고 효율적인 방법입니다.

 

특히 저는 ECS로 배포를 하면서 .env.dev, .env.prod 등등.. 환경변수와 관련 된 것들을 컨테이너와 같이 올릴 수 없기에 SSM을 선택하여 진행하였습니다. 

 

Git Actions CICD를 이용해서 배포를 하고 있어서 Git Actions의 Actions secrets and variables를 사용하여 해보려고 했지만 dev, prod, staging모든 부분들을 하나하나 넣기에도 불편했고, Actions secrets and variables는 등록해놓으면 값이 보이지 않기 때문에 다른 팀원들이 와서 보기에도 불편하고, 유지보수에도 어려울 것이라 판단하여 제외하였습니다.

 

이번 글에서는 이 두 가지를 비교해보고, 제가 실무에서 직접 사용하면서 느낀 SSM Parameter Store의 장점을 정리해보겠습니다.

 


1. SSM Parameter Store: 비용 효율적인 환경변수 저장소

SSM Parameter Store는 일반적인 환경변수 (.env 파일) 저장처럼 사용할 수 있는 서비스입니다.

Key-Value 형태로 데이터를 저장하고, IAM 권한만 잘 설정하면 ECS, Lambda, EC2 등 모든 서비스에서 바로 로드가 가능합니다.

 

  • 요금: 기본(Standard tier)은 무료입니다.
    • 암호화(KMS) 옵션을 켜면 요청당 비용이 있지만, 아주 소액입니다 (1M 호출당 $0.05 수준).
  • 보안: KMS 키로 암호화 가능 + IAM으로 접근 제어
  • 장점:
    • .env파일처럼 Key-Value로 관리 가능
    • AWS CLI, SDK, 콘솔 등에서 접근 쉬움
    • 무료에 가깝고 ECS와 연동도 쉬움


2. Secrets Manager: 민감한 데이터 중심의 비밀 저장소

Secrets Manager는 DB 비밀번호, API 키, 토큰처럼 보안이 핵심인 데이터를 저장하는 데 최적화된 서비스입니다.

자동으로 주기적인 비밀번호 회전(Rotation)도 가능하고, 암호화도 기본으로 적용됩니다.

 

  • 요금: 한 건당 월 $0.40 + API 호출당 소액 부과
  • 보안: KMS 암호화 + IAM 통제 + 회전 기능 내장
  • 장점:
    • 민감한 정보 저장에 최적화
    • 자동 비밀번호 회전 등 고급 기능 지원
    • Lambda 기반 사용자 지정 회전 가능


3. 비용 비교: Parameter Store는 사실상 “거의 공짜”

항목 SSM Parameter Store Secrets Manager
기본 요금 Standard Tier는 무료 (최대 10,000개) $0.40/건/월
고급 요금 Advanced Tier: 약 $0.05/건/월 N/A
암호화 비용 KMS 사용 시 별도 KMS 호출 비용 발생 포함됨

 

예를 들어, .env 스타일 환경변수를 20개 정도 저장해도 Parameter Store를 Standard Tier로 사용하면 비용이 0원입니다.

Secrets Manager는 단 1개 키를 저장해도 약 500원/월 발생


4.  보안 측면: 둘 다 안전하지만 SSM도 충분하다

  • SSM Parameter StoreKMS로 암호화된 SecureString을 지원합니다.
  • IAM 권한을 통해 누가 어떤 파라미터에 접근 가능한지 명확히 제어할 수 있습니다.
  • Secrets Manager는 자동 순환, 비밀번호 교체 기능까지 제공되지만, 이건 고급 사용자를 위한 기능입니다.

 

즉, 일반적인 환경변수 관리 수준에서는 SSM Parameter Store의 SecureString + IAM 권한 제어만으로도 충분한 보안이 확보됩니다.

 


5.  nestjs 적용 예시

일단 IAM 및 EC2, ECS에 적용되어있는 role에 아래 권한을 추가하셔야합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameter",
        "ssm:GetParameters",
        "ssm:GetParametersByPath"
      ],
      "Resource": "SSM ARN 넣으시면 됍니다."
    }
  ]
}
import { GetParameterCommand, SSMClient } from '@aws-sdk/client-ssm';
// SSM에서 환경변수 로딩
async function loadEnvFromSSM() {

   // 이 부분만 ecs_task_def에서 NODE_ENV 환경변수 지정
  const envPath = process.env.NODE_ENV === 'production' ? '/api/env/prod' : '/api/env/dev';

  const client = new SSMClient({ region: 'ap-northeast-2' });

  try {
    const command = new GetParameterCommand({
      Name: envPath,
      WithDecryption: true,
    });

    const response = await client.send(command);
    const paramValue = response.Parameter?.Value;

    if (paramValue) {
      const lines = paramValue.split('\n');
      lines.forEach(line => {
        const [key, ...rest] = line.split('=');
        const value = rest.join('=').trim();
        if (key && value) {
          process.env[key.trim()] = value;
        }
      });

      console.log(`SSM에서 .env 값 불러오기 성공: ${envPath}`);
      console.log('현재 로드된 환경변수 목록:');
      console.log('--------------------------------------------');

	// SSM에서 불러온 환경변수 체크
      //   lines.forEach(line => {
      //     const [key] = line.split('=');
      //     const value = process.env[key.trim()];
      //     console.log(`${key.trim()} = ${value}`);
      //   });

      console.log('--------------------------------------------');
    } else {
      console.warn('⚠SSM에서 값을 가져왔지만 내용이 비어 있습니다.');
    }
  } catch (err) {
    console.error('❌ SSM에서 환경변수 불러오기 실패:', err);
  }
}

 


! 문제상황 

 문제코드
 
 
 RedisModule.forRoot({
      url: `redis://${process.env.REDIS_HOST || 'localhost'}:${process.env.REDIS_PORT || 6379}`,
      type: 'single',
    }),
    BullModule.forRoot({
      redis: {
        host: process.env.REDIS_HOST || 'localhost',
        port: parseInt(process.env.REDIS_PORT || '6379', 10),
      },
    }),

 

Redis 연결 시점이 SSM 초기화보다 먼저 발생해서

process.env.REDIS_HOST가 undefined -> localhost로 fallback 되고 있는 문제입니다.

 

이 문제는 NestJS에서 모듈 초기화 순서 때문에 발생합니다.

즉, RedisModule.forRoot()가 실행되는 시점에는 process.env가 아직 SSM에서 채워지기 전이기 때문에 잘못된 기본값이 들어갑니다.

 

위 문제 코드에서는 main.ts에서 ssm에서 env를 초기화 시켰고, RedisModule이 실행되는 곳은 app.module 쪽 입니다.

따라서 해당 모듈들을 RedisModule.registerAsync()로 변경하여 SSM 초기화 이후에 Redis 연결하면 해결됩니다.

 

RedisModule.forRoot()는 정적인 설정이기 때문에 시점 제어가 불가능합니다.

-> forRootAsync()로 변경하면 SSM 값을 로드한 이후 RedisModule을 초기화할 수 있습니다.

    RedisModule.forRootAsync({
      // eslint-disable-next-line @typescript-eslint/require-await
      useFactory: async () => {
        console.log('Redis 연결 준비 중...');
        return {
          type: 'single',
          url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`,
        };
      },
    }),
    BullModule.forRootAsync({
      // eslint-disable-next-line @typescript-eslint/require-await
      useFactory: async () => {
        console.log('Bull Redis 연결 준비 중...');
        return {
          redis: {
            host: process.env.REDIS_HOST,
            port: parseInt(process.env.REDIS_PORT || '6379', 10),
          },
        };
      },
    }),

참고링크

https://velog.io/@drimdrim2002/AWS-Secret-Manager

 

AWS Secret Manager VS Parameter Store

https://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/intro.htmlAWS Secrets Manager을(를) 사용하면 수명 주기 동안 데이터베이스 보안 인증, 애플리케이션 보안 인증, OAu

velog.io

https://rainbound.tistory.com/entry/AWS-Parameter-Store-%EC%99%80-AWS-Secrets-Manager-%EA%B3%B5%ED%86%B5%EC%A0%90%EA%B3%BC-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

AWS Parameter Store 와 AWS Secrets Manager 공통점과 차이점

목차 공통점 Managed Key/Value Store Services 이 두 서비스 사이에는 많은 유사점이 있습니다. 이 두 서비스 모두 이름이나 키 아래에 값을 저장하는 솔루션을 제공합니다. 두 서비스 모두 최대 4096자의

rainbound.tistory.com

https://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/systems-manager-parameter-store.html

 

AWS Systems Manager Parameter Store - AWS Systems Manager

AWS Systems Manager Parameter Store AWS Systems Manager의 도구인 Parameter Store는 구성 데이터 관리 및 비밀 관리를 위한 안전한 계층적 스토리지를 제공합니다. 암호, 데이터베이스 문자열, Amazon Machine Image(AMI

docs.aws.amazon.com

https://aws.amazon.com/ko/secrets-manager/

 

클라우드 비밀 관리 - AWS Secrets Manager - AWS

AWS Secrets Manager는 수명 주기에 걸쳐 데이터베이스 보안 인증 정보, API 키 및 기타 보안 암호를 관리, 검색 및 교체하는 데 도움이 됩니다.

aws.amazon.com

 

Comments