SpringFramework/Spring

Spring Vault 연동(datasource 연결 포함)

lovineff 2021. 3. 19. 16:48

Spring Vault 연동 예제

SpringBoot 버전 : 2.3.9.RELEASE

Spring 버전 : 5.2.13.RELEASE

Vault 버전 : 2.2.3.RELEASE

config 설정은 따로 빼서 처리해도 되나, 소스가 복잡해지는것을 막기 위해 하나의 클래스에서 모두 처리

@Configuration
public class VaultConfig extends AbstractVaultConfiguration {
	@Value("${vault_url}")
	private URI url;

	@Value("${vault_role_id}")
	private String roleId;

	@Value("${vault_secret_id}")
	private String secretId;

	@Value("${datasource_url}")
	private String databaseUrl;

	@Value("${vault_path}")
	private String vaultPath;

	@Value("${spring.datasource.driver-class-name}")
	private String driverClassName;

	@Override
	public VaultEndpoint vaultEndpoint() {
		return VaultEndpoint.from(url);
	}

	@Override
	public ClientAuthentication clientAuthentication() {
		AppRoleAuthenticationOptions options = AppRoleAuthenticationOptions.builder()
				.roleId(AppRoleAuthenticationOptions.RoleId.provided(roleId))
				.secretId(AppRoleAuthenticationOptions.SecretId.provided(secretId))
				.build();
		return new AppRoleAuthentication(options, restOperations());
	}

	@Primary
	@Bean
	public DataSource dataSource() {
		VaultDTO vaultDto = Objects.requireNonNull(vaultTemplate().read(vaultPath, VaultDTO.class)).getData();
		return DataSourceBuilder
				.create()
				.driverClassName(driverClassName)
				.url(databaseUrl)
				.username(vaultDto.getUsername())
				.password(vaultDto.getPassword())
				.build();
	}
}

 

Vault가 버전업되면서 VaultTemplate를 자동 주입받아 사용하지 못하도록 변경되었다.(ThreadSafe)

따라서 static 함수인 vaultTemplate()을 호출하여 vaultTemplate 클래스에 접근한다.

 

ClientAuthentication 선언시 VaultToken을 사용하고자 하는 경우,

다음 공식 문서를 참고한다. (docs.spring.io/spring-vault/docs/2.2.2.RELEASE/reference/html/#vault.core.template.beans)