# 技術班課後作業 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 覺得是你時間欄位要調長一點) ![image](https://hackmd.io/_uploads/HyTpE0POp.png) - 如何查詢OS Login 的Log - 在記錄中搜尋欄位輸入 protoPayload.serviceName="oslogin.googleapis.com" - 時間欄位可調整至記錄的發生時間點 ### steps 1. 針對vm-pa-1 設定CPU Alert - 前置作業:vm-pa-1 要裝 ops-agent,可以用按的呢!! install ops agent 給他點下去!! ![image](https://hackmd.io/_uploads/H1YWR49OT.png) - 路徑:monitoring > alert > create policy - alerts condition: - select a metric: cpu utilization - add filters: name=vp-pa-1 - transform data: custom 3 mins mean ![image](https://hackmd.io/_uploads/B10mo4qOa.png) - configure alert trigger: threshold 80% ![image](https://hackmd.io/_uploads/BJo0jNqu6.png) - alerts details: - 新增 notification channel: email ![image](https://hackmd.io/_uploads/r1W2O45_T.png) - 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 飆很高 後來就低了!) ![image](https://hackmd.io/_uploads/HkDAbS9u6.png) - 信長得像這樣 ![image](https://hackmd.io/_uploads/H11bXrq_6.png) - 也可以點進去創建的 aler 看 incidents ![image](https://hackmd.io/_uploads/By5DXS5ua.png) 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 ![image](https://hackmd.io/_uploads/rkltgO0_T.png) - 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: ![image](https://hackmd.io/_uploads/Hku7FH9Oa.png) 3. MIG 設定Email Alert - 路徑:compute engine > instance groups > mig-vm-pa-1 > monitoring > create alerting policy 很方便的做法! 會自動帶入 filter 條件!metric 也自動選好了 instance group size! ![image](https://hackmd.io/_uploads/Hyl7bRScda.png) - 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: ![image](https://hackmd.io/_uploads/HkFkbUcuT.png) 4. 如何查詢 Cloud Armor 的 Deny Log - logs explorer query 輸入:jsonPayload.enforcedSecurityPolicy.outcome=“DENY” ![image](https://hackmd.io/_uploads/S1LTML5d6.png) - 也可以用這種方法找到log,路徑:network security > cloud armor > cloud armor policies > ib-policy > logs ![image](https://hackmd.io/_uploads/B1bfzU9_a.png) - 拒絕請求記錄 ![image](https://hackmd.io/_uploads/Sym9QLqu6.png) 5. 如何查詢OS Login 的Log - logs explorer query 輸入: protoPayload.serviceName="oslogin.googleapis.com" (我把時間拉大概 12/29 左右) ![image](https://hackmd.io/_uploads/B1JQII9_6.png) - log 裡的內容: ![image](https://hackmd.io/_uploads/r1FHw85O6.png) ## 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 ![image](https://hackmd.io/_uploads/rkUKEFjO6.png) - 會跑出 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,可以用搜尋的! ![image](https://hackmd.io/_uploads/BkAj6KsOp.png) - 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) ![image](https://hackmd.io/_uploads/HypGr9s_6.png) (gcs) ![image](https://hackmd.io/_uploads/ryNLL9jO6.png) #### 補充 - 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 ![image](https://hackmd.io/_uploads/r1jiFr2_p.png) 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 ![image](https://hackmd.io/_uploads/r1BKU7pO6.png) - 解法:需要在 sql > connection 的地方把 vm-pa-1 ip 建立到 authorized network ![image](https://hackmd.io/_uploads/rkrM8QauT.png) - try again: 成功!!! ![image](https://hackmd.io/_uploads/SyQ8wXpup.png) 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. 照著執行! ![image](https://hackmd.io/_uploads/HJFrnm6da.png) 2. 確認一下~ ![image](https://hackmd.io/_uploads/BJ4Sa7T_6.png) --- - 將 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 ![image](https://hackmd.io/_uploads/rkUPy4a_p.png) 2. 查看 import 的 Job 基本資料 - 路徑: SQL > Operations ![image](https://hackmd.io/_uploads/ry6SVNTOT.png) - 也可以登進去 db select 看看! ![image](https://hackmd.io/_uploads/ryKHv46Oa.png) --- - 透過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 !! ![image](https://hackmd.io/_uploads/BJ_NzIRup.png) 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 ![image](https://hackmd.io/_uploads/SJK_uPROa.png) - 重跑 query run 就成功啦~ - row number = 32 >< 多了一行!!! header 跑到 row 1 了!!!! (冠羽: 但我看原本 external connection 的方式就已經是 32 rows 了~ ![image](https://hackmd.io/_uploads/Hy2lAm-Kp.png) ![image](https://hackmd.io/_uploads/H13vcvC_a.png) - ![image](https://hackmd.io/_uploads/SkSAKvAOa.png)