Spring Boot Admin 설정


Spring Boot Admin은 Spring Boot에서 제공하는 Actuator endpoints를 이용해서 모니터링 할 수 있게 UI를 제공해주는 프로젝트이다. Spring Boot Admin을 사용 하기 위해서는 서버를 설정 해야된다.

Spring Boot Admin

Spring Boot Admin Maven Dependency

pom.xml
1
2
3
4
5
6
7
8
9
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

@EnableAdminServer 추가

AdminmonitorApplication
1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableAdminServer
public class AdminmonitorApplication {

public static void main(String[] args) {
SpringApplication.run(AdminmonitorApplication.class, args);
}

}

실행 결과 로그

실행 로그를 보면 actuator를 이용해서 endpoint를 확인 한다.

Spring Boot Client

Spring Boot Client Maven Dependency

pom.xml
1
2
3
4
5
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.1.4</version>
</dependency>

application.yaml 설정

application.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spring
boot:
admin:
client:
url: http://localhost:8080
# war 로 기동시 service-url 추가 해야줘됨.
instance:
service-url: http://localhost:8080

management:
endpoints:
web:
exposure:
include: "*"

server:
port: 18080
  1. spring.boot.admin.client.url은 Spring Boot Admin 서버의 URL
  2. management.endpoints.web.exposure.include은 노출시킬 EndPoint 지정(*는 전체 노출)

localhost:8080 접속 화면


기타 설정 방법

Spring Boot Admin에서 제공하는 여러가지 기타 설정 방법을 설명한다.

Logfile Viewer

Spring Boot Admin로그 파일은 End Point 에서 자동으로 접근 할 수 없다. 그래서 Spring Boot에 있는 로그 파일을 Actuator endpoints에 설정을 해줘야된다.

logback-spring.xml 추가

Log 파일을 생성 하기 위해서 /src/main/resource/logback-spring.xml을 생성 Spring Logback 설명

logback-spring.xml
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
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>

<!--로그 파일 저장 위치-->
<property name="LOG_FILE" value="C:/logs/logback/client.log"/>

<appender name="ROLLING-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>10</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
</appender>

<logger name="me.actuator" level="debug" additivity="false">
<!-- ref="appender name 지정" -->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ROLLING-FILE"/>
</logger>
<root level="debug">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ROLLING-FILE"/>
</root>

</configuration>

application.yaml 추가

application.yaml
1
2
3
4
logging:
file: C:/logs/logback/client.log
pattern:
file: -%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx
  1. logging.fileSpring Boot Admin에서 읽을 log파일 위치 설정
  2. logging.pattern.file은 로그 패턴에 색깔을 넣는다.

Spring Boot Admin Logfile Viewer 확인

실시간으로 저장(C:/logs/logback/client.log)되는 로그를 확인 할 수 있다.

EndPoint Customizing

application.yaml에 추가

application.yaml
1
2
3
4
5
management:
endpoints:
web:
exposure:
include: "*"

  1. management.endpoints.web.exposure.include 추가 할 EndPoint 설정
    EndPoint 관련 참조

Security

Spring Boot Admin은 기본적으로 로그인/로그아웃 기능을 제공하지 않지만, Spring-Security를 이용해서 로그인/로그아웃 기능을 만들 수 있다.

Spring Boot Admin

  1. Spring Security Maven Dependency

    pom.xml
    1
    2
    3
    4
    5
    6
    7
    8
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  2. /src/main/SecuritySecureConfig.java 파일 추가

    SecuritySecureConfig.java
    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
    @Configuration
    public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
    private final AdminServerProperties adminServer;

    public SecuritySecureConfig(AdminServerProperties adminServer) {
    this.adminServer = adminServer;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    successHandler.setTargetUrlParameter("redirectTo");
    successHandler.setDefaultTargetUrl(this.adminServer.path("/"));

    http.authorizeRequests()
    .antMatchers(this.adminServer.path("/assets/**")).permitAll() // <1>
    .antMatchers(this.adminServer.path("/login")).permitAll()
    .anyRequest().authenticated() // <2>
    .and()
    .formLogin().loginPage(this.adminServer.path("/login")).successHandler(successHandler).and() // <3>
    .logout().logoutUrl(this.adminServer.path("/logout")).and()
    .httpBasic().and() // <4>
    .csrf()
    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) // <5>
    .ignoringAntMatchers(
    this.adminServer.path("/instances"), // <6>
    this.adminServer.path("/actuator/**") // <7>
    );
    // @formatter:on
    }
    }
    // end::configuration-spring-security[]
  1. 모든 로그인 페이지에 대한 권한을 부여한다.
  2. 권한이 부여되지 않으면 인증을 요청 한다.
  3. 로그인 및 로그 아웃을 구성한다.
  4. Spring Boot Admin 클라이언트를 등록하기 위해 HTTP-Basic 지원을 사용한다.
  5. 쿠키를 사용하여 CSRF 보호 기능 구현
  6. CRSF를 비활성화한다.
  7. actuator EndPoint 대한 CRSF 보호를 비활성화한다.
  1. application.yaml 추가
    application.yaml
    1
    2
    3
    4
    5
    spring:
    security:
    user:
    name: jaehyun
    password: 1234

Spring Boot Client

  1. Spring Security Maven Dependency

    pom.xml
    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  2. Spring Boot Client에서 Security 전체 허용 추가
    /src/main/SecurityPermitAllConfig.java 생성

    SecurityPermitAllConfig.java
    1
    2
    3
    4
    5
    6
    7
    8
    @Configuration
    public class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().permitAll()
    .and().csrf().disable();
    }
    }
  3. application.yaml 추가

    application.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    spring:
    boot:
    admin:
    client:
    url: http://localhost:8080
    username: jaehyun
    password: 1234
    instance:
    metadata:
    user.name: jaehyun
    user.password: 1234

Security 실행 화면(http://localhost:8080)

jaehyun/1234 입력 후 접속


Spring Boot Amdin 소스코드

Spring Boot Client 소스코드

참조