# 技術班課後作業 HW3
## 1. Monitor / Logging
- 針對vm-pa-1 設定CPU Alert
- 當三分鐘內的CPU 平均超過80% 觸發告警
- 通知和名稱選擇要通知的相關人員的電子郵件
- 設定郵件預設內容(Documentation)
- Application Load Balancer 設定RPS Alert
- 一分鐘內的RPS(Rate)超過50次觸發告警
- 要把所有的url_map_name 都加總
- 通知和名稱選擇要通知的相關人員的電子郵件
- 設定郵件預設內容(Documentation)
- MIG 設定Email Alert
- 建立MIG Policy 快訊
- 針對Instance group size 做監控警告,其它設定預設
- 設定觸發條件高於門檻,門檻值為5 ,其它設定預設
- 通知和名稱選擇要通知的相關人員的電子郵件
- 設定郵件預設內容(Documentation)
- 如何查詢Cloud Armor 的Deny Log
- 在記錄中搜尋欄位輸入
jsonPayload.enforcedSecurityPolicy.outcome="DENY" 查詢
拒絕請求記錄
- 時間欄位可調整至記錄的發生時間點
(冠羽: 為何我甚麼都沒有QQ -> lala 覺得是你時間欄位要調長一點)

- 如何查詢OS Login 的Log
- 在記錄中搜尋欄位輸入
protoPayload.serviceName="oslogin.googleapis.com"
- 時間欄位可調整至記錄的發生時間點
### steps
1. 針對vm-pa-1 設定CPU Alert
- 前置作業:vm-pa-1 要裝 ops-agent,可以用按的呢!! install ops agent 給他點下去!!

- 路徑:monitoring > alert > create policy
- alerts condition:
- select a metric: cpu utilization
- add filters: name=vp-pa-1
- transform data: custom 3 mins mean

- configure alert trigger: threshold 80%

- alerts details:
- 新增 notification channel: email

- Notification subject line: Caution!! CPU utilization for vm-pa-1 is over 80%
- Policy Severity Level: warning
- Documentation: 自己隨意寫一些內文啦XD ex: The CPU usage of vm-pa-1 has exceeded 80% for three consecutive minutes. Please check the VM to determine the cause of the high CPU usage.
- Name the alert policy: CPU Alert for vm-pa-1
- 來看一下 review alert 囉!
(因為安裝 ops agent 所以突然 cpu 飆很高 後來就低了!)

- 信長得像這樣

- 也可以點進去創建的 aler 看 incidents

2. Application Load Balancer 設定RPS Alert
- 路徑:monitoring > alert > create policy
- alert condition:
- select a metric: Global External Application Load Balancer Rule/https/Request count
- add filter: project_id=esun-user10-pa-1211
- transform data: 1 min, mean
- across time series: sum, url_map_name

- configure alert trigger: threshold value -> 50
- alert details
- Notification subject line: Caution!! RPS rates for load-balancer is over 50
- Policy Severity Level: warning
- Documentation: The RPS of all url_map_name has exceeded 50 for one minute.Please check the load balancer to determine the cause of the high RPS.
- Name the alert policy: RPS Alert for load-balancer
- review alert:

3. MIG 設定Email Alert
- 路徑:compute engine > instance groups > mig-vm-pa-1 > monitoring > create alerting policy 很方便的做法! 會自動帶入 filter 條件!metric 也自動選好了 instance group size!

- alert conditions:
- 讚讚的前面幾乎都帶好了,只要去 configure trigger 設定 threshold = 5
- alert details
- Notification subject line: Caution!! instance-group-size for mig-vm-pa-1 is over 5
- Policy Severity Level: warning
- Documentation: The instance group size for mig-vm-pa-1 has exceeded the threshold of 5. Please check the mig-vm-pa-1 to determine the cause of the high group size.
- Name the alert policy: instance-group-size Alert for mig-vm-pa-1
- review alert:

4. 如何查詢 Cloud Armor 的 Deny Log
- logs explorer query 輸入:jsonPayload.enforcedSecurityPolicy.outcome=“DENY”

- 也可以用這種方法找到log,路徑:network security > cloud armor > cloud armor policies > ib-policy > logs

- 拒絕請求記錄

5. 如何查詢OS Login 的Log
- logs explorer query 輸入: protoPayload.serviceName="oslogin.googleapis.com"
(我把時間拉大概 12/29 左右)

