---
# System prepended metadata

title: 建置環境
tags: [建置環境]

---

---

title: 建置環境 # 簡報的名稱
tags: 建置環境   # 簡報的標籤

---

# 建置環境

> [name=李俊毅]
> [time=Thu, Feb 6, 2020 9:38 AM]

---

## Agenda

* 建置環境流程
* 手把手 GCP 篇
* 手把手 Octopus 篇
* 手把手 Mongodb Atlas 篇


---

# 建置環境流程

## [文件](https://docs.google.com/spreadsheets/d/1QofdEDO1PguO1AbJyxpsOEh_nHVQOseNrSbQ60mI2PE/edit#gid=0)

---

# 手把手 GCP 篇

----

## 專案建置

----

### 開 GCP 專案

----

點選框框的地方 下拉式按鈕

![](https://i.imgur.com/JWo7AJc.png)

點選新增專案

![](https://i.imgur.com/KwXox1z.png)

輸入專案名稱與選擇位置分類

![](https://i.imgur.com/Aa2Tmzs.png)

----

### 刪除 GCP 防火牆

----

開啟 GCP 的 VPC 網路中的防火牆規則

![](https://i.imgur.com/YN4olT1.png)

全選後，刪除

![](https://i.imgur.com/DDxmwyn.png)

---

## 建立應用服務帳號

----

### 服務帳號設定

----

開啟 GCP IAM 管理中的服務帳戶

![](https://i.imgur.com/HTWdwxt.png)

![](https://i.imgur.com/hjqnPIO.png)

輸入帳號資料

![](https://i.imgur.com/ohjZwDJ.png)

給予 terraform 帳號權限

![](https://i.imgur.com/lVtQ4cZ.png)

建立金鑰

![](https://i.imgur.com/bPn7f0T.png)

一般選擇 JSON 格式

![](https://i.imgur.com/RaWJcX4.png)

![](https://i.imgur.com/gh5lmVI.png)

---

## 啟用服務 API

----

### 開啟服務 API

----

輸入啟動 API 服務名稱

![](https://i.imgur.com/4meVelc.png)

點選啟用

![](https://i.imgur.com/PJGzuwY.png)

---

## Terraform 環境設定

----

### 服務帳號

----

建立 terraform 使用的服務帳號

![](https://i.imgur.com/HTWdwxt.png)

![](https://i.imgur.com/hjqnPIO.png)

輸入帳號資料
![](https://i.imgur.com/ohjZwDJ.png)

給予 terraform 帳號權限

![](https://i.imgur.com/lVtQ4cZ.png)

建立金鑰

![](https://i.imgur.com/bPn7f0T.png)

一般選擇 JSON 格式

![](https://i.imgur.com/RaWJcX4.png)

![](https://i.imgur.com/gh5lmVI.png)

完成服務帳號設定，再將此金鑰 放入到 terraform 的程式碼中即可透過此權限進行 GCP 雲端操作

![](https://i.imgur.com/apw2OQq.png)


----

### 後端

----

建立 storage 存放 terraform 狀態

![](https://i.imgur.com/boqfuBm.png)

設定 storage 名稱

![](https://i.imgur.com/yqSKDGB.png)

選擇資料儲存位置

![](https://i.imgur.com/kt7tsw3.png)

選擇儲存空間類型

![](https://i.imgur.com/k3qipUn.png)

存取儲存空間權限設定

![](https://i.imgur.com/ad428wx.png)

設定檔案加密與保留政策

![](https://i.imgur.com/v3383t0.png)

----

### OAuth 2.0 用戶端 ID

----

#### OAuth 同意畫面設定方式

----

OAuth 同意畫面為使用 OAuth 2.0 驗證時不合法時出現的畫面， 如何設定 OAuth 同意畫面？

1.先選擇外部，按下建立
2.應用程式類型設定公開，並輸入應用程式名稱
3.上傳應用程式的標誌圖
4.新增授權網域，設定完畢後進行儲存

以上步驟完成後 OAuth 2.0用戶端 ID 已設定完畢，此功能後續提供給需要 OAuth 2.0驗證的服務 ex: grafana

![](https://i.imgur.com/DB2yjmK.png)

![](https://i.imgur.com/TW8dxSg.png)

![](https://i.imgur.com/MPanCfo.png)

----

#### OAuth 憑證設定方式

----

首先建立憑證

![](https://i.imgur.com/Z19y1kQ.png)

----

選擇 OAuth 用戶端ID 的建立方式

![](https://i.imgur.com/rvarCOz.png)

----

輸入名稱與授權的網址來源和授權後要轉導網址，設定完畢後按下建立

![](https://i.imgur.com/ramNHPf.png)


----

### CloudSql 分配並連線

----

登入 GCP 的 SQL 選擇建立執行個體並選擇 MySQL，打開顯示設定選項，勾起連線內容中的私人 IP ，點擊「分配並連線」初始化 GCP 的 default 子網路，初始化完畢後即可關閉此畫面，剩下的建置 MySQL 會由 terraform 作業

![](https://i.imgur.com/Jzg0It3.png)

![](https://i.imgur.com/vmzHblX.png)

![](https://i.imgur.com/KR4nTmw.png)

![](https://i.imgur.com/A4OOwtk.png)

![](https://i.imgur.com/8U4dwiZ.png)

----

### 設定 LB 後端服務的 Port

----

執行 terraform 腳本建立環境後，需要手動進行設定後端服務的 Port ，才能讓 LB 的流量往後端服務送，有四個步驟，設定完成後，服務流量即可傳到後端

1.開啟 GCP 執行個體群組，搜尋ingress，共有三個(區域)要設定

![](https://i.imgur.com/DvgfZBm.png)

2.開啟執行個體群組並進行編輯群組設定

![](https://i.imgur.com/5g3bxwt.png)


3.設定通訊埠名稱與編號，通訊名稱同 terraform 建立後端服務一樣

![](https://i.imgur.com/wTEMy7z.png)


![](https://i.imgur.com/Ez0TJSt.png)

----

### 設定 IAP 身份識別

----

執行 terraform 腳本建立環境後，如需要 IAP 需要手動進行設定，才能讓 IAP 生效

1.開啟 GCP 的安全性中的 Identity-Aware Proxy

![](https://i.imgur.com/WR9CL2j.png)

2.選擇想要開啟的後端服務，並開啟 IAP，然後同意並啟用

![](https://i.imgur.com/zYOFhb6.png)

![](https://i.imgur.com/5JPqTOX.png)

![](https://i.imgur.com/8v33GI5.png)

3.設定完成後，設定值會出現在【API 和服務】中的憑證裡面

![](https://i.imgur.com/kAeq67z.png)

4.點選剛設定的後端服務，裡面有用戶端ID與用戶端密碼

![](https://i.imgur.com/o9fc7qr.png)

5.將其設定在 terraform 的變數 default 內

```
variable "monitor_backend_oauth2_client_id" {
  type    = "string"
  default = ""
}
variable "monitor_backend_oauth2_client_secret" {
  type    = "string"
  default = ""
}
```
----

### 設定新環境的 NS 紀錄

----

執行 terraform 腳本建立環境後，需要將環境的 NS 設定在根域名上，domain才會生效

1.首先開啟【新的】GCP 網路服務的 Cloud DNS 

![](https://i.imgur.com/ckIGPN7.png)

![](https://i.imgur.com/TPY99TA.png)


2.將 NS 紀錄資料複製到根域名所在的 GCP 專案上設定，按下新增紀錄集後，將資料一筆一筆設定上去，設定完畢後按下儲存

![](https://i.imgur.com/uTtQMbc.png)

![](https://i.imgur.com/TLc3qwY.png)

![](https://i.imgur.com/bVD0NyI.png)

----

### 授權domain管理者給terraform服務帳號

----

[網站管理員中心](https://www.google.com/webmasters/verification/home?hl=zh-TW&authuser=0)

----

新增驗證資源的網址

![](https://i.imgur.com/dNNXwGs.png)

----

選擇驗證資源網址的方式，選擇完畢後即完成驗證

![](https://i.imgur.com/ombGmfT.png)

---

# 手把手 Octopus 篇

----

## 部署設定

----

### 建立環境

----

新增部署環境

![](https://i.imgur.com/HMRD3Ae.png)




輸入環境名稱

![](https://i.imgur.com/D0QU8rX.png)

接著設定 Lifecycles ，Lifecycles 為部署版本的生命週期

![](https://i.imgur.com/RjtjiHS.png)

選擇 Default Lifecycle，並且可以看到部署的生命週期順序是由上到下排列，在部署 iamrich-stage 前需要完成 lychee-dev 與 fzxgame-dev

![](https://i.imgur.com/MtRvPjo.png)

新增一個 [PHASE] ，並填入環境資料，比較需要注意的地方是 Required to progress ，此設定為生命週期的方式，目前有支援三種：
1. All must complete－要部署版本到此環境，一定要在之前的環境都推版過此版本才能部署到該環境
2. A minimum of ＿ must complete－在部署到此環境前，至少要部署過幾個環境才可以部署到此環境
3. Optional phase－不管版本有沒有部署到之前的環境都可以直接部署

設定完畢後按下右上角的 SAVE，儲存設定

![](https://i.imgur.com/AJQR4Z4.png)


![](https://i.imgur.com/qK3mvn2.png)


如果有需要調整生命週期的順序，可以選擇 [REORDER PHASES]

![](https://i.imgur.com/gp0Dkwb.png)

拖曳的方式調整順序，調整完畢後按下 OK

![](https://i.imgur.com/Tr5Sdgx.png)


----

### K8S 權限帳號與憑證

----

新增部署觸手

![](https://i.imgur.com/AzmJrhE.png)

![](https://i.imgur.com/NiwzhNJ.png)

設定 K8S 觸手

![](https://i.imgur.com/UmhMQ1N.png)

輸入顯示名稱、部署環境與位置

![](https://i.imgur.com/PeGs6jQ.png)


接著設定連線 K8S 的方式，點選 ＋ 按鈕設定，以下為使用者與密碼連線方式

![](https://i.imgur.com/veHHAmQ.png)

設定使用者與密碼連線方式

![](https://i.imgur.com/sfwn0Bs.png)

命名 key 顯示名稱

![](https://i.imgur.com/t7TWoxG.png)

接著設定使用者與密碼，要填入的資訊在 GCP ，開啟 GCP 的 K8S 叢集，點選叢集名稱後點選顯示憑證，將密碼放入到 Username 與 Password 的欄位

![](https://i.imgur.com/dHo3mvJ.png)

![](https://i.imgur.com/VVbRF2d.png)

使用者名稱為要輸入在Username的資料，密碼為要輸入在Password的資料

![](https://i.imgur.com/c0t95iA.png)

接下來要設定 key 的環境，下拉式選單選擇環境，選擇完畢後按下 SAVE

![](https://i.imgur.com/5zsvskA.png)


接著回到設定 Kubernetes Cluster 分頁並按下 Refresh 載入剛剛設定的 key 資料，並點選下拉式選單將它選入，就完成了使用者與密碼設定

![](https://i.imgur.com/M4yCSO7.png)



接著設定 K8S 位置、憑證與預設的namespace，Kubernetes cluster URL 資訊在 GCP 上，需要開啟 GCP 上的 K8S 叢集並點選叢集名稱

![](https://i.imgur.com/KYd0IxP.png)

將 K8S 的端點的 IP 輸入到 Kubernetes cluster URL

![](https://i.imgur.com/cgXXVGg.png)

接下來設定 K8S 憑證，點選 ＋ 按鈕進行設定，憑證一樣存放在 GCP ，開啟 GCP 的 K8S 叢集並點選叢集名稱後點開顯示憑證

![](https://i.imgur.com/Oe8uOJ9.png)

命名憑證名稱

![](https://i.imgur.com/QIdKOj5.png)

輸入憑證資料，可以用複製貼上或上傳檔案的方式新增

![](https://i.imgur.com/6OxSLy8.png)

開啟 GCP K8S叢集尋找憑證

![](https://i.imgur.com/VVbRF2d.png)

將憑證內的叢集 CA 憑證資料複製並貼在

![](https://i.imgur.com/vf9PJw7.png)


新增完憑證後，輸入憑證的環境，輸入完畢後按下 SAVE

![](https://i.imgur.com/j2Xxaga.png)

![](https://i.imgur.com/MxC9Pu6.png)

接著回到設定 Kubernetes Cluster 的分頁，點選 Refresh 載入剛剛設定的憑證資料並選擇它，選擇完後按下 SAVE ， K8S 的觸手設定已大功告成，但還是需要 Reconfirm 檢查一下叢集是否正常

![](https://i.imgur.com/Oe8uOJ9.png)

點選左邊的 Connectivity 測試觸手健康，按下 CHECK HEALTH 確認

![](https://i.imgur.com/dJQgkbU.png)

![](https://i.imgur.com/EXpcpCj.png)

![](https://i.imgur.com/MogyXfo.png)

----

### 設定變數

----

設定變數的意義是因為程式在設計的過程中會有些設定檔會因環境不同而有所不同，所以才把這些設定檔拉出來，放置在 octopus 的變數集合中，以下示範修改 MYSQL IP 與 REDIS IP 

![](https://i.imgur.com/Az3g5rX.png)


MYSQL IP 有三個地方要新增，以 mysql api variable 為例，點選後，選擇 MYSQL_API_HOST 欄位進行編輯， 新增數值 Add Value ，輸入 MYSQL IP 

![](https://i.imgur.com/rBi01hk.png)

接著更新變數，到 slot-env 的 Releases 選擇特定版本點進去，在 Variable Snapshot 項目按下 UPDATE VARLABLES ，會跳出 Reconfirm 頁面，再次確認並按下，更新完畢後點選 SHOW SNAPSHOT 檢查變數是否已更新

![](https://i.imgur.com/XMUJvLT.png)

![](https://i.imgur.com/ks5hlnT.png)

![](https://i.imgur.com/PGjhVmQ.png)

REDIS IP 有三個地方要新增，以 redis platform variable 為例，點選後，選擇 REDIS_PLATFORM_HOST 欄位進行編輯， 新增數值 Add Value ，輸入 REDIS IP

![](https://i.imgur.com/uWRDQar.png)

接著更新變數，到 platform-env 的 Releases 選擇特定版本點進去，在 Variable Snapshot 項目按下 UPDATE VARLABLES ，會跳出 Reconfirm 頁面，再次確認並按下，更新完畢後點選 SHOW SNAPSHOT 檢查變數是否已更新

![](https://i.imgur.com/XMUJvLT.png)

![](https://i.imgur.com/ks5hlnT.png)

![](https://i.imgur.com/4vYaSeC.png)


Grafana variable 環境變數 GF_AUTH_GOOGLE_CLIENT_ID 與 GF_AUTH_GOOGLE_CLIENT_SECRET 在新增環境時需要新增 google 的 OAuth 憑證，點選 OAuth 用戶端 ID，設定應用程式類型為網路應用程式，並命名顯示名稱，輸入已授權的 JavaScript 來源和已授權的重新導向 URI，設定完畢後，按下建立完成設定

![](https://i.imgur.com/PqyQkDw.png)

![](https://i.imgur.com/FCgkiRV.png)

![](https://i.imgur.com/GiXn0S5.png)

把用戶端 ID 與用戶端密碼輸入到 Grafana variable 變數中的 GF_AUTH_GOOGLE_CLIENT_ID 與 GF_AUTH_GOOGLE_CLIENT_SECRET ，輸入完畢後按下 SAVE

![](https://i.imgur.com/N9dLyGj.png)


接著更新變數，到 Grafana Project 的 Releases 選擇特定版本點進去，在 Variable Snapshot 項目按下 UPDATE VARLABLES ，會跳出 Reconfirm 頁面，再次確認並按下，更新完畢後點選 SHOW SNAPSHOT 檢查變數是否已更新

![](https://i.imgur.com/XMUJvLT.png)

![](https://i.imgur.com/ks5hlnT.png)

![](https://i.imgur.com/4vYaSeC.png)


----

## 部署版本

----

點選 Octopus 上的 Dashboard

![](https://i.imgur.com/zPPzsmU.png)

----

將上面的版本都部署（推）到環境上

![](https://i.imgur.com/WlOSUh5.png)

---

# 手把手 Mongodb Atlas 篇

----

## 新建專案

----

開啟 mongodb atlas 的 project

![](https://i.imgur.com/X73w5rn.png)

建立專案

![](https://i.imgur.com/DUIOSG8.png)

輸入專案名稱後下一步

![](https://i.imgur.com/SE6kkOl.png)

邀請使用者加入專案並設定權限，確定後按下建立專案

![](https://i.imgur.com/ec5jyNN.png)

----

## 建立 VPC network

----

為了讓 gke 走內網連線至 mongodb atlas要設定 vpc network

----

選擇 network access

![](https://i.imgur.com/Esvcb36.png)

點選 peering 並設定

![](https://i.imgur.com/F0I4L0b.png)

選擇雲端商

![](https://i.imgur.com/69LNJOj.png)


將資訊填入到欄位中，每個欄位有說明可以參考設定方式，輸入完畢後按下建立

![](https://i.imgur.com/G8H7niL.png)


設定白名單後 VPC 才會生效

![](https://i.imgur.com/jMB4PwX.png)

輸入IP，IP為 GKE Pod 的ip

![](https://i.imgur.com/6pJbuOY.png)

![](https://i.imgur.com/p9w4LWg.png)


----

## 建立 mongodb cluster

----

在創建 mongodb cluster 前要先設定 VPC network，不然不會生效

----

選擇 cluster 

![](https://i.imgur.com/Ztaf3AQ.png)

建立 mongodb cluster

![](https://i.imgur.com/CI4AuOO.png)

選擇雲端廠商與地區並設定機器規格，確認完畢後按下建立

![](https://i.imgur.com/mxlPIEd.png)

----

## 設定 db access

----

選擇 database access

![](https://i.imgur.com/n6HnG4S.png)

建立 database user

![](https://i.imgur.com/kdDrgWr.png)


設定帳密與權限

![](https://i.imgur.com/mzrMzmt.png)


----

## 連線 Mongodb

----

選擇 Cluster，對要連線的 Cluster 點選 CONNECT 進行設定

![](https://i.imgur.com/pdNlnOb.png)

----

選擇連線方式，這邊示範的是用程式連線

![](https://i.imgur.com/QNEeyE7.png)

----

選擇程式語言與版本，選擇完畢後按下複製連線字串後，再將裡面的password替換掉，放入到章魚變數中

![](https://i.imgur.com/nrT4Tqc.png)
