Spring

[Spring] - Spring Boot 2.4 이상 환경에서 AWS Parameter Store 적용하기

김종현 2022. 1. 29. 20:18

회사 소스코드 application.yml 설정파일을 보면 데이터베이스 접속정보, api키값 등 보안에 민감한 데이터가 있어서 이러한 데이터를 외부에서 직접 주입 할 수 있도록 구성하려고 이것 저것 알아보다가 AWS 서비스중 하나인 Parameter Store 에 대해 알게되었는데 비용도 무료고 괜찮아 보여서 적용해보도록 하였다.

 

Spring Boot 환경에서 AWS Parameter Store를 적용하는 블로그 글들은 많이 봤지만 Spring Boot 2.4 이상 환경에서 적용하려고 했지만 제대로 동작하지는 않았다. 여기를 보면 Spring Cloud 버전과 호환되는 Spring Boot 버전을 확인할 수 있는데 버전을 맞춰도 안되는건 마찬가지 였다.

 

필자는 Spring Boot 버전이 2.6이어서 호환되는 Spring Cloud 2021.0.0 버전을 사용하려고 했는데 Spring Cloud AWS Parameter Store Dependency를 찾을 수 없는게 그 이유였다.

 

그래서 계속 찾다보니 Spring Boot 2.4 이상의 버전과 호환되는 Spring Cloud AWS 2.3이 나왔다는 공식문서를 확인했다. 기존과는 설정하는 방식이 다르지만 지금부터 필자와 함께 구성해보도록 하자.

 

그전에 Spring Boot 2.4 이전 버전에서의 Spring Cloud AWS Parameter Store를 적용하는 방법은 여기에 잘 정리되있으니 기존구성에 대해 모르면 한번보도록 하자.

프로젝트 환경

  • JAVA 11
  • Spring Boot 2.6.3
  • MySQL 8.0
  • Maven
  • Amazon EC2
  • Amazon Systems Manager Parameter Store
  • Docker

Spring Cloud AWS + AWS Parameter Store Config Dependencies 추가

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.awspring.cloud</groupId>
            <artifactId>spring-cloud-aws-dependencies</artifactId>
            <version>2.3.3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependency>
    <groupId>io.awspring.cloud</groupId>
    <artifactId>spring-cloud-starter-aws-parameter-store-config</artifactId>
</dependency>
dependencyManagement {
    imports {
        mavenBom "io.awspring.cloud:spring-cloud-aws-dependencies:2.3.3"
    }
}

dependencies {
    implementation group: 'io.awspring.cloud', name: 'spring-cloud-starter-aws-parameter-store-config'
}

application.yml 세팅

spring:
  config:
    activate:
      on-profile: local
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mysql?useSSL=false&serverTimezone=UTC&characterEncoding=utf8&allowPublicKeyRetrieval=true
    username: root
    password: 1234
---
spring:
  config:
    activate:
      on-profile: production
    import: 'aws-parameterstore:'
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: ${jdbc.url}
    username: ${jdbc.username}
    password: ${jdbc.password}
aws:
  paramstore:
    enabled: true
    prefix: /config
    profile-separator: _
    name: kimjonghyun

Spring Boot 2.4 이전버전에서는 'bootstrap.yml' 이라는 파일을 생성하여 aws.paramstore에 대한 프로퍼티구성을 할 수 있는데 2.4 이후에서는 'bootstrap.yml' 파일을 로드하지않고 application.yml에서 spring.config.import='aws-parameterstore:' 라고 지정해두면 자동설정을 구성할 수 있다.

 

데이터베이스 접속정보를 암호화하려고 하는데 로컬환경에서는 로컬DB를 바라보게하고 운영환경에서는 운영DB를 바라보게끔 구성할 예정인데 운영DB의 접속정보를 AWS Parameter Store에 추가할 예정이다.

 

AWS Parameter Store에 파라미터를 추가할 때 파라미터에 대한 규칙이 있는데 다음과 같다.

{prefix}/{name}{profile-separator}{profile}/key

prefix

  • 파라미터의 접두사를 지정할 수 있다. 주의해야할 점은 해당값은 /로 시작해야한다.
  • default : /config

name

  • 파라미터의 식별자 애플리케이션이름이다. 해당 파라미터를 어떤 애플리케이션에 적용할건지를 지정할 수 있다.
  • 만일 해당값을 지정하지 않으면 spring.application.name 속성에 정의된 값을 참조하게 된다.
  • 해당 속성마저도 없으면 'application' 이라는 이름이 부여된다.
  • default : application

profile-separator

  • 하나의 애플리케이션을 여러환경에 배포할 수 있게끔 구분자를 지정해두는데 이 속성은 위 name과 같이 쓰인다.
  • 데이터베이스 엔드포인트 값을 예로들면 /config/kimjonghyun_local/jdbc.url, /config/kimjonghyun_production/jdbc.url 이렇게 구성된다.
  • default : _

profile

  • spring.config.activate.on-profile에 정의된 값이다.

enabled

  • AwsParamStoreBootstrapConfiguration를 활성화 한다.
  • default : true

AWS Parameter Store에 파라미터 추가

AWS SSM 콘솔에 들어가서 좌측메뉴 '파라미터 스토어'를 누르고 파라미터를 추가하자. 비용은 무료이며 한번 생성하면 이름은 변경이 안되고 데이터만 변경이 가능하다.



jdbc.url, jdbc.username, jdbc.password 라는 key값으로 파라미터를 생성한다. 그러면 EC2에서 애플리케이션이 구동될 때 여기에 등록된 값을 참조하게 된다.

 

IAM 역할생성

역할을 생성해야하는데 생성할 때 AmazonSSMReadOnlyAccess 정책을 연결해준다.

 

EC2에 IAM 역할부여

위에서 생성한 IAM 역할을 EC2 인스턴스에 부여한다.

 

EC2에 JAVA, Docker 설치 및 MySQL Container 실행

sudo amazon-linux-extras install -y java-openjdk11
sudo yum install -y docker
sudo systemctl start docker
sudo docker pull mysql
sudo docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 $(sudo docker images | grep -v awk | awk '/mysql/ {print $3}')

JAVA, Docker를 설치하고 MySQL Container를 생성하자.



데이터베이스 연동이 정상적으로 된 걸 보면 AWS Parameter Store에 저장된 데이터를 잘 불러온 것이다.

 

참고

https://docs.awspring.io/spring-cloud-aws/docs/2.3.0/reference/html/index.html#integrating-your-spring-cloud-application-with-the-aws-parameter-store

728x90