- log 裡的內容:

## 2. BigQuery and Cloud SQL
- 在Project A 中,建立一個dataset_pa1 : my_baseball_tw,區域選擇 asia-east1,將此 dataset_pa1 (my_baseball_tw),設定cloud_identity_b 具有讀取的權限。
- 將google 的public dataset : bigquery-public-data.baseball ,複製到 my_baseball_tw
- [提示] 點選+ ADD 可以搜尋public dataset
- [提示] 點選dataset 後,在 UI 上會有 COPY 的功能
- [問題] 是否有需要額外開啟的 API
- [問題] 新增的 COPY JOB 可以從哪查看?
- 檢查自己的my_baseball_tw dataset 內有多少個Tables
### steps:
1. 建立一個dataset_pa1 : my_baseball_tw
- 路徑: bigquery > esun-user10-pa-1211 旁邊的3個點按下去 > create dataset
- dataset id: my_baseball_tw, region: asia-east1 > create!
- 點 my_baseball_tw > sharing > permissions > add principal > 給 cloud_identity_b bigquery data viewer 權限
2. google 的public dataset : bigquery-public-data.baseball ,複製到my_baseball_tw
- 點選+ ADD 搜尋public dataset > 搜尋 baseball > 進到 baseball dataset 後,點 copy
- 點選 copy, dataset: esun-user10-pa-1211.my_baseball_tw,需要 enable Data Transfer API

- 會跑出 BigQuery Data Transfer Service wants to access your Google Account 按 allow!
- 新增的 COPY JOB 可以從哪查看: bigquery > data transfers > 點選 copy of baseball > 點選 run 還可以看到你面的 log!
- my_baseball_tw dataset 裡面會有 3 個 table: games_post_wide, games_wide, schedules
---
- 使用cloud_identity_b ,並確認自己是在Project B 中,針對Project_A 中的 my_baseball_tw.games_wide Table 進行SQL 查詢。查詢語句類似 SELECT year, homeTeamName, SUM(attendance) as attendance FROM `project_a.my_baseball_tw.games_wide` GROUP BY 1,2;
- 點選並查看Query Results 裡面的JOB INFORMATION、
EXECUTION DETAILS、EXECUTION GRAPH
- [問題] Bytes Billed 為多少? Slot Time為多少? 從多少筆資料中讀取、最終產生了幾筆資料?
- 點選並查看Job History 下面的PERSONAL HISTORY
- 將查詢的結果,匯出為CSV 檔案: games_wide.csv
- 將BigQuery 的資料表匯出成CSV 檔,上傳至Cloud Storage :
bucket_a 中
### steps
1. 用 使用cloud_identity_b 來做 query
- 記得! project 要選 project B 唷! 否則沒有 create job 權限
- 因為在 project B, 所以有可能看不到 project A dataset,可以用搜尋的!

- job information 可以查看: Bytes Billed: 19 MB, Slot Time: 144 ms
- execution results可以查看: 多少筆資料中讀取: 761618, 最終產生了幾筆資料: 31
2. BigQuery 的資料表匯出成 CSV 檔,上傳至Cloud Storage: bucket_a 中
- query result 那邊會有 save result,下載下來後,我就切回去 user-a,把檔案丟到 bucket_a,也是可以開bucket_a權限給 user-b 啦! 我懶~
(bigquery result)

(gcs)

