---
# System prepended metadata

title: "《Terraform 實戰指南：GCP 基礎架構與密鑰管理（WindowOS實作指南）\U0001F4D2》"

---

# 《Terraform 實戰指南：GCP 基礎架構與密鑰管理（WindowOS實作指南）📒》
本篇示範如何使用 Terraform 在 GCP 建立基礎資源（bucket、VPC、firewall、VM），並搭配SSH存取驗證。內容包含環境安裝、建置流程、GCP 認證與 SSH 登入。
## Hands-on Lab
* [Git-Hub](https://github.com/MaxLu2002/Terraform-Hands-on-GCP-Infrastructure-and-Secrets-Management-Guide.git)
## 參考資源
- [Authenticating to Vault using Google Cloud IAM service accounts](https://hashicorp1674582558.zendesk.com/hc/en-us/articles/17325098124691-Authenticating-to-Vault-using-Google-Cloud-IAM-service-accounts)
- [Vault Plugin: Google Cloud Platform Auth Backend](https://github.com/hashicorp/vault-plugin-auth-gcp)
- [Authenticating to Vault using GCP GCE single Instance Signed Metadata](https://support.hashicorp.com/hc/en-us/articles/7999558729619-Authenticating-to-Vault-using-GCP-GCE-single-Instance-Signed-Metadata)

## 環境需求
- Windows OS
- Vault、Terraform、Google Cloud SDK (gcloud)
- 已建立的 GCP 專案

## 📒1. 前置安裝
1. **檢查 Winget（Windows 內建，通常無需安裝）**
在 PowerShell 中輸入以下指令確認工具是否可用：
```powershell
winget --version
```
*若無法執行，請至 Microsoft Store 更新「應用程式安裝程式」。*

2. **安裝 Vault, Terraform 與 Google Cloud SDK**
```powershell
winget install HashiCorp.Vault
winget install HashiCorp.Terraform
winget install Google.CloudSDK
```
3. **重啟 Terminal 後執行驗證：**
```powershell
vault --version; terraform --version; gcloud --version
```
## 📒2. 在GCP上建立Service Account並取得權限
* 進入GCP Console並打開Cloud Shell
![image](https://hackmd.io/_uploads/S1hiGx0r-e.png)
* 在Cloud Shell輸入以下指令，這指令會幫你
    1. 建立名為`terraform-gcp-cli-test` 的 service account
    2. 賦予 `editor` 權限
    3. 下載Account Key，可以幫助你建立Terraform資源
```powershell
# 設定環境變數 (在此修改名稱)
$SA_NAME="terraform-gcp-cli-test"
$KEY_NAME="gcp_key"
$p=$(gcloud config get-value project)
$e="$SA_NAME@$p.iam.gserviceaccount.com"
# 創建服務帳戶並下載金鑰
gcloud iam service-accounts create $SA_NAME || $true
gcloud projects add-iam-policy-binding $p --member="serviceAccount:$e" --role="roles/editor"
gcloud iam service-accounts keys create "$KEY_NAME.json" --iam-account=$e
cloudshell download "$KEY_NAME.json"
```
3. 把`gcp_key.json`存到 `./gcp_infra/files/`
![image](https://hackmd.io/_uploads/rykNMeCSZl.png)


## 📒3. 使用 Terraform 建置 GCP 基礎架構
切換到 gcp_infra 目錄
1. 進入`main.tf`確認要建立的資源是否正確
![image](https://hackmd.io/_uploads/rkzk7l0BZg.png)

2. 進入`terraform.tfvars`確認參數是否正確
![image](https://hackmd.io/_uploads/Hyqg7gRHbx.png)

3. 執行以下程式碼建立資源：
```powershell
terraform init; terraform plan; terraform apply -auto-approve
```

執行成功後，Terraform 會輸出類似的資訊（示例）：
![image](https://hackmd.io/_uploads/BJf7p-RHbl.png)

*上述 output 提供了用來登入 GCP 與 VM 的建議指令，強烈建議開一個`.sh`檔案把這串複製下來。*

## 📒4. gcloud 認證與驗證
複製並執行`"gcloud_login_command"`，使用 service account key 進行認證（範例，請確認路徑與檔名正確）：
```powershell
gcloud auth activate-service-account --key-file="./files/gcp_key.json"
gcloud config set project {YOUR-PROJECT-ID}
```
![image](https://hackmd.io/_uploads/Hy9Np-0rWe.png)

驗證是否成功：
```powershell
Write-Output "\n--- Active Account ---"; gcloud config get-value account; Write-Output "\n--- Project List ---"; gcloud projects list
```
![image](https://hackmd.io/_uploads/HJqSpb0Bbg.png)

*出現上圖有列出正確的`project_id`就算成功*

## 📒5. SSH 登入VM方法

### 📘1. 手動產生金鑰並以私鑰 SSH 登入
產生一個名為"terraform_test" 的RSA 金鑰對：
```powershell
New-Item -ItemType Directory -Path "keys" -Force; ssh-keygen --% -t rsa -b 4096 -f ".\keys\id_rsa" -N "" -C "terraform_test"
```
將公鑰上傳到 VM metadata（或以其他方式上傳），再用私鑰連線：
* 選 compute engine -> 你的VM -> edit -> SSH keys的Add item
    * ![image](https://hackmd.io/_uploads/BkKPabAHWe.png)
* 貼上公鑰後儲存
    * ![image](https://hackmd.io/_uploads/HJVd6bAB-l.png)
* 在VM的metadata有看到就表示成功了，這組username要複製下來，像我這邊就要複製`maxlu`
    * ![image](https://hackmd.io/_uploads/ryiFTb0rbg.png)

* 請將 {user} 與 {external_ip} 換成實際值。
```powershell
ssh -i ./keys/id_rsa {user}@{external_ip}
```
---
#### 💡常見錯誤與排查（OS Login 與 Metadata）
如果已經手動上傳的金鑰但無法登入，常見原因是 OS Login 功能Enable了，解決方法如下。
![image](https://hackmd.io/_uploads/rk5spZABZg.png)
*(如果想知道OS Login是什麼可以看[這裡](https://docs.cloud.google.com/compute/docs/oslogin?hl=zh-tw))*
1. 檢查專案是否啟用 OS Login：
```powershell
gcloud compute project-info describe --format="value(commonInstanceMetadata.items.enable-oslogin)"
```
2. 若回傳 true，手動上傳的 Metadata 金鑰會被忽略。處理方式：
    - 關閉 OS Login（允許 metadata 金鑰生效）：
```powershell
gcloud compute project-info add-metadata --metadata enable-oslogin=FALSE
```
3. 重新輸入一樣的指令，就可以成功進入了
```powershell
ssh -i ./keys/id_rsa {user}@{external_ip}
```

![image](https://hackmd.io/_uploads/BJFhT-0rWe.png)

如欲啟用 OS Login（較安全，讓 IAM 與 OS Login 結合）：
```powershell
gcloud compute project-info add-metadata --metadata enable-oslogin=TRUE
```
---
### 📘 2. 使用 gcloud 自動處理金鑰（推薦）
* 執行以下指令
```powershell
gcloud compute ssh max-public-gce-instance --zone=us-west1-c --quiet
```
* 當我們第一次使用 gcloud compute SSH 指令時，gcloud 會自動為我們建立一組 SSH key 並存放在本機目錄內
![image](https://hackmd.io/_uploads/SJK6aZArWe.png)
*gcloud 會自動在本機產生公私鑰並上傳至 Instance metadata，基本上這個方法不用做甚麼額外的設定*



## 📒小結📒
- 建議以 gcloud compute ssh 為首選（自動金鑰管理、較少設定錯誤）。
- 若使用 metadata 手動上傳金鑰，請確認 OS Login 狀態與專案設定。
- Terraform 建置後 output 會提供登入與驗證指令，依照輸出指令進行即可。
