對於形象與分享用途的網站來說,靜態網站可以說是首選。各大公雲都有對應的支持做法和文件。Pulumi 作為基礎設施即程式碼工具的新秀,相關範例與分享還是比較少,但 Pulumi 所提供的一般程式開發體驗,卻是讓我無法捨棄它。目前所瀏覽的網站建置也是基於 Pulumi 完成並且進行管理的。鑒於目前網路上的資源稀缺,身為知識愛好者的我來說,當然要毫不猶豫地將這過程分享出來!😤

**在開始之前

  1. 擁有一個 GCP 的帳號,更重要的是,它必須設定好如何付 $$
  2. 建立一個具有合適權限的服務帳號
  3. 安裝 Google Cloud SDK,並且確認已經設定好 application-default
  4. Python 為 3.x <== 這非常重要!!
  5. 準備好 DNS (本網站是使用Google Domain)

架構說明


如同此篇文章的開頭圖片一般,整體結構極為簡潔。就是在 Google Cloud Storage 前,設定導流規則的負載均衡器,並且搭配 CDN。如此一來,一方面可以直接選擇使用 us-west1、us-central1、或 us-east1 的免費額度,也能兼顧用戶從不同地區存取網站的速度。

開始著手實作 Pulumi 程式


1. 配置 Bucket

第一步,自然就是靜態網站的源頭 — Bucket! 這步驟主要有兩個需要注意的地方:

  • 首頁與404

    main_page_suffix : 預設的網站首頁
    not_found_page : 當查找的網頁不存在時的預設網頁

  • Bucket檔案存取權

    由於靜態網頁為公眾存取的內容,因此必須將 bucket 的檔案存取權設定為允許所有人都可以取讀的狀態。


#step 1. create the website bucket
webbucket=storage.Bucket("official-web"
    ,website=storage.BucketWebsiteArgs(main_page_suffix="index.html")
    ,location='us-central1')

accessctl=storage.DefaultObjectAccessControl("official-web-read"
    ,bucket=webbucket.name
    ,role="READER"
    ,entity="allUsers")


2. 取得 IP

為你的負載均衡器設定一個可以從外部網路存取得到的地址!


#step 2. create an external ip
access_addr=compute.GlobalAddress("addr-4-official-web")


3. 設置負載均衡器與 CDN

Google 為了提供更佳便利的負載均衡配置方式,特別將整個設置分成三個元件,分別是 proxy、urlmap、和 forward rule。 urlmap 負載均衡接受請求後,往後進行實質檔案存取時的路由配置方式;forward rule 則是設定外部請求如何到達負載均衡器的方式。值得一提的是,這邊的憑證處理是透過 Google 託管的 SSL 工具,此憑證服務完全是免費的(基於 Let’s Encrypt),唯一要求是某一個域名都必須各自獨立配置,而不能使用如二級域名的方式來配置。

#step 3. setup loadbalancer, ssl and CDN
backend_instance=compute.BackendBucket("backend-4-official-web"
    ,bucket_name=webbucket.name
    ,enable_cdn=True)

dedicated_ssl=compute.ManagedSslCertificate("ssl-4-official-web"
    ,managed=compute.ManagedSslCertificateManagedArgs(domains=[DOMAIN_NAME]))

web_routing=compute.URLMap("map-4-official-web"
    ,default_service=backend_instance.self_link)

target_proxy=compute.TargetHttpsProxy("proxy-4-official-web"
    ,url_map=web_routing
    ,ssl_certificates=[dedicated_ssl.self_link])

forward_rule=compute.GlobalForwardingRule("rule-4-official-web"
    ,load_balancing_scheme="EXTERNAL"
    ,ip_address=access_addr.address
    ,ip_protocol="TCP"
    ,port_range="443"
    ,target=target_proxy.self_link)

讓一切生效!

當上述實作都完成後,僅僅只需要以下的指令,便能將整個基礎設施建置完成!

pulumi up -y

DNS 設定

由於實務上,取得域名通常會透過不同的域名代理商。即便是透過 Google Domain 取得域名,目前 Google Domain 也未能提供有效的 API 方式來進行 DNS 的設定。因此,整個自動化便不在包含 Google Cloud DNS。

建置完整個網站後,可以基於 external ip 所配置到的位址,建立 A 紀錄(Record),以便完成域名與網路位置之間的映射。


後記

整個網站基礎設施的建置,基本上每月最低費用大概仍會落在 2x 美元,主要是因為 CDN 與負載均衡器的費用。如果除了基礎網站之外,還有許多複雜的服務,那麼會建議你不僅應該按照此分享的方式建置你的網站外,另外再配置 Cloud DNS 以便取得更好的基礎設施控制力,並且藉由統一整個基礎設施的解決方案,來降低未來維護的成本。至於僅有基礎需求的網站建置者來說,是否有更低的建置方式呢? 這個答案是肯定的! 後續將會有其他文章來分享如何用更便利且更便宜的方式打造自己的個人網站。


1. 相關實作參考