#### 補充
- Bytes Billed:
query 處理的資料量。BigQuery 會根據資料的壓縮率來計算 Bytes Billed。例如,如果您執行一個查詢,查詢結果是 1 億筆記錄,每筆記錄佔用 100 個字節,但資料是壓縮的,每筆記錄實際佔用 50 個字節,那麼 Bytes Billed 就會是 50 億字節
- slot time:
query 使用多少個 slot 來執行。BigQuery 會根據 query 的複雜度來分配 slot。例如,如果您執行一個查詢,查詢涉及大量的 JOIN 操作,那麼 BigQuery 可能會為這個查詢分配更多的 slot
- Bytes Billed 和 slot time 是 BigQuery 計費的基礎:
BigQuery 的計費方式是按使用量計費,每個 slot 每小時的費用是 0.05 美元。因此,如果一個 query 產生了 100 億字節的 Bytes Billed,並且使用了 100 個 slot,那麼這個 query 的費用就會是 500 美元
---
- 使用cloud_identity_a,並確認自己是在Project A 中,創建一台Cloud SQL for MySQL : CloudSQL-a
- Database Engine : MySQL 8.0
- Cloud SQL Edition : Enterprise
- 建立一個預設的Password
- 1 core / 3.75GB
- SSD 10GB
- 開啟Public IP
- [問題] 預設的使用者有誰?
- [問題] CloudSQL-a 是否有內網IP、他是否有和任何一個VPC Peering?
- 透過UI介面,新增一個使用者 user_b
- [問題] user_b 具有什麼權限、創建的時候能否限制存取IP?
- 透過UI介面,創建一個新的Databases : sql_baseball
### steps
1. create mysql db
- 路徑: SQL > create a MySQL instance
- 照著題目設!很簡單,注意:機器規格, public ip 都是在 Customize your instance 那邊去設定!
- 預設的使用者有誰?
- 可以去 SQL > Users 查看
- user 有:root
- CloudSQL-a 是否有內網IP
- 可以去 SQL > Connections 查看
- Private IP connectivity: disabled
- 他是否有和任何一個VPC Peering?
- 看起來似乎沒有!?
2. 透過UI介面,新增一個使用者user_b
- 路徑: SQL > Users
- user_b 預設是會有和 root 一樣的權限
- 可以在創建頁面 host name 的地方限制哪些 client host 可以用 user_b 來登入這個 db

3. 透過UI介面,創建一個新的 Databases : sql_baseball
- 路徑: SQL > Databases
---
- 嘗試透過mysql 客戶端連線進入CloudSQL-a
- 方式一: 使用Cloud Shell
- [提示] 需要啟用sql admin api
https://console.cloud.google.com/apis/library/sqladmin.googleapis.com
- [提示] gcloud sql connect [instance_id] --user=root --quiet
- 方式二:使用vm-pa-1
- [提示] 需要安裝mysql client:sudo apt install default-mysql-client-core
- [提示] CloudSQL-a 是否需要調整什麼設定,才能允許vm-pa-1連線
- [問題] 方式一和方式二的差異在什麼地方
### steps
1. 使用 Cloud Shell 線 CloudSQL-a
- Cloud SQL Admin API 按下去 enable,可以用這個連結過去設定:https://console.cloud.google.com/apis/library/sqladmin.googleapis.com
- 開 cloud shell,輸入:gcloud sql connect cloudsql-a --user=root --quiet,打密碼就可以囉!
2. 使用 vm-pa-1
- ssh 進去 vm-pa-1,sudo apt install default-mysql-client-core
- 執行:
```
mysql -h 35.229.151.123(db 的 public ip) -P 3306 -u root
# 結果得到了這個錯誤:
# ERROR 2002 (HY000): Can't connect to MySQL server on '35.229.151.123' (115)
```
- 找錯誤原因:於 sql > connection 建立一個 connectivity test,source 為 vm-pa-1 ip, destination port 為 mysql 的 3306
- 找到原因是:access to the cloud sql instance endpoint is not authorized

- 解法:需要在 sql > connection 的地方把 vm-pa-1 ip 建立到 authorized network

- try again: 成功!!!

3. 方式一和方式二的差異在什麼地方
1. Cloud Shell: gcloud sql connect 命令
- 工具: 使用的是 gcloud 命令行工具。
- 身份驗證: 使用 Cloud Shell 的身份驗證,通常基於 GCP 賬戶設置的權限。
- 連接方式: 這個命令會打開一個交互式的終端機窗口,並自動建立一個安全的 SSL 連接到指定的 Cloud SQL 實例。這種方式是 GCP 推薦的安全方式,它自動處理了加密和身份驗證。
2. VM: 使用 mysql 命令連接
- 工具: 使用 MySQL 客戶端命令行工具。
- 身份驗證: 通常需要提供 MySQL 用戶的用戶名和密碼。
- 連接方式: 通過標準的 MySQL 協議直接連接到 MySQL 伺服器。在這種情況下,你需要確保連接是安全的,最好使用 SSL 進行加密,特別是在公共網絡上進行連接時。
### 補充:
1. Cloud SQL Admin API:
GCP 提供的一個 API,可以用來管理 Cloud SQL 實例。可以透過 HTTP 請求來使用。您可以使用 Cloud Console、Cloud SDK 或第三方工具來呼叫 Cloud SQL Admin API。
---
- 於CloudSQL-a 中的sql_baseball database中,建立一個table games_wide
- [提示]
- mysql> use sql_baseball;
- mysql> CREATE TABLE games_wide (year INT UNSIGNED, homeTeamName varchar(256), attendance INT UNSIGNED);
### steps
1. 照著執行!

