본문 바로가기

Java and Spring

Spring Boot에서 AWS Parameter Store 사용

프로젝트를 Github에 올리게 되면, application.yml에 있는 DB 접속정보, Jwt에 사용되는 secret key와 같은 중요 정보가 모두에게 노출 될 수 있습니다. 이런 중요 정보를 노출하지 않기위해 사용하는 방식에는 jasypt 암호화 방식, Git 서브모듈 등 여러가지 방식이 있지만, 이번 포스팅에서는 AWS에서 원격으로 설정값을 제공해주는 서비스인 파라미터 스토어에 대해 포스팅 해보려고합니다.

1. AWS Parameter Store 적용

1 - 1. Parameter Store 세팅

먼저 Parameter Store을 검색해서 들어가셔서 파라미터 생성 버튼을 클릭합니다.

그 후 이름, 설명을 입력하시고, 보안 문자열을 선택합니다.

1. 이름 같은 경우에는 아래 규칙에 따라 작성해주셔야합니다.

  • {prefix}/{name}{profileSeparator}{profile}/parameter.key
  • prefix = marcket, name = db, parameter.key = db_url
  • profileSeparator = _, profile = was1
  • prefix, name, profileSeparator, profile은 application.yml에 설정값 참조

2. 유형은 보안 문자열을 선택합니다.

  • 파라미터값이 암호화되어 저장됩니다.

3. 맨 아래 값은 저장할 값을 입력합니다.

  • 실제 application.yml에 노출되면 안되는 값을 입력합니다.

1 - 2. IAM 사용자 추가

IAM 사용자를 추가하는 이유는 로컬에서 Parameter Store의 값을 정상적으로 가지고 오는지 테스트하기위해 Key를 발급받아야 하기 때문입니다. 만약에 로컬에서 테스트가 필요없으신 분들은 해당 EC2의 IAM 역할에만 SSM권한을 추가해주면 됩니다. AWS IAM에 들어가서 사용자 생성 버튼을 클릭합니다.

 

사용자 이름을 입력하고 다음 버튼을 클릭합니다.

 

직접 정책 연결을 클릭하고 ssm으로 검색 후, 조회에만 사용할 key를 발급받으신다면 ReadOnlyAccess 그 외에 다른 작업을 하시려면 FullAccess를 클릭하시면 됩니다.

 

맨 아래 다음버튼을 누르면 아래와 같은 화면이 뜨게됩니다.

사용자 생성 버튼을 클릭하면 사용자가 생성됩니다.

1 - 3. ACCESS KEY 발급

이제 로컬에서 AWS Parameter Store에 접근 가능하도록 엑세스키를 발급받도록 하겠습니다.

생성된 사용자를 클릭하고 엑세스 키 만들기를 클릭합니다.

AWS 컴퓨팅 서비스에서 실행되는 애플리케이션을 클릭하고 다음을 누릅니다.

엑세스 키 만들기를 클릭합니다.

엑세스키와 비밀 엑세스 키를 발급받고 유출되지 않도록합니다.

.csv 파일 다운로드를 누르면 저 안에 2개의 키값이 존재합니다.

1 - 4. ACCESS KEY 사용하기

제가 사용하는 서버는 AWS EC2이므로 aws client를 설치하고 Access Key설정을 하였습니다.

vim ~/.aws/credentials
[default]
aws_access_key_id=생성된 access_key_id 
aws_secret_access_key=생성된 secret_access_key

위와 같은 명령어를 치게되면 설정파일에 발급받은 key들을 입력할 수 있습니다.

vim ~/.aws/config
[default]
region=ap-northeast-2
output=json

위와 같은 명령어를 치게되면 설정파일에 지역과 출력방식을 입력할 수 있습니다.

1 - 5. IAM 역할 생성

밑줄 친 parameter_store_marcket 역할을 EC2에 주기위해 역할 생성을 해보도록 하겠습니다.

 

역할 생성을 누르면 아래와 같은 화면이 뜨게됩니다.

 

EC2를 선택하고 다음을 누릅니다.

 

SSMFullAccess를 선택하고 역할을 생성합니다.

 

EC2에 방금 생성한 역할을 적용하기위해 보안 -> IAM 역할 수정을 클릭합니다.

그리고 위에서 만든 IAM 역할을 현재 구동중인 EC2에 적용합니다.

2. Spring Boot 코드 적용

2 - 1. 의존성 주입

dependencyManagement {
	imports {
		mavenBom "io.awspring.cloud:spring-cloud-aws-dependencies:2.3.3"
	}
}

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

2 - 2. application.yml

spring:  
  config:
    import: 'aws-parameterstore:'

aws:
  paramstore:
    enabled: true
    prefix: /marcket
    profile-separator: _
    name: parameter

이 부분은 AWS Parameter Store에서 파라미터 생성하는 부분과 연관이 있습니다.

파라미터가 /marcket/parameter_was1/db_url처럼 생성되어 있다고 가정해보겠습니다.

prefix는 맨앞부분, name은 중간부분, profile-separator은 name과 profile의 중간 연결자로 사용됩니다.

2 - 3. 테스트

application.yml에 있는 DB 접속정보, Jwt에 사용되는 secret key와 같은 중요 정보를 AWS 파라미터 스토어에 저장한 변수들로 받게 설정합니다.

---
spring:
  config:
    activate:
      on-profile: was1
  datasource:
    url: ${db_url}
    username: ${db_username}
    password: ${db_password}
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update

server:
  port: 8090

jwt:
  secret: ${secret}

---
spring:
  config:
    activate:
      on-profile: was2
  datasource:
    url: ${db_url}
    username: ${db_username}
    password: ${db_password}
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update

server:
  port: 8091

jwt:
  secret: ${secret}

 

저의 서버는 EC2이지만, 집에 있는 PC는 윈도우로 로컬에 aws client를 설치하고 해당 명령어로 파라미터 스토어에 저장된 값이 가져와 지는지 테스트해보았습니다. db_username의 값이 admin인것을 확인 할 수 있습니다.

 

실제 EC2 서버에서도 db_username의 값을 가져오는 것을 확인 할 수 있습니다.

'Java and Spring' 카테고리의 다른 글

Virtual Thread란?  (0) 2024.05.28
LogBack을 활용한 Log파일 관리  (0) 2023.12.16
CORS(Cross-Origin Resource-Sharing)란?  (0) 2023.10.21
[Spring] 커넥션 풀과 데이터소스  (0) 2022.04.19
[Java] Message Digest 암호화 방식  (0) 2021.12.22