Infra/AWS

[AWS] Spring 2.7 버전에서 profile에 따른 파라미터 AWS Parameter Store에 등록하기

강서월 2023. 7. 31. 09:35

깃허브에 데이터베이스의 암호와 같은 민감한 정보를 올리면 위험하기에 민감한 정보는 따로 저장해야 한다고 한다. 나는 AWS Parameter Store에 저장하여 불러오는 방식을 택하였다. 

Spring Cloud 버전 확인

자신의 Spring Boot 프로젝트 버전과 맞는지 확인하고 공식 문서에서 자신의 버전과 맞는 Spring Cloud를 결정해야 한다. 

출처 : Spring Documentation

이 글은 다음과 같은 환경에서 진행했다.

 

  • SpringBoot : 2.7.12
  • Java : 11
  • SpringCloud : 2021.0.5

요약

1. Spring Boot 프로젝트 설정
2. AWS Parameter store 설정
3. 콘솔에서 AWS Parameter Store 불러오기

1. Spring Boot 프로젝트 설정

1. build.gradle에 작성한다.

ext {
	set('springCloudVersion', "2021.0.5")
}

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
	implementation 'org.springframework.cloud:spring-cloud-starter-aws-parameter-store-config:2.2.6.RELEASE'
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-starter-parent:${springCloudVersion}"
	}
}

2. /src/main/resources/bootstrap.yml 파일을 생성하여 추가한다. 

spring-cloud-starter-aws-parameter-store-config 에서의 설정값은 기존의 다른 설정 처럼 application.yml 파일을 사용하지 않고, bootstrap.yml 파일을 사용한다. 

aws:
  paramstore:
    enabled: true
    prefix: /config
    name: duroop
    profile-separator: _
  • enabled
    • aws parameter store을 사용 
  • prefix
    • aws parameter store key의 첫번째 구분용
    • /aaa/bbb/ccc 와 같은 구조에서 /aaa를 담당
  • name
    • aws parameter store key의 첫번째 구분용으로 application 이름
    • /aaa/bbb/ccc 와 같은 구조에서 /bbb를 담당
  • profile-separator
    • profile 구분자
    • /aaa/bbb_local/ccc 와 같은 구조에서 profile-separator는 _이며, Spring Boot 애플리케이션 profile이 dev 일 경우 값을 호출할 수 있다.

3. /src/main/resources/application-{profile}.yml 파일을 생성하여 profile 적용

나는 배포 서버와 개발 서버를 두었는데 똑같은 설정은 application.yml 파일에 작성하였고 다른 설정값은 각각의 파일을 생성하였다.

 

배포 서버와 관련된 설정은 application-dev.yml 파일에 작성하였다. 

#application-dev.yml

spring:
  application:
    name: duroop
  config:
    import: bootstrap.yml
  datasource:
    url: ${datasource_url}
    username: ${datasource_username}
    password: ${datasource_password}
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL8Dialect
    hibernate:
      ddl-auto: update
    show-sql: true
  • spring.application.name=duroop
    • 애플리케이션의 이름으로 앞서 작성한 bootstrap.yml의 aws.parameterstore.name은 애플리케이션 이름과 같아야 한다.
    • default : application
  • spring.datasource.url=${datasource_url}
    • spring.datasource.url 이 aws parameter store의 /aaa/bbb/ccc와 같은 구조에서 ccc에 들어가는 구분용이다. datasource_url은 aws parameter store에서 value로 들어가는 값이다.

 

공통 설정값이 담긴 application.yml 파일에 활성화하고 싶은 profile을 작성한다. 

#applicationl.yml

spring:
  profiles:
    active: dev

2. AWS Parameter Store 설정

1. AWS Parameter Store에 접속하여 key-value값으로 parameter를 등록한다. 

  • 이름
    • key 값으로 {prefix}/{name}{profile-separator}{profile}/parameter.key
    • bootstrap.yml 파일에 설정한대로 작성해준다.
  •  유형
    • 보안 문자열: 파라미터 값이 암호화 되어 관리
    • 파라미터로 관리되길 원하는 값을 등록

등록한 파라미터 스토어 목록

2. EC2 배포 시 EC2에 할당된 IAM Role 에 SSM 권한 추가

배포하려는 ec2 > 보안 > IAM 역할로 IAM Role을 수정하는 페이지로 이동하게 된다. 권한 > 권한 추가  > 정책 연결 페이지에서 추가할 권한을 선택한다. 

 

조회에만 사용하기 위해서는 AmazonSSMReadOnlyAccess를, 조회 외에 제어는 AmazonSSMFullAccess 권한을 추가한다.

3. 콘솔에서 AWS Parameter Store 불러오기

$(aws ssm get-parameters —name /aaa/bbb/password —with-decryption —query Parameters[0].Value)
  • -with-decryption : 보안 문자열이 아닌 경우 생략해도 된다

 

혹시 이 방법이 잘되지 않는다면 꼬옥 자신의 Spring Boot 버전을 확인해보시길..