iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
DevOps

DevOps 好想學!新手也能打造雲端 Study Lab系列 第 28

Day28 - 開發者的環境變數設置

為何需要環境變數 ?

若你的專案有使用到 DataBase 服務,在程式碼裡會撰寫 Connect 到 DB 的方式,通常需要提供主機位置、使用者帳號密碼等相關資訊,而在不同環境下,連線所需的資訊也會有所不同。

db.connect(Host,帳號,密碼)

https://ithelp.ithome.com.tw/upload/images/20210927/20139235Gr6iNvdsJj.png

要如何讓程式在每個環境都能運作,笨一點的方法就是將這些資訊寫死在程式碼,但壞處是每個環境都需要重新配置,且將帳號密碼等資訊放入程式碼也會造成資安問題。

# 在 Dev 環境下
db.connect(localhost,devuser,devpass)
# 在 Prod 環境下
db.connect(DBURL,produser,prodpass)

比較好的做法是將資訊以環境變數儲存,只要在不同環境設置對應的環境變數,不僅可以將帳密等敏感資訊隱藏在背景環境,程式也能直接從環境變數取得資料。

db.connect(env.host, env.user, env.password)

要如何設置環境變數,在 Kubernetes 可以在 yaml 檔案直接設定。

  • k8s yaml 檔案內的 env 設定
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 檔設置的環境變數。

  • .env
HOST = localhost
USERNAME = localuser
PASSWORD = localpasswd

建置 MongoDB 的環境變數

我們就以 MongoDB 作為練習,試著透過環境變數連線到 DataBase。

  1. 進入 Cloud Shell 網站

  2. cd 到專案資料夾,建立 .env 檔案

cd ~/project 
touch .env
  1. 點擊左上 Explorer -> Open Folder -> 選擇 project 資料夾 -> Open

  1. 點擊 .env 檔案並貼上以下內容
  • .env
MONGO_HOST = localhost
MONGO_INITDB_ROOT_USERNAME = localuser
MONGO_INITDB_ROOT_PASSWORD = localpasswd

我們專案是使用 NodeJS ,需要安裝 dotenv.env 檔案內的環境變數匯入到程式,並安裝 mongoose 來連線到 MongoDB。

  1. 安裝所需套件
npm install mongoose dotenv

套件安裝完成後,就可以在 app.js 撰寫 DB 連線相關程式碼。

  1. 點擊 app.js 檔案並使用以下內容取代

https://ithelp.ithome.com.tw/upload/images/20210927/20139235GuP9aik4dv.png

  • 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 。

  1. 使用 Docker 建立 MongoDB 容器
  • Image: mongo
  • Port 轉發: 27017:27017
  • 容器名稱: mongo
  • 需要在背景執行: -d
  • 設定環境變數: -e
docker run -d -p 27017:27017 --name mongo \
    -e MONGO_INITDB_ROOT_USERNAME=localuser \
    -e MONGO_INITDB_ROOT_PASSWORD=localpasswd \
    mongo

所需環境準備好就可以測試程式了。

  1. 執行 app.js
node app.js

(輸出結果)

CONNECTION SUCCESS!!

看到 SUCCESS 代表連線成功,若連線失敗會跳出錯誤訊息。

  1. 點擊 ctrl + c 退出程式

有了 .env 檔案可以建立環境變數,但因為裡面有一些敏感資訊,不能直接上傳到 Git ,所以會創建.env.example,讓團隊內的其他開發人員知道有哪些環境變數需要設定。

  1. 建立 .env.example 檔案
touch .env.example
  1. 點擊 .env.example 檔案並貼上以下內容
MONGO_HOST = host
MONGO_INITDB_ROOT_USERNAME = user
MONGO_INITDB_ROOT_PASSWORD = password

最後在 .gitignore 裡加入 .env 防止被上傳到 Git Repo。

  • .gitignore
.env
node_modules
npm-debug.log

上一篇
Day27 - 在 Kubernetes Ingress 掛上 Google SSL 憑證
下一篇
Day29 - 以 NodeJS 留言板走過 GitOps 工作流程
系列文
DevOps 好想學!新手也能打造雲端 Study Lab30

尚未有邦友留言

立即登入留言