spring cloud vault 으로 vault 연동
사내에 vault 서버가 있고 이곳에 주요정보들을 보관하고 있다. Spring 환경어어서 기존 프로젝트 들에서는 아래 의존성을 사용했었다.
org.springframework.vault:spring-vault-core
사용법은 매우 간단하다.
application.yml 파일에 아래와 같이 접속정보를 정의하고
vault:
uri: https://vault....
token: ...
Configuration 클래스는 아래와 같이 정의하면 된다.
@Configuration
@Import(EnvironmentVaultConfiguration.class)
@VaultPropertySource(value = {"secret/application/sandbox/db-info"}, propertyNamePrefix = "db-info.")
public class VaultConfig {
}
그리고 필요한 곳에서 아래와 같이 값을 사용하면 된다.
@Configuration
@RequiredArgsConstructor
public class CoreDataSourceConfig {
private final Environment env;
@Bean
@ConfigurationProperties(prefix = "spring.datasource.mpoc.hikari")
public HikariConfig hikariConfigMpoc() {
HikariConfig HikariConfig = new HikariConfig();
HikariConfig.setJdbcUrl(env.getProperty("db-info.url"));
HikariConfig.setUsername(env.getProperty("db-info.username"));
HikariConfig.setPassword(env.getProperty("db-info.password"));
return HikariConfig;
}
}
그런데 Spring 에서 spring-cloud 프로젝트가 활발하게 관리되고 있는 것 같아 해당 프로젝트에 포함된 의존성은 되도록 그걸 사용하는게 좋다고 판단해서 이번에는 아래 의존성을 활용했다.
org.springframework.cloud:spring-cloud-starter-vault-config
우선 application.yml 에 아래와 같은 내용을 추가한다.
spring:
cloud.vault:
host: ...
port: 443
scheme: https
authentication: TOKEN
token: ...
kv:
enabled: true
backend: secret
profile-separator: '/'
default-context: dev/wallet/sandbox
application-name:
profiles:
config:
import:
- vault://
여기에서 중요한 것은 profiles 은 반드시 공란으로 둬야 한다는 것이다. 이는 기본적으로 spring.profiles.active 이 사용되는데 위와 같다면 빈문자열로 재정의 된다.
이렇게 하는 이유는 위 설정에 따라 아래와 같은 다수의 secret path 와 연결을 시도하기 때문이다.
/{backend}/{default-context}
/{backend}/{default-context}/{profiles}
/{backend}/{application-name}
/{backend}/{application-name}/{profiles}
이 중 실제 존재하지 않는 secret path 는 연결이 실패하게 된다. 이에 해당하는 secret path를 모두 만들어서 활용한다면 상관없지만 그럴게 아니라면 위와 같이 명시적으로 빈문자열로 정의해줘야 연결을 시도 하지 않는다. 위 설정대로라면 아래와 같은 secret path 로만 연결을 시도한다.
/{backend}/{default-context}
위 secret path 에 정의되어 있는 key/value 는 그냥 application.yml 의 값을 읽는 것처럼 바인딩 해서 사용하면 된다.
예를 들어 아래와 같은 key/value 가 정의되어 있다면
vault.dbUrl / jdbc
@ConfigurationProperties("vault")를 활용해서 class 에 값을 바인딩해서 사용할 수 있다.