Spring Boot 3rd-party (Sentry + DataDog + Vault) integration 0. 프로젝트 생성

예제 코드는 Github repository에서 확인 가능합니다.


개발을 하다보면 application 개발 뿐만 아니라 APM, Error Tacking tool 등 여러 3rd-party tool을 연동해야하는 경우가 있다.
그리고 이러한 3rd-party tool을 사용할 때 연동 뿐만 아니라 중요한 것은 secret key를 어떻게 관리하냐이다.

이번 포스팅 시리즈에서는 SpringBoot와 Error tacking tool로 Sentry, APM으로 DataDog을 연동하고 이들의 secret key를 Vault를 사용하여 관리하는 방법에 대해 하나씩 알아보도록 하겠다.

프로젝트 생성

먼저 기본이 되는 프로젝트를 생성하자.

Dependency는

  • Lombok
  • Spring Configuration Processor
  • Spring Web
  • DataDog
  • Vault Configuration
    을 추가한다.

프로젝트를 생성한 뒤 실행하면 다음과 같이 오류가 뜨면서 서버가 실행되지 않는다.

1
2
3
4
5
6
7
8
9
10
Caused by: java.lang.IllegalArgumentException: Token (spring.cloud.vault.token) must not be empty
at org.springframework.util.Assert.hasText(Assert.java:287) ~[spring-core-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.cloud.vault.config.ClientAuthenticationFactory.createClientAuthentication(ClientAuthenticationFactory.java:143) ~[spring-cloud-vault-config-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at org.springframework.cloud.vault.config.VaultBootstrapConfiguration.clientAuthentication(VaultBootstrapConfiguration.java:248) ~[spring-cloud-vault-config-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
... 81 common frames omitted

아직 아무런 설정을 하지 않았기 때문에 지금과 같이 오류가 나는 것은 정상적인 결과이다.
일단 설정이 필요한 dependency를 아래와 같이 주석처리하고 앞으로 하나씩 설정하도록 해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
plugins {
id 'org.springframework.boot' version '2.3.4.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}

group = 'io.github.ivvve'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

ext {
set('springCloudVersion', "Hoxton.SR8")
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
// implementation 'org.springframework.cloud:spring-cloud-starter-vault-config'
// runtimeOnly 'io.micrometer:micrometer-registry-datadog'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}

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

test {
useJUnitPlatform()
}
Share