2. 確認一下~

---
- 將 Cloud Storage 的檔案 Import 至 Cloud SQL
- Source 來源選擇上傳檔案的Bucket : bucket_a
- 文件格式選擇CSV
- 選擇剛建立的Database : sql_baseball
- 選擇剛剛建立的Table : games_wide
- [問題] 有哪邊可以看到剛剛import 的Job基本資料
- [提示] Operation Logs
### steps
1. import file to cloud sql
- 路徑:SQL > overview > import
- bucket-name/file-name: bucket_a_user10/games_wide.csv
- File format: csv
- Destination:
- Database: sql_baseball
- table: games_wide

2. 查看 import 的 Job 基本資料
- 路徑: SQL > Operations

- 也可以登進去 db select 看看!

---
- 透過BigQuery 建立Federated Query ,查詢CloudSQL中的資料
- 在Project_A 中,在BigQuery UI 上建立一個External Connection,連線到CloudSQL-a 中
- [提示] 點選+ ADD,選擇Connections to external data sources
- Connection ID 自訂名稱為cloudsql-a
- Location Type 選擇Region、Region 選擇asia-east1
- [提示] Cloud SQL connection name 可以至CloudSQL-a 的 UI 中查詢
- Database name : sql_baseball
- Database username 、Database password填入正確的資料
- 點選external connections -> 點選剛剛建立的connection name -> 選擇Query
- [問題]嘗試查詢sql_baseball.games_wide的資料,能否查詢的到,是否有錯誤訊息?[提示] SELECT * FROM sql_baseball.games_wide;
- 點選external connections -> 點選剛剛建立的connection name
- 找出使用的service account id,格式為 service-[project_number]@gcp-sa-bigqueryconnection.iam.gserviceaccount.com
- 替上面的Service Account Id,提供Cloud SQL Client 的 Role權限
- 重新嘗試查詢,能否查詢的到資料了?
- [問題] Cloud SQL 是否需要額外設定允許IP,讓BigQuery可以透過Federated Query 存取?
### steps
1. BigQuery 建立 Federated Query
- 路徑: bigquery > bigquery studio > + ADD > 搜尋 Connections to external data 點下去!
- 設定值:
- Connection ID: cloudsql-a
- region: asia-east1
- connection name: esun-user10-pa-1211:asia-east1:cloudsql-a
- database name: sql_baseball
- database user: root , password 就那個XD
- 建好後去下 query:
- SELECT * FROM EXTERNAL_QUERY("esun-user10-pa-1211.asia-east1.cloudsql-a", "SELECT * FROM sql_baseball.games_wide;");
- 結果得到錯誤: Invalid table-valued function EXTERNAL_QUERY Failed to connect to MySQL database.
- 原因: 執行 query 的 service account 沒有 cloud SQL client 的權限: service-474717663154@gcp-sa-bigqueryconnection.iam.gserviceaccount.com ,service account id 可以再建立的 external connection 裡的 connection info 查到!
- 解法: 去 IAM 加一下!!!
- query once again, success !!

2. [問題] Cloud SQL 是否需要額外設定允許IP,讓 BigQuery 可以透過 Federated Query 存取?
- 完全不用耶~
---
- 將 BigQuery 裡面查詢到的資料,存入另外一個Table
- 在剛剛BigQuery UI 上,透過federated query 查詢 CloudSQL-a的視窗上,點選Query Settings
- 選擇Set a destination table for query results
- Dataset 選擇my_baseball_tw
- Table Id 設定為games_wide_from_sql
- Destination table write preference : Overwrite table
- 設定完成後,重新執行Query
- 查看是否有產生新的Table : games_wide_from_sql,裡面有多少筆資料
### steps
1. 查詢到的資料,存入另外一個Table
- 路徑: Bigquery > Bigquery Studio > federated query 的視窗 > MORE > Query settings

- 重跑 query run 就成功啦~
- row number = 32 >< 多了一行!!! header 跑到 row 1 了!!!!
(冠羽: 但我看原本 external connection 的方式就已經是 32 rows 了~ 

- 