---
# System prepended metadata

title: 技術班課後作業 HW 1
tags: [作業]

---

# 技術班課後作業 HW 1

繳交期限 12/18

## 作業內容
### 1. 成員資源：
* cloud_identity_A(user數字小的) 與cloud_identity_B(user數字大的) 兩
個Google Account
* 一個組織下的 Folder
* 一個Billing Account 的 User

### 2. 賦予權限：
* 使用cloud_identity_A，在自己的folder (名稱為
lab-20231205-esun-userXX)給予cloud_identity_B相關IAM權限
* 給予IAM權限為Folder Viewer & Project Creator
* 到cloud_identity_B介面查看是否有該folder

### 3. 專案建立與Billing Account設定(建議使用不同瀏覽器的隱私權視窗操作)
* 使用cloud_identity_A 建立一個專案(Project_A)
    * 專案名稱和專案ID請使用[cloud_identity_a]-pa-[mmdd]
    * 例如如果你的cloud_identity_a 是demo@example.com，專案請
命名為demo-pa-1205
* 放在指定的Folder 內
* Link 到指定的Billing Account
* 使用cloud_identity_B 建立一個專案(Project_B)
    * 專案名稱和專案ID請使用[cloud_identity_b]-pa-[mmdd]
    * 例如如果你的cloud_identity_b 是demo2@example.com，專案
請命名為demo2-pa-1205
* 放在指定的Folder 內
* Link 到指定的Billing Account

#### [問題] 
1. Project_A 和Project_B的project number、project name、
project Id 各是什麼? 哪些可以自訂?



|  | project name | project id | project number |
| -------- | -------- | -------- | -------- |
| project A |esun-user10-pa-1211 | esun-user10-pa-1211 |474717663154 |
| project B | esun-user40-pa-1211 | esun-user40-pa-1211 |1041788131944 |
| 自訂義 |可自訂 | 可自訂 | 不可自訂 |
| 命名規則 | 可以包含各種字符，通常是描述性名稱 | 需要是全局唯一的，通常是小寫字母、數字和連字符（-）的組合，長度必須在 6 到 30 個字符之間 | 系統配置 |
| 用途 | 人類可讀的項目名稱，用於更清晰地標識項目  | GCP 中每個項目的唯一標識符 | GCP 中項目的唯一數字標識符，用於在 GCP 內部跟蹤和管理項目 |


### 4. 專案VPC 設置
* 如果專案內有default vpc
    * 查看default vpc 有多少subnet: 39 個
