CLA) AWS Secrets Manager를 통해 환경변수 관리하기

백엔드·2024년 8월 19일

CLA

목록 보기
6/7

기존 환경

  • 기존에는 프로젝트, 환경별로 env 파일을 만들고 환경변수는 문서로 관리하고 있었음.
  • 환경변수가 추가되거나 업데이트 될 때마다, 코드와 문서 모두 관리를 해야했음.
  • ECS를 통해 배포를 하고 있기 때문에, task-definition 파일이 필요했고 task-definition에서 사용하는 환경 변수를 secrets 속성을 통해 명시했음.

=> 귀찮음.

도입 이유

  • 환경변수 문서를 관리하고 싶지 않았다.
  • local에서 프로젝트 실행 시, 환경변수 파일을 만들고 싶지 않았다.
  • dev, prod 배포 시, task-definition secret 변수를 관리하고 싶지 않았다.

SecretManager를 통한 환경변수 관리

  • 방법
    • aws secretmanager 생성 및 환경변수 등록
    • @aws-sdk/client-secrets-manager 라이브러리 설치
    • AWS_REGION, AWS_SECRET_NAME 전역 변수 등록 or env 파일로 관리
    • aws cli credential 설정 or env 파일로 관리 (시크릿 매니저를 읽을 수 있는 권한을 가진 IAM 유저 설정)

관련 코드

import { GetSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager';
import { Injectable, InternalServerErrorException, Logger } from '@nestjs/common';

@Injectable()
export class SecretManagerProvider {
  async getEnvironmentVariableList(): Promise<string> {
    const client = new SecretsManagerClient({
      region: process.env.AWS_REGION,
    });
    const command = new GetSecretValueCommand({
      SecretId: process.env.AWS_SECRET_NAME,
    });

    try {
      const secretResult = await client.send(command);
      const secretList = JSON.parse(secretResult.SecretString);

      return secretList;
    } catch (error) {
      throw new InternalServerErrorException(error.message);
    }
  }

  async setEnvironmentVariables(): Promise<void> {
    const secretList = await this.getEnvironmentVariableList();

    for (const [key, value] of Object.entries(secretList)) {
      process.env[key] = value;
    }
  }
}

Trouble shooting

SecretManager는 자격 증명을 어디서 얻어올까?

SecretManager를 구현하면서 필요한 값은 AWS_REGION, AWS_SECRET_NAME 이었다.
그럼, ACCESS KEY와 SECRET KEY는 어떻게 알고 가져가는 걸까?

⇒ 전역 환경 변수에 유효한 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 추가로 셋팅해 주어야 함(해당 정책은 secretManager를 읽을 수 있는 권한이 있어야함.)

aws cli credential 설정

1.  cd  ~/.aws/
2. vim credentials
3. aws_access_key_id, aws_secret_access_key 설정

배포환경에서는 권한 없는 문제 발생

해당 aws_access_key_id가 가리키고 IAM 사용자가 dev용 secretManager를 읽을 수 있는 권한이 없었음. 해당 사용자에 secretManager를 읽을 수 있는 권한 추가

profile
백엔드 개발자

0개의 댓글