[Spring Cloud AWS] Spring Cloud AWS Secrets Manager Config + Secrets Manager

mrcocoball·2025년 3월 1일
0

Spring Cloud

목록 보기
9/11

개요

이전까지 필자는 환경변수의 경우 env 파일을 import해서 사용하거나 Docker, Kubernetes와 같은 컨테이너를 활용할 때에는 컨테이너를 실행시킬 때 환경변수를 주입시켜주었다.

그런데 현 직장에서는 AWS Secrets Manager와 Spring Cloud AWS를 사용하여 별도의 env 파일을 개발자 개개인에게 전달하거나, 배포 환경에서 생성하지 않더라도 환경변수를 주입하고 전역적으로 관리하고 있었는데 AWS Secrets Manager, Spring Cloud AWS를 사용하면서 알게 된 내용을 정리해보고자 한다.

AWS Secrets Manager

AWS Secrets Manager을(를) 사용하면 수명 주기 동안 데이터베이스 보안 인증, 애플리케이션 보안 인증, OAuth 토큰, API 키 및 기타 암호를 관리, 검색, 교체할 수 있습니다. 다수의 AWS 서비스는 Secrets Manager에 보안 암호를 저장하고 사용합니다. - AWS

AWS Secrets Manager는 AWS에서 제공하는 보안 암호 저장 서비스이며 AWS의 다양한 서비스에 맞는 보안 암호부터 개인이 직접 설정할 수 있는 보안 암호를 저장하고 사용할 수 있게 해준다.

보안 암호를 정기적으로 교체하는 기능, 버전 관리 기능이 존재하며 리소스 권한을 통해 접근 제어를 할 수 있다.
특히나 AWS의 서비스 뿐만 아니라 어디에서든 이러한 보안 암호를 사용할 수 있다.

보안 암호 내의 값들은 키-값 형태로 저장이 가능하며, JSON 형식으로 관리된다.

# Amazon RDS 보안 암호 형식 예시
{
  "engine": "db2",
  "host": "<instance host name/resolvable DNS name>",
  "username": "<username>",
  "password": "<password>",
  "dbname": "<database name. If not specified, defaults to None>",
  "port": <TCP port number. If not specified, defaults to 3306>,
  "masterarn": "<ARN of the elevated secret>",
  "dbInstanceIdentifier": <optional: ID of the instance. Alternately, use dbClusterIdentifier. Required for configuring rotation in the console.>",
  "dbClusterIdentifier": <optional: ID of the cluster. Alternately, use dbInstanceIdentifier. Required for configuring rotation in the console.>"
}

AWS Secrets Manager로 관리되는 보안 암호 내부의 값은 Java SDK로 가져올 수 있는데 회사에서는 Spring Cloud AWS를 통해 좀 더 쉽게 보안 암호에 저장된 환경 변수를 import하고 있었다.

Spring Cloud AWS

https://docs.awspring.io/spring-cloud-aws/docs/3.2.0/reference/html/index.html#configuring-credentials

Spring Cloud AWS simplifies using AWS managed services in a Spring Framework and Spring Boot applications. It offers a convenient way to interact with AWS provided services using well-known Spring idioms and APIs.

Spring Cloud AWS는 AWS의 관리형 서비스와 스프링 프레임워크, 스프링 부트 기반 어플리케이션의 통합 및 상호 작용을 쉽게 도와주는 프로젝트로, S3, SQS, SES, Secrets Manager, DynamoDB, CloudWatch 등과 같은 다양한 AWS 서비스와의 쉬운 통합을 제공한다.

사실 AWS 서비스는 이미 각종 언어에 따른 AWS SDK를 이미 제공하고 있지만, 장황한 코드보다는 좀 더 쉽게 통합을 할 수 있다는 점에서 Spring Cloud AWS를 사용하는 경우가 있는 것 같다.

그 중에서 Secrets Manager와 Config의 통합을 지원하는 Spring Cloud AWS Secrets Manager Config는 Secrets Manager에 있는 환경 변수를 import하는 것 역시 Spring Cloud Config Server / Client처럼 application.yml에 설정 몇 줄을 적어서 쉽게 처리할 수 있다.

Spring Cloud AWS Secrets Manager Config 연동

AWS Configure (로컬 환경인 경우)

https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
EC2, ECS와 같이 AWS에서 제공해주는 인스턴스, 또는 Capacity Options 내에서라면 AWS 인증 자격을 확인할 수 있도록 AWS CLI가 설치되어 있으나, 개인 사용자라면 AWS CLI를 설치해주어야 한다.

위의 링크에 따라 자신이 사용하고 있는 OS에 맞는 AWS CLI를 설치해주고, 다음 명령어로 정상적으로 CLI가 설치되었는지 확인해준다.

