앞선 포스트 기본편에서 이어집니다!
[Spring Cloud Config] 설정값을 외부에서 관리하자! - 기본
시작하기 전에 스프링 또는 스프링 부트 개발을 하다 보면 *.properties 혹은 *.yml로 관리되는 환경설정 값이 필연적으로 존재할 수밖에 없습니다. 그리고 이러한 설정 값 중에서는 노출되어서는 안
logical-code.tistory.com
Vault 컨테이너 생성
Docker Image Pull
docker pull vault
Docker Container 생성
이 포스팅에서는 개발용 설정으로 도커 컨테이너를 구동하며, 운영 환경에서 권장되지 않습니다.
개발용 설정에서는 인메모리로 저장소가 생성되며, 개발용 루트 계정 토큰을 설정할 수 있습니다.
docker run –cap-add=IPC_LOCK –e ‘VAULT_DEV_ROOT_TOKEN_ID=myroot’ –p 8200:8200 vault
컨테이너 생성 및 구동 후 http://localhost:8200 으로 접속합니다.
로그인 창이 뜨면 Method를 Token으로 선택하고, 앞서 컨테이너 생성시 설정한 루트 토큰 아이디를 입력합니다.(myroot)
Secret 작성
로그인 후 Enable new engine을 클릭합니다.
Generic > KV를 선택하고 Next 버튼을 클릭합니다.
Path에 test-app을 입력하고 Enable Engine 버튼을 클릭합니다.
생성한 Secret Engine(test-app)에 들어가서 Create secret 버튼을 클릭합니다.
Path for this secret에 설정의 Profile명(local)을 입력하고 Secret data에 설정 값을 입력한 뒤 Save 버튼을 클릭합니다.
같은 방법으로 dev, prod secrets를 추가합니다.
Policy 작성
상단 메뉴에서 Policies를 클릭하고, Create ACL policy를 클릭합니다.
Name에 Policy명(sample-acl)을, Policy에는 권한 내용을 작성하고 Create policy 버튼을 클릭합니다.
(권한 설정 방법 : https://www.vaultproject.io/docs/concepts/policies)
path "test-app/**" {
capabilities = [ "read" ]
}
Authentication Methods 작성
상단 메뉴에서 Access를 클릭하고, Enable new method 버튼을 클릭합니다.
Generic > Username & Password를 선택하고 Next 버튼을 클릭합니다.
Enable Method 버튼을 클릭합니다.
다시 Access 메뉴에서 앞서 추가한 userpass를 클릭하고, Create user 버튼을 클릭합니다.
Username과 Password는 자유롭게 입력하고, 아래 Generated Token's Policies에 앞서 작성한 Policy명(sample-acl)을 입력합니다.
로그아웃 후 앞서 생성한 Username & Password 정보로 로그인합니다.
우측 상단의 사용자 정보 드롭다운을 클릭하고 Copy token을 클릭합니다.
Config Server 생성
스프링 부트 애플리케이션 생성
아래 의존성으로 Config Server 스프링 부트 애플리케이션을 생성합니다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>server</name>
<description>server</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@EnableConfigServer 설정
@EnableConfigServer
@SpringBootApplication
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
application.properties 작성
server.port=8888
spring.profiles.active=vault
spring.cloud.config.server.vault.kv-version=2
spring.cloud.config.server.vault.profile-separator=/
Config Client 생성
스프링 부트 애플리케이션 생성
아래 의존성으로 Config Client 스프링 부트 애플리케이션을 생성합니다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>client</name>
<description>client</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties 작성
server.port=9999
spring.config.import=configserver:http://localhost:8888
spring.cloud.config.name=test-app
spring.cloud.config.profile=${spring.profiles.active}
spring.cloud.config.token=[앞서 복사한 사용자 토큰]
샘플 코드
'🌱 SPRING' 카테고리의 다른 글
[Spring Security] 스프링 시큐리티 주요 아키텍쳐 2 - 인증(Authentication) (0) | 2021.12.10 |
---|---|
[Spring Security] 스프링 시큐리티 주요 아키텍쳐 1 - DelegatingFilterProxy, FilterChainProxy (0) | 2021.12.06 |
[Spring Cloud Config] 설정값을 외부에서 관리하자! - 기본 (0) | 2021.10.10 |
[SpringCloud] Resilience4j와 Spring Cloud Circuit Breaker (0) | 2021.05.16 |
[SpringBoot] 컨트롤러, View(JSP) 작성하기 (0) | 2020.05.30 |