Manage Env like a Pro เลิกแก้ไฟล์ .env มือเปล่า เปลี่ยน Config ให้เป็น Code ด้วย Spring Cloud Config

February 05, 2026 · 3 min read · 1 views

ปัญหา: "Black Box Deployment"

เวลาเรา Deploy ขึ้น Server ปัญหาที่เจอบ่อยคือ:

  1. Blindness: ตอนนี้ Server รันด้วยค่าอะไรอยู่? (ต้อง SSH ไป cat .env ดู ซึ่งไม่ปลอดภัย)
  2. Manual Error: ลืมเพิ่ม Env ตัวใหม่ที่เพิ่งเขียนเสร็จ ทำให้ App พังตอน Start
  3. No History: ใครเป็นคนเปลี่ยน Timeout จาก 5000 เป็น 3000? ไม่มีใครรู้

Level 1: "Fail Fast" (ป้องกัน Env หายด้วย Code)

ก่อนจะไปท่าใหญ่ เอาท่าพื้นฐานให้แน่นก่อนครับ เราสามารถบังคับให้ App Start ไม่ขึ้น ถ้า Env ไม่ครบ

วิธีทำ: ใช้ @ConfigurationProperties + Validation (ตามบทความก่อนหน้านี้)

java
@ConfigurationProperties(prefix = "app")
@Validated // 1. บังคับตรวจ
public class AppConfig {

    @NotBlank(message = "เฮ้ย! ลืมใส่ app.api-key ใน Server หรือเปล่า?") // 2. ด่าทันทีถ้าค่าว่าง
    private String apiKey;

    // Getter, Setter...
}

ผลลัพธ์: ถ้าคุณลืมใส่ Env ใน Server แล้วกด Deploy App จะ Crash ทันที พร้อม Error Message ชัดเจน ไม่ต้องรอไปพังตอน User ใช้งาน


Level 2: "Visibility" (ดู Env ปัจจุบันผ่าน Actuator)

ถ้าอยากรู้ว่า "ตอนนี้ Server ใช้ค่าอะไรอยู่" โดยไม่ต้อง SSH เข้าไป ให้ใช้ Spring Boot Actuator

1. เปิด Endpoint /env

yaml
management:
  endpoints:
    web:
      exposure:
        include: "env, configprops"
  endpoint:
    env:
      show-values: always # โชว์ค่าให้เห็น (ระวังเรื่อง Security!)

2. Sanitize ความลับ (สำคัญมาก!) Spring ฉลาดพอที่จะปิดบังคำว่า password, secret, key ให้เป็น ****** แต่ถ้าคุณตั้งชื่อตัวแปรแปลกๆ คุณต้องบอกมันด้วย

yaml
management:
  endpoint:
    env:
      keys-to-sanitize: "my-secret-token, credit-card-number" # บอกให้ปิดบังค่าพวกนี้ด้วย

Level 3: "Configuration Migration" (Spring Cloud Config)

นี่คือคำตอบของคำถาม "ทำให้เหมือน DB Migrate ได้ไหม?"

แนวคิดคือ: แยก Config ออกจาก Code และเก็บไว้ใน Git อีก repo หนึ่ง

  • Code Repo: เก็บแค่ Java Code
  • Config Repo: เก็บไฟล์ application-prod.yml, application-dev.yml

เมื่อเราแก้ Config ใน Git -> มันคือการทำ Version Control (Migration) ให้ Config โดยอัตโนมัติ!

Architecture

  1. Config Server: เป็น Spring Boot App ตัวกลาง ทำหน้าที่อ่านไฟล์จาก Git Config Repo
  2. Client App (Microservices): ตอน Start จะไม่valid อ่านไฟล์ในเครื่องตัวเอง แต่จะวิ่งไปถาม Config Server ว่า "ขอ Config ของ Environment Production หน่อย"

วิธีทำแบบย่อ

1. สร้าง Git Repo สำหรับเก็บ Config (นี่คือ Database ของ Config) ใน Repo นี้จะมีไฟล์:

  • gateway-service-prod.yml
  • payment-service-prod.yml

2. สร้าง Config Server (ตัวกลาง)

java
@SpringBootApplication
@EnableConfigServer // แปะ annotation เดียวจบ
public class ConfigServerApplication { ... }
yaml
# application.yml ของ Config Server
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/my-org/my-config-repo # ชี้ไปที่ Git ข้อ 1

3. ฝั่ง Client App (ตัวใช้งาน) เพิ่ม dependency spring-cloud-starter-config และลบไฟล์ application.yml ทิ้ง เหลือแค่บอกว่าตัวเองชื่ออะไร

yaml
# bootstrap.yml (ไฟล์ที่โหลดก่อน application.yml)
spring:
  application:
    name: payment-service
  cloud:
    config:
      uri: http://config-server:8888 # ชี้ไปหาตัวกลาง
  1. Audit Log: อยากรู้ว่าใครเปลี่ยน DB Password? ไปดู git log ใน Config Repo ได้เลย รู้หมดว่าใครแก้ แก้เมื่อไหร่
  2. Rollback: ถ้าแก้ Env แล้ว Server พัง ก็แค่ git revert ใน Config Repo แล้ว Restart App จบ!
  3. One Place: แก้ที่เดียว (Git) มีผลกับทุก Server ไม่ต้อง SSH เข้าไปแก้ทีละเครื่อง

ข้อควรระวัง (Secrets)

การเก็บ Password ลง Git (แม้จะเป็น Private Repo) ก็ยังไม่ปลอดภัย 100% ทางแก้: Spring Cloud Config รองรับ Jasypt หรือ Cipher เพื่อ Encrypt ข้อมูลใน Git ได้ (เก็บเป็น ciphertext อ่านไม่ออก ต้องผ่าน Config Server ถึงจะถอดรหัสได้)


บทสรุป

ถ้า App ยังเล็ก -> ใช้ Level 1 (Validation) + Level 2 (Actuator) ก็เพียงพอ ถ้า App เริ่มมีหลาย Service หรือ Deploy บ่อย -> ใช้ Spring Cloud Config เพื่อทำ "Configuration as Code" ครับ 

Responses (0)

No responses yet. Be the first to respond.