AWS Secrets Manager + Srping boot 적용하기
언젠가 또 써먹을일이 있지않을까 싶어서 한번 AWS Secretmanager 적용방법을 정리해봅니다.
직접 자바코드로 연동할수도있지만, property에 적용하는 방법으로 Spring Cloud 이용하는 방법을 정리하려합니다.
해당페이지를보면 spring 2.4 부터 지원되나 싶지만, 실제로는 이하 버전도 지원은 되는 상태입니다. 각 버전대로 적용방식을 기록해보겠습니다.
(아마도 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.4-Release-Notes 릴리즈노트에 나와있는대로
spring.config.import 로 직접 설정을 가져올수 있게되면서 2.4이상의 가이드만 노출해놓은것같은 심증이..)
github : https://github.com/awspring/spring-cloud-aws
Spring boot 2.4이상
build.gradle 입니다 버전에 맞게끔 설정해주면 됩니다.
https://mvnrepository.com/artifact/io.awspring.cloud/spring-cloud-aws-starter-secrets-manager
// secrets-manager (버전은 맞춰서 사용하시면 됩니다)
implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.1.1")
implementation 'io.awspring.cloud:spring-cloud-aws-starter-secrets-manager'
그리고 yml또는 properties에 아래와같이 설정합니다. 저는 yml로 설정했습니다.
spring:
config:
import: aws-secretsmanager:{secret-id}
......
username: ${key} // aws-secretsmanager에 설정한 값을 ${}로 감싸서 쓸수있습니다.
추가로 설정할것도없고, 기존 코드에 몇줄 추가되는 방식이여서 너무 간단하게 적용이 됩니다.
Spring boot 2.4미만
해당 방식은 bootstrap.yml을 사용합니다.
gradle기준으로 우선 cloud 관련 설정을 추가합니다.
dependency: https://mvnrepository.com/artifact/io.awspring.cloud/spring-cloud-starter-aws-secrets-manager-config
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
implementation ("io.awspring.cloud:spring-cloud-starter-aws-secrets-manager-config:${awsCloudVersion}")
// spring boot 1.5.8을 사용할때에는 아래 dependency추가도 필요했습니다.
// compile("com.amazonaws:aws-java-sdk-core:1.12.764")
}
그리고 프로젝트 resources 아래에 bootstrap.yml를 생성해줍니다.
aws:
secretsmanager:
region: ap-northeast-2
prefix: dev
defaultContext: product/service
name : ~~
failFast : false # 필수값, 이 값이 true이면 key조회과정에 실패시 에러발생
---
spring:
profiles: qa
aws:
secretsmanager:
prefix: qa
---
spring:
profiles: stage
aws:
secretsmanager:
prefix: prod
---
spring:
profiles: prod
aws:
secretsmanager:
prefix: prod
manager-config를 이용하는경우, 아래의 룰을 이용하여 조회할 secret-id를 생성합니다.
aws.secretsmanager 의 값을 기준으로 적겠습니다.
- prefix + '/' + name
- prefix + '/' + name + '_' + profile
- prefix + '/' + defaultContext ( prefix 가 null이면 defaultContext)
- prefix + '/' + defaultContext + '_' + profile ( prefix 가 null이면 defaultContext + '_' + profile)
해당값들을 key로 만들어서 실제로 조회를 시도합니다. 그리고 failFast 값에 의해서 실패시 에러또는 무시하고 다른키로 재조회하는 로직이 동작됩니다.
해당 코드를 돌려보면 실제 조회가 실패되면 아래와같이 로그가 노출됩니다.
2024-08-23 20:10:39.084 WARN 99394 --- [ main] i.a.c.s.AwsSecretsManagerPropertySources : Unable to load AWS secret from qa/product/service. Secrets Manager can't find the specified secret. (Service: AWSSecretsManager; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: 981224a3-7a9a-4244-a2f2-fd9d8e1f0a48; Proxy: null)
이 방식으로 spring boot 2.4 미만 버전에서도 bootstrap.yml을 이용하여 환경별로 값을 가져오도록 설정이 가능합니다.
뭐 언젠가 또 써먹을일이 있을까 하여 한번 적어봅니다.