若你的專案有使用到 DataBase 服務,在程式碼裡會撰寫 Connect 到 DB 的方式,通常需要提供主機位置、使用者帳號密碼等相關資訊,而在不同環境下,連線所需的資訊也會有所不同。
db.connect(Host,帳號,密碼)
要如何讓程式在每個環境都能運作,笨一點的方法就是將這些資訊寫死在程式碼,但壞處是每個環境都需要重新配置,且將帳號密碼等資訊放入程式碼也會造成資安問題。
# 在 Dev 環境下
db.connect(localhost,devuser,devpass)
# 在 Prod 環境下
db.connect(DBURL,produser,prodpass)
比較好的做法是將資訊以環境變數儲存,只要在不同環境設置對應的環境變數,不僅可以將帳密等敏感資訊隱藏在背景環境,程式也能直接從環境變數取得資料。
db.connect(env.host, env.user, env.password)
要如何設置環境變數,在 Kubernetes 可以在 yaml 檔案直接設定。
env:
- name: MONGO_HOST
value: mongo
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: MONGO_INITDB_ROOT_USERNAME
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: MONGO_INITDB_ROOT_PASSWORD
若是在開發環境,可以在 .env
檔案定義所需環境變數,並使用 dotenv
工具,讓程式讀取 .env
檔設置的環境變數。
HOST = localhost
USERNAME = localuser
PASSWORD = localpasswd
我們就以 MongoDB 作為練習,試著透過環境變數連線到 DataBase。
進入 Cloud Shell 網站
cd 到專案資料夾,建立 .env
檔案
cd ~/project
touch .env
Explorer -> Open Folder -> 選擇 project 資料夾 -> Open
.env
檔案並貼上以下內容MONGO_HOST = localhost
MONGO_INITDB_ROOT_USERNAME = localuser
MONGO_INITDB_ROOT_PASSWORD = localpasswd
我們專案是使用 NodeJS ,需要安裝 dotenv
將 .env
檔案內的環境變數匯入到程式,並安裝 mongoose
來連線到 MongoDB。
npm install mongoose dotenv
套件安裝完成後,就可以在 app.js
撰寫 DB 連線相關程式碼。
app.js
檔案並使用以下內容取代const mongoose = require('mongoose');
require('dotenv').config()
const DATABASEURL= `mongodb://${process.env.MONGO_INITDB_ROOT_USERNAME}:${process.env.MONGO_INITDB_ROOT_PASSWORD}@${process.env.MONGO_HOST}:27017/message?authSource=admin`;
mongoose.connect(DATABASEURL,{
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log('CONNECTION SUCCESS!!'))
.catch(err => console.log(err));
NodeJS 使用
process.env.ENVNAME
匯入環境參數。
程式碼設定完成,還缺少測試環境的 DataBase ,透過 Docker 可以快速的建立起 MongoDB 。
docker run -d -p 27017:27017 --name mongo \
-e MONGO_INITDB_ROOT_USERNAME=localuser \
-e MONGO_INITDB_ROOT_PASSWORD=localpasswd \
mongo
所需環境準備好就可以測試程式了。
app.js
node app.js
(輸出結果)
CONNECTION SUCCESS!!
看到 SUCCESS 代表連線成功,若連線失敗會跳出錯誤訊息。
有了 .env
檔案可以建立環境變數,但因為裡面有一些敏感資訊,不能直接上傳到 Git ,所以會創建.env.example
,讓團隊內的其他開發人員知道有哪些環境變數需要設定。
.env.example
檔案touch .env.example
.env.example
檔案並貼上以下內容MONGO_HOST = host
MONGO_INITDB_ROOT_USERNAME = user
MONGO_INITDB_ROOT_PASSWORD = password
最後在 .gitignore
裡加入 .env
防止被上傳到 Git Repo。
.env
node_modules
npm-debug.log