![image](https://hackmd.io/_uploads/r10b6HoIT.png)

    * 查看default vpc 有哪些firewall rule
![image](https://hackmd.io/_uploads/ByhI6SjIT.png)

    * 刪除default vpc
* 於Project_A 內，建立一個新的custome vpc (vpc-a)，選擇手動建立
subnet模式，其他條件都使用預設條件
    * 在vpc-a 中，於asia-east1 建立一個/20 的subnet (建議選擇
10.40.0.0/20)
    * 在vpc-a 中，於asia-east2 建立一個/20 的subnet (建議選擇
10.50.0.0/20)
    * 在vpc-a 中，於asia-souteast1 建立一個/20 的subnet (建議選擇
10.60.0.0/20)
    * 勾選啟用預設的SSH Port 22 的firewall rule
    * 其他條件都使用預設條件
* 選擇剛剛創建的vpc-a
    * 查看相關的subnet 設定
    ![image](https://hackmd.io/_uploads/BJHKkLiUT.png)

    * 查看有開啟了那些firewall Rule
    ![image](https://hackmd.io/_uploads/S1HokUiUp.png)


### 5. 設定IAM 與建立VM
* 於Project_A 中，建立一台e2-micro 的VM ( vm_pa_1)，相關條件如下
    * Zone : asia-east1-b
    * OS 與Boot Disk 為預設(Debian / 10G)
    * Firewall 請允許HTTP/HTTPS/Load Balancer Health Checks
    * 選擇使用vpc-a，並建立一個static external ip address ( EIP_1)
給這台VM
    * 幫這台VM，新增一個label， Key 為project_a，Value 為vm_pa_1
    * 幫這台VM，新增一個network tag : asia-east1
    * 新增metadata : key = startup-script-url , value =
gs://cloud-training/gcpnet/httplb/startup.sh
    * 其他都使用預設條件
* 到vpc-a 中，查看現在有哪些firewall rule
![image](https://hackmd.io/_uploads/rypYEUoL6.png)
* vm_pa_1 的network-tags有哪些?
![image](https://hackmd.io/_uploads/S1fL4Li8a.png)
* 如何查看單一一台VM(例如vm_pa_1) 的NIC，有套用到那些firewall rule
?
![image](https://hackmd.io/_uploads/Sk7fNUoLp.png)

* 新增一對ssh 的公私鑰，額外透過Project 層級的Compute Engine
metadata，允許使用這把私鑰，透過ssh 程式(例如putty )，登入vm_pa_1
，登入的帳號請取名為projectlogin
教學參考: https://medium.com/@kellenjohn175/explanation-gcp-%E6%96%B0%E6%89%8B%E6%9D%91-firewall-39cd71353b1 
```
# 打開 cloud shell
ssh-keygen -t rsa  -C  projectlogin  -b 4096
# 將公鑰 id_rsa.pu 放到 metadata > ssh keys
# 連線：
ssh -i ~/.ssh/id_rsa projectlogin@34.80.183.179
```
* 幫這一台vm_pa_1，啟用OS Login功能(不用使用2FA)
step:
    1. 授予 Compute Engine default service account 權限：roles/compute.osLogin, roles/compute.osAdmin
![image](https://hackmd.io/_uploads/H1cOdvaIp.png)
    2. vm-pa-1 新增 metadata: enable-oslogin: TRUE
    3. login
    ```
    gcloud config set auth/disable_credentials false
    gcloud compute ssh vm-pa-1 \
            --project=esun-user10-pa-1211 \
            --zone=asia-east1-b \
            --impersonate-service-account=474717663154-compute@developer.gserviceaccount.com (不太清楚到底要不要加這個>< 沒加好像可以) 
    ```
* 使用cloud_identity_B ，透過OS Login 登入vm_pa_1 [截圖]
    * [提示] 使用gcloud sdk (gcloud 指令來做os login)
    * [提示] 在Project_A 的專案層級通常要提供那些角色給
cloud_identity_B 才能使用OS Login 登入： compute_os_login, service_account_user
    * [問題] 基於最小權限原則，如何才能限縮cloud_identity_B 的權限
沒有給 compute_os_admin 就可以讓它沒有 sudo 權限
    * [問題] 如果是沒有external IP 的主機，要如何登入
    * [問題] cloud_identity_b 能夠sudo 嗎?
    ```
    # 沒有 sudo 權限
    esun_user40_demo_wsp_standard_re@vm-pa-1:~$ sudo -v
    Sorry, user esun_user40_demo_wsp_standard_re may not run sudo on vm-pa-1.
    ```
    * 啟用OS Login後，本來的projectlogin 帳號還能透過本來的 sshkey 登入嗎？

    ```
    # 不行用 本來的projectlogin 登入了！
    esun_user10@cloudshell:~ (esun-user10-pa-1211)$ ssh -i ~/.ssh/id_rsa projectlogin@34.80.183.179
    projectlogin@34.80.183.179: Permission denied (publickey).
    ```

### 6. 設定防火牆
* 調整防火牆設置，讓vm_pa_1 的80 與443 Port，僅能允許自己的外網IP
以及雲動力的IP 114.35.183.168 可以連線
step: vpc networks > fire wall > 選 vpa-a-allow-http, vpa-a-allow-https edit
![image](https://hackmd.io/_uploads/S1ynEHT8T.png)

* 調整防火牆設置，讓vm_pa_1 的80與443 port，禁止所有10.80.0.0/20 的IP 連線過來
step: Firewall policies > create firewall rule > edit vm: vm_pa_1 加上 deny-http, deny-https network tag
![image](https://hackmd.io/_uploads/HyKOzB6UT.png)

* 確認http://EIP_1 可以看到相關頁面。[截圖]
![image](https://hackmd.io/_uploads/By0N4STU6.png)


### 7. 創建Image 、Snapshot、開關機排程
* 幫vm_pa_1 建立Snapshot schedules
    * 週一~週五晚上10:00~11:00建立Snapshot
    * 超過7天自動刪除快照
參考：[備份 GCP 上 VM 的資料](https://blog.cloud-ace.tw/infrastructure/data-backup/how-to-backup-your-gcp-vm-easily-and-automatically-with-snapshot-schedule/)
* 幫vm_pa_1 建立自動開關機的排程
    * 週一~週五18:00以後自動關機
    * 週一~週五09:00以後自動開機
    * 週六與週日不自動開關機
![image](https://hackmd.io/_uploads/BJvuUs2Ia.png)

* 幫vm_pa_1 建立一個image，命名為image-vm-pa-1
    * 區域選擇為multi regional Asia
    * 加上Label : Key 為project_a，Value 為image-vm-pa-1
![image](https://hackmd.io/_uploads/HyulFohU6.png)

* [問題] image, snapshot 的使用場景？

### 8. VPC Peering
* 於Project_A 內，建立一個新的custom vpc，vpc-b，選擇手動建立
subnet模式，其他條件都使用預設條件
    * 在vpc-b 中，於asia-southeast1 建立一個/20 的subnet (建議選
擇10.80.0.0/20) [截圖]
![image](https://hackmd.io/_uploads/HyDCYih8T.png)

* 在vpc-a 與vpc-b中建立vpc peering，命名自訂外，選項都使用預設。[截
圖]
![image](https://hackmd.io/_uploads/SJchoo3U6.png)

a->b, b->a 都要開唷！！
![image](https://hackmd.io/_uploads/SkfssYpI6.png)


* 於vpc-b 中，建立一台e2-micro 的VM ( vm_pa_2)，相關條件如下
    * Zone : asia-southeast1-b
    * OS 與Boot Disk 為預設(Debian / 10G)
    * Firewall 請允許HTTP/HTTPS/Load Balancer Health Checks
    * 選擇使用vpc-b，並建立一個static external ip address ( EIP_2)
給這台VM
    * 幫這台VM，新增一個label， Key 為project_a，Value 為vm_pa_2
    * 幫這台VM，新增一個network tag : asia-southeast1
    * 新增metadata : key = startup-script-url , value =
gs://cloud-training/gcpnet/httplb/startup.sh
    * 其他都使用預設條件
* 使用cloud_identity_B ，透過OS Login 登入vm_pa_2 [截圖]
![image](https://hackmd.io/_uploads/HyMVDdT8p.png)

* 測試vm_pa_2 是否能ssh 到vm_pa_1 的internal_ip
    * 如果不行的話，
* 測試vm_pa_2 能否curl 到vm_pa_1 的http://EIP_1
不行
* 測試vm_pa_2 能否curl 到vm_pa_1 的http://internal_ip/
不行(因題六的fw要求被阻擋，加完fw後可curl 到10.40.0.2 LB http page)
![curl-http-from-vm-pa-2](https://hackmd.io/_uploads/BJ6AFqpLp.jpg)


* 設置防火牆，讓vm_pa_2 無法存取到vm_pa_1 的22 port