aws --version

그 이후, 자신이 사용하고 있는 AWS 계정에 대한 AWS 인증을 다음 명령어로 설정해줘야 한다.

aws configure

# 아래 입력창에서 Access Key, Secret Access Key, region name 입력
AWS Access Key ID [None]: 
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-2
Default output format [None]:

이러한 작업을 통해, 현재 호스트가 AWS 인증 자격을 식별하게 됨으로서 자신의 계정에서 사용 중인 서비스에 대한 접근을 할 수 있게 된다. (물론 서비스마다 권한이 다르게 설정되어 있다면, 계정에서 권한을 받아야 한다)

Secrets Manager에 보안 암호 등록

AWS Secrets Manager 서비스에 들어가서 보안 암호를 생성한다. 보안 암호 유형은 다른 유형의 보안 암호를 선택하고, 키/값 페어에 환경 변수명을 키로, 환경 변수 값을 값으로 두어 작성해둔다.

암호화 키는 위에서 이야기했던 대로 AWS Secrets Manager를 무료로 사용하려면 aws/secretsmanager로 설정해주어야 한다.

의존성 추가

Spring Cloud AWS Secrets Manager Config 의존성을 추가한다.

implementation 'io.awspring.cloud:spring-cloud-starter-aws-secrets-manager-config:2.4.4'

application.yml 수정

application.yml 내에 spring.config.import 하위에 다음과 같이 작성해둔다.

spring:
  config:
    activate:
      on-profile: local
    import:
      - 'aws-secretsmanager:<보안 암호 이름>'

VM Option 수정

어플리케이션을 실행시키기 전에 VM 옵션을 수정해주어야 하는데, EC2 환경이 아닐 경우 다음 옵션을 추가해주어야 정상적으로 실행된다. -Dcom.amazonaws.sdk.disableEc2Metadata=true

적용 후기

컨테이너으로 어플리케이션을 배포할 경우, Dockerfile이나 Docker-Compose 명세 파일에서 환경 변수를 지정해주거나 Kubernetes를 사용한다면 Pod 명세 파일 또는 ConfigMap, Secret을 사용하여 환경 변수를 불러올 수 있다. 그게 아니더라도 ECS를 사용한다면 태스크 정의에서 환경 변수를 집어넣어줄 수 있다.

그러나 위와 같은 경우는 보통 개발, 스테이징, 운영 환경에서 배포될 때 사용되지만 개발 환경에 배포되기 전인 개인 환경에서 환경 변수를 불러들여야 하는 경우 대부분 env 파일을 사용하게 되는데, 이 경우 일단 개발자 수만큼 파일을 공유해야 하는 비용이 발생하며 환경 변수의 수정이 발생하면 그에 따른 추가 비용이 발생하게 된다.

하지만 이러한 환경 변수들을 로컬에서도 파일이 아닌 Secrets Manager에서 불러오게 된다면 개인 개발자는 AWS CLI 설정 작업과 보안 암호에 대한 접근 권한만 획득한다면 쉽게 환경 변수를 사용할 수 있게 된다.

뿐만 아니라 보안 암호는 여러 개를 만들 수 있으며, 여러 개를 import 할 수 있기 때문에 한 어플리케이션에서 다양한 환경 변수가 담긴 보안 암호들을 선택적으로 가져올 수 있다는 장점도 있다.

그리고 환경 변수 중에는 민감 정보도 포함되어 있는데, 어떠한 명세 파일이던 간에 이러한 민감 정보에 대한 접근 제어가 힘든 편이지만 AWS Secrets Manager는 보안 암호에 대한 접근 제어도 가능하기 때문에 민감 정보에 대한 관리도 보다 쉽다고 할 수 있겠다.

마지막으로 환경 변수 자체에 대한 버전 관리와, 주기적인 업데이트 기능도 제공하고 있는데 직접 사용해보진 않았지만 적어도 환경 변수가 바뀔 경우 env 파일에 대한 수정과 이러한 이력을 직접 남기거나, 혹은 Dockerfile과 같은 명세 파일을 수정하고 커밋하는 식으로 이력을 남기는 것 대신, AWS Secrets Manager 자체에서 환경 변수의 버전 관리를 하고 주기적인 업데이트도 자동화 할 수 있다는 점은 충분히 좋은 메리트가 있다고 생각된다.

이제는 로컬에서도 env 파일을 사용하지 않고 있어서 보다 환경 변수 관련해서 이전보다 쾌적함을 느끼고 있는데, 이후에 버전 관리나 업데이트 기능을 사용하게 된다면 추가적으로 글을 작성해보고 싶다.

profile
Backend Developer

0개의 댓글