Manage Env like a Pro เลิกแก้ไฟล์ .env มือเปล่า เปลี่ยน Config ให้เป็น Code ด้วย Spring Cloud Config
ปัญหา: "Black Box Deployment"
เวลาเรา Deploy ขึ้น Server ปัญหาที่เจอบ่อยคือ:
- Blindness: ตอนนี้ Server รันด้วยค่าอะไรอยู่? (ต้อง SSH ไป
cat .envดู ซึ่งไม่ปลอดภัย) - Manual Error: ลืมเพิ่ม Env ตัวใหม่ที่เพิ่งเขียนเสร็จ ทำให้ App พังตอน Start
- No History: ใครเป็นคนเปลี่ยน Timeout จาก 5000 เป็น 3000? ไม่มีใครรู้
Level 1: "Fail Fast" (ป้องกัน Env หายด้วย Code)
ก่อนจะไปท่าใหญ่ เอาท่าพื้นฐานให้แน่นก่อนครับ เราสามารถบังคับให้ App Start ไม่ขึ้น ถ้า Env ไม่ครบ
วิธีทำ: ใช้ @ConfigurationProperties + Validation (ตามบทความก่อนหน้านี้)
@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
management:
endpoints:
web:
exposure:
include: "env, configprops"
endpoint:
env:
show-values: always # โชว์ค่าให้เห็น (ระวังเรื่อง Security!)
2. Sanitize ความลับ (สำคัญมาก!)
Spring ฉลาดพอที่จะปิดบังคำว่า password, secret, key ให้เป็น ****** แต่ถ้าคุณตั้งชื่อตัวแปรแปลกๆ คุณต้องบอกมันด้วย
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
- Config Server: เป็น Spring Boot App ตัวกลาง ทำหน้าที่อ่านไฟล์จาก Git Config Repo
- Client App (Microservices): ตอน Start จะไม่valid อ่านไฟล์ในเครื่องตัวเอง แต่จะวิ่งไปถาม Config Server ว่า "ขอ Config ของ Environment Production หน่อย"
วิธีทำแบบย่อ
1. สร้าง Git Repo สำหรับเก็บ Config (นี่คือ Database ของ Config) ใน Repo นี้จะมีไฟล์:
gateway-service-prod.ymlpayment-service-prod.yml
2. สร้าง Config Server (ตัวกลาง)
@SpringBootApplication
@EnableConfigServer // แปะ annotation เดียวจบ
public class ConfigServerApplication { ... }
# 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 ทิ้ง เหลือแค่บอกว่าตัวเองชื่ออะไร
# bootstrap.yml (ไฟล์ที่โหลดก่อน application.yml)
spring:
application:
name: payment-service
cloud:
config:
uri: http://config-server:8888 # ชี้ไปหาตัวกลาง
- Audit Log: อยากรู้ว่าใครเปลี่ยน DB Password? ไปดู
git logใน Config Repo ได้เลย รู้หมดว่าใครแก้ แก้เมื่อไหร่ - Rollback: ถ้าแก้ Env แล้ว Server พัง ก็แค่
git revertใน Config Repo แล้ว Restart App จบ! - 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" ครับ
No responses yet. Be the first to respond.