在打造安全的 VM 環境時,常常會遇到一個經典的矛盾點: 我們希望 VM 保持隱蔽,避免直接暴露於網際網路以減少安全風險,但同時又需要對外存取資源。 例如在開發或維運階段,像是執行 npm install、apt-get update,甚至提供給合作第三方的白名單 IP 等需求,往往都依賴外部下載與連線。
在 GCP 控制台中,前往 VPC 網路,選擇 建立 VPC 網路。 設定一個新的 VPC 網路,並確保 VM 的子網路設為 私有(Private)。這樣做可以保護 VM 不被直接暴露於公共網路。 實務上我選擇 default
步驟 2: 配置 Cloud NAT
前往 VPC 網路 > Cloud NAT,並選擇 建立 NAT 網關。 在設置過程中,選擇對應的子網路和路由(Route)設定。這樣可以確保 VM 在沒有 Public IP 的情況下仍能夠透過 NAT 網關訪問外部網路。 配置完成後,Cloud NAT 將會自動幫助 VM 處理對外的連線請求,而不需要直接公開 VM 的 IP。
步驟 3: 配置 Public IP(如果需要)
若要讓 VM 直接對外發送請求或開放服務,可以在創建 VM 時為其配置 Public IP。 在 Google Cloud Console 中創建虛擬機時,選擇 外部 IP 設為 靜態(static),這樣可以確保 Public IP 地址不會變動。 當 VM 配置了 Public IP,所有對外的請求將會直接通過這個 IP 進行。
// 這會觸發類型檢查錯誤 request("GET", "/invalidRoute"); // Error: Argument of type '"/invalidRoute"' is not assignable to parameter of type 'Route'.
相同的概念也可以來動態生成 SQL 查詢語句,同時確保參數的安全性與類型正確性。
1 2 3 4 5 6 7 8 9 10 11
typeTableName = "users" | "posts" | "comments";
functionselectFromTable(table: TableName, id: number): string { return`SELECT * FROM ${table} WHERE id = ${id}`; }
const query = selectFromTable("users", 1); console.log(query); // SELECT * FROM users WHERE id = 1
// 傳入錯誤的表名時,會被 TypeScript 類型檢查發現 selectFromTable("invalidTable", 1); // Error: Argument of type '"invalidTable"' is not assignable to parameter of type 'TableName'.
// 若單位或屬性錯誤,會觸發類型檢查錯誤 applyStyle("background", 10, "px"); // Error: Argument of type '"background"' is not assignable to parameter of type 'CSSProperty'.
constinvalidHandler: EventHandlerName<"click", "button"> = "buttonOnHoverHandler"; // Error: Type '"buttonOnHoverHandler"' is not assignable to type '"buttonOnClickHandler"'.