在 Compute Engine 執行 Go Bookshelf

本教學課程說明如何在 Compute Engine 執行 Go Bookshelf 應用程式。請按照本教學課程的說明,將現有的 Go 網路應用程式部署至 Compute Engine。建議您搭配參考 Bookshelf 應用程式說明文件,這也是 App Engine 標準環境教學課程的一部分。

目標

  • 將 Bookshelf 範例應用程式部署至 Compute Engine 單一執行個體。
  • 使用代管執行個體群組,對應用程式進行水平資源調度。
  • 使用 HTTP 負載平衡來供應流量。
  • 使用自動調度資源來回應流量變更。

費用

本教學課程使用的 Google Cloud Platform (GCP) 收費元件如下:

  • Compute Engine
  • Cloud Storage
  • Cloud Datastore
  • Stackdriver Logging
  • Cloud Pub/Sub

使用 Pricing Calculator 可根據您的預測使用量來產生預估費用。 初次使用 GCP 的使用者可能符合申請免費試用的資格。

事前準備

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 在 GCP Console 的專案選擇器頁面中,選取或建立 GCP 專案。

    前往專案選取器頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。瞭解如何確認您已啟用專案的計費功能

  4. 啟用Cloud Datastore、Cloud Storage 與 Cloud Pub/Sub必要的 API。

    啟用 API

  5. 安裝並初始化 Cloud SDK
  6. 安裝 Go

初始化 Cloud Datastore

Bookshelf 應用程式使用 Cloud Datastore 儲存書籍。第一次在專案中初始化 Cloud Datastore:

  1. 在 GCP 主控台開啟 Cloud Datastore

  2. 選取 Datastore 的地區,然後按一下 [Continue] (繼續)。進入 [Create an Entity] (建立實體) 頁面後,請關閉視窗。Bookshelf 應用程式已經準備好在 Cloud Datastore 建立實體。

建立 Cloud Storage 值區

以下是如何建立 Cloud Storage 值區的操作說明。「值區」是 Cloud Storage 中保存資料的基本容器。

  1. 在終端機視窗中,輸入以下指令:

    gsutil mb gs://[YOUR-BUCKET-NAME]

    其中:

    • [YOUR-BUCKET-NAME] 是 Cloud Storage 值區的名稱。
  2. 如要查看 bookshelf 應用程式中的上傳圖片,請將值區的預設存取控制清單 (ACL) 設定為 public-read

    gsutil defacl set public-read gs://[YOUR-BUCKET-NAME]

    複製範例應用程式

    您可以在 GitHub (GoogleCloudPlatform/golang-samples/tree/master/getting-started) 找到範例應用程式。

    1. 複製存放區。

      go get -u -d github.com/GoogleCloudPlatform/golang-samples/getting-started/bookshelf
      
    2. 前往範例目錄。

      cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/getting-started/bookshelf
      

    設定應用程式

    1. 開啟 config.go 進行編輯。這個檔案包含範例應用程式的設定。

    2. 將下面這一行取消註解:

      // DB, err = configureDatastoreDB("<your-project-id>")
      
    3. <your-project-id> 替換為您的專案 ID:

    4. 將下面這幾行取消註解:

      // StorageBucketName = "<your-storage-bucket>"
      // StorageBucket, err = configureStorage(StorageBucketName)
      
    5. <your-storage-bucket> 替換為您在上一步建立的值區名稱。

    6. 將下面這一行取消註解:

      // PubsubClient, err = configurePubsub("<your-project-id>")
      
    7. <your-project-id> 替換為您的專案 ID。

    在本機電腦上執行應用程式

    1. 執行應用程式以啟動本機網路伺服器:

      cd app
      go run app.go auth.go template.go
      
    2. 在網路瀏覽器中,輸入下列網址:

      http://localhost:8080

    如要停止本機網路伺服器,請按下 Control+C 鍵。

    部署至單一執行個體

    單一執行個體部署

    這部分內容會逐步引導您在 Compute Engine 上執行單一應用程式執行個體。

    將程式碼推送至存放區

    您可以使用 Cloud Source Repositories,在專案中輕鬆建立 Git 存放區,並在這裡上傳應用程式程式碼。如此一來,執行個體啟動時就能自存放區提取最新版本的應用程式程式碼。這是相當便利的做法,因為更新應用程式並不需要設定新圖片或執行個體;只需要重新啟動現有執行個體或建立新的執行個體即可。

    1. 跨平台程式碼編譯應用程式二進位檔。

      # Cross compile the app for linux/amd64
      GOOS=linux GOARCH=amd64 go build -v -o $TMP/app ../app
    2. 將應用程式二進位檔和靜態資產新增至 tar 檔案,執行個體啟動時會展開這個檔案。

      # Add the app binary
      tar -c -f $TMP/bundle.tar -C $TMP app
      
      # Add static files.
      tar -u -f $TMP/bundle.tar -C ../app templates
    3. 使用 gsutil 將 tar 檔案推送至 Cloud Storage 值區。

      # BOOKSHELF_DEPLOY_LOCATION is something like "gs://my-bucket/bookshelf-VERSION.tar".
      gsutil cp $TMP/bundle.tar $BOOKSHELF_DEPLOY_LOCATION

    gce_deployment/deploy-binary.sh 指令碼包含在範例應用程式中,可處理這個部署步驟。

    使用開機指令碼初始化執行個體

    現在,Compute Engine 執行個體可以存取您的程式碼了,而您需要使用某種方法來指示執行個體下載及執行程式碼。 執行個體可以擁有開機指令碼,在啟動或重新啟動執行個體時執行。

    以下是 Bookshelf 範例應用程式中的開機指令碼:

    set -ex
    
    # Talk to the metadata server to get the project id and location of application binary.
    PROJECTID=$(curl -s "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google")
    BOOKSHELF_DEPLOY_LOCATION=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/app-location" -H "Metadata-Flavor: Google")
    
    # Install logging monitor. The monitor will automatically pickup logs send to
    # syslog.
    curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
    service google-fluentd restart &
    
    # Install dependencies from apt
    apt-get update
    apt-get install -yq ca-certificates supervisor
    
    # Get the application tar from the GCS bucket.
    gsutil cp $BOOKSHELF_DEPLOY_LOCATION /app.tar
    mkdir -p /app
    tar -x -f /app.tar -C /app
    chmod +x /app/app
    
    # Create a goapp user. The application will run as this user.
    getent passwd goapp || useradd -m -d /home/goapp goapp
    chown -R goapp:goapp /app
    
    # Configure supervisor to run the Go app.
    cat >/etc/supervisor/conf.d/goapp.conf << EOF
    [program:goapp]
    directory=/app
    command=/app/app
    autostart=true
    autorestart=true
    user=goapp
    environment=HOME="/home/goapp",USER="goapp"
    stdout_logfile=syslog
    stderr_logfile=syslog
    EOF
    
    supervisorctl reread
    supervisorctl update
    
    # Application should now be running under supervisor

    開機指令碼會執行下列工作:

    1. 安裝 Stackdriver Logging 代理程式。代理程式會自動收集 Syslog 記錄。

    2. 安裝 Supervisor。 Supervisor 會以精靈形式執行此應用程式。

    3. 自 Cloud Storage 下載應用程式的 tar 檔,並將檔案解壓縮至 /app

    4. 設定 Supervisor 執行應用程式。若應用程式非正常結束,或遭系統管理員或其他處理序取消,Supervisor 會重新啟動應用程式。Supervisor 也會傳送應用程式的 stdoutstderr 到 syslog,再由記錄代理程式收集這些資料。

    建立及設定 Compute Engine 執行個體

    1. 建立 Compute Engine 執行個體。下列指令會建立一個新的執行個體,使其能夠存取 GCP 服務,並且執行開機指令碼。執行個體的名稱是 my-app-instance

      Linux/macOS

      gcloud compute instances create my-app-instance \
          --image-family=debian-9 \
          --image-project=debian-cloud \
          --machine-type=g1-small \
          --scopes userinfo-email,cloud-platform \
          --metadata app-location=$BOOKSHELF_DEPLOY_LOCATION \
          --metadata-from-file startup-script=gce/startup-script.sh \
          --zone us-central1-f \
          --tags http-server
      

      Windows

      gcloud compute instances create my-app-instance ^
          --image-family=debian-9 ^
          --image-project=debian-cloud ^
          --machine-type=g1-small ^
          --scopes userinfo-email,cloud-platform ^
          --metadata-from-file startup-script=gce/startup-script.sh ^
          --zone us-central1-f ^
          --tags http-server
      

    2. 查看建立執行個體的進度。

      gcloud compute instances get-serial-port-output my-app-instance --zone us-central1-f
      

      如果開機指令碼已完成,Finished running startup script 會顯示在接近指令輸出結尾的部分。

    3. 建立防火牆規則以允許流量送至執行個體。

      Linux/macOS

      gcloud compute firewall-rules create default-allow-http-8080 \
          --allow tcp:8080 \
          --source-ranges 0.0.0.0/0 \
          --target-tags http-server \
          --description "Allow port 8080 access to http-server"
      

      Windows

      gcloud compute firewall-rules create default-allow-http-8080 ^
          --allow tcp:8080 ^
          --source-ranges 0.0.0.0/0 ^
          --target-tags http-server ^
          --description "Allow port 8080 access to http-server"
      

    4. 取得執行個體的外部 IP 位址。

      gcloud compute instances list
      
    5. 如要查看執行中的應用程式,請前往 http://[YOUR_INSTANCE_IP]:8080

      其中,[YOUR_INSTANCE_IP] 是您執行個體的外部 IP 位址。

    管理及監控執行個體

    您可以使用 Google Cloud Platform 主控台來監控及管理執行個體。

    如要查看執行中的執行個體,並使用 ssh 連線至該執行個體,請前往 [Compute] (運算) > [Compute Engine]

    如要查看 Compute Engine 資源產生的所有記錄,請依序前往 [Monitoring] (監控) > [Logs] (記錄)Stackdriver Logging 採自動設定,會收集各種常見服務的記錄,其中包括 syslog。

    水平調度多個執行個體的資源

    具有代管執行個體的多執行個體部署

    Compute Engine 可輕鬆進行水平資源調度。使用代管執行個體群組與 Compute Engine 自動配置器,Compute Engine 便能在需要時自動建立應用程式的新執行個體,並在需求較低時關閉執行個體。您可以設定 HTTP 負載平衡器,將流量分散給代管執行個體群組中的執行個體。

    部署指令碼

    範例應用程式包含一個指令碼,可自動執行下列部署步驟。名為 deploy.sh 的指令碼會針對完整、已自動調度資源且負載平衡應用程式部署資源,如水平調度多個執行個體的資源所述。

    您可以親自執行下列各步驟,或是從 gce 目錄執行 gce/deploy.sh

    建立代管執行個體群組

    代管執行個體群組是以相同執行個體範本為基礎的一組性質相同的執行個體。執行個體範本可定義您執行個體的設定,其中包括來源映像檔、磁碟大小、範圍與中繼資料,也包括開機指令碼。

    1. 首先請建立範本。

      gcloud compute instance-templates create $TEMPLATE \
        --image $IMAGE \
        --machine-type $MACHINE_TYPE \
        --scopes $SCOPES \
        --metadata-from-file startup-script=$STARTUP_SCRIPT \
        --metadata app-location=$BOOKSHELF_DEPLOY_LOCATION \
        --tags $TAGS
    2. 建立執行個體群組。

      gcloud compute instance-groups managed \
        create $GROUP \
        --base-instance-name $GROUP \
        --size $MIN_INSTANCES \
        --template $TEMPLATE \
        --zone $ZONE

      --size 參數可指定群組中的執行個體數。所有執行個體均執行完開機指令碼之後,可以使用其外部 IP 位址與通訊埠 8080 分別存取各個執行個體。如要尋找執行個體的外部 IP 位址,請輸入 gcloud compute instances list。代管執行個體名稱開頭的前置字串都是 my-app,您已在 --base-instance-name 參數中指定這個前置字串。

    建立負載平衡器

    個別執行個體適用於測試或偵錯,但如要供應網路流量,最好使用負載平衡器來將流量自動導向至可用的執行個體。如要建立負載平衡器,請按照下列步驟操作。

    1. 建立健康狀態檢查。負載平衡器會以健康狀態檢查判斷能夠供應流量的執行個體。

      gcloud compute http-health-checks create ah-health-check \
        --request-path /_ah/health \
        --port 8080
    2. 建立具名通訊埠。HTTP 負載平衡器會尋找 http 服務來瞭解要將流量導向至哪個通訊埠。在現有的執行個體群組中,將通訊埠 8080 命名為 http

      gcloud compute instance-groups managed set-named-ports \
          $GROUP \
          --named-ports http:8080 \
          --zone $ZONE
    3. 建立後端服務。後端服務是負載平衡流量的目標。它會定義應將流量導向哪個執行個體群組,以及要使用哪項健康狀態檢查功能。

      gcloud compute backend-services create $SERVICE \
        --http-health-checks ah-health-check
    4. 新增後端服務。

      gcloud compute backend-services add-backend $SERVICE \
        --instance-group $GROUP \
        --zone $ZONE
    5. 建立網址對應與 Proxy。網址對應定義了應將哪些網址導向至哪些後端服務。在這個範例中,所有流量均由一項後端服務提供。如果您想讓要求在多個地區或群組之間達成負載平衡,則您可以建立多項後端服務。Proxy 會接收流量,並且使用網址對應將流量轉送至後端服務。

      1. 建立網址對應。

        gcloud compute url-maps create $SERVICE-map \
          --default-service $SERVICE
      2. 建立 Proxy。

        gcloud compute target-http-proxies create $SERVICE-proxy \
          --url-map $SERVICE-map
    6. 建立通用轉送規則。通用轉送規則會將公開 IP 位址及通訊埠與 Proxy 繫結在一起。

      gcloud compute forwarding-rules create $SERVICE-http-rule \
        --global \
        --target-http-proxy $SERVICE-proxy \
        --port-range 80

    設定自動配置器

    負載平衡器可確保在您所有健康狀態良好的執行個體之間分散流量。但是,如果您的執行個體要處理的流量太多,會發生什麼事?您可以手動新增更多的執行個體,但更好的做法是設定 Compute Engine 自動配置器,使其因應流量需求自動建立及刪除執行個體。

    1. 建立自動配置器。

      gcloud compute instance-groups managed set-autoscaling \
        $GROUP \
        --max-num-replicas $MAX_INSTANCES \
        --target-load-balancing-utilization $TARGET_UTILIZATION \
        --zone $ZONE

      上述指令會在代管執行個體群組中建立自動配置器,使群組容量自動提高到最多 10 個執行個體。負載平衡器使用率超過 50% 時會新增執行個體,使用率低於 50% 時則會移除執行個體。

    2. 建立防火牆規則。

      gcloud compute firewall-rules create default-allow-http-8080 \
          --allow tcp:8080 \
          --source-ranges 0.0.0.0/0 \
          --target-tags http-server \
          --description "Allow port 8080 access to http-server"

    3. 檢查進度,直到至少一個執行個體回報 HEALTHY 為止。

      gcloud compute backend-services get-health frontend-web-service --global
      

    查看您的應用程式

    1. 取得負載平衡器的轉送 IP 位址。

      gcloud compute forwarding-rules list --global
      

      您的轉送規則 IP 位址位於 IP_ADDRESS 資料欄。

    2. 在瀏覽器中,輸入來自清單的 IP 位址。您的應用程式已達到負載平衡且已自動調度資源,現在正在 Compute Engine 上執行!

    管理及監控部署

    管理多個執行個體就像管理單一執行個體一樣簡單。您可以使用 GCP 主控台監控負載平衡、自動調度資源與代管執行個體群組。

    您可以使用 [Compute Engine] > [執行個體群組] 部分,管理執行個體群組與自動調度資源設定。

    您可以使用 [網路服務] > [負載平衡] 部分來管理負載平衡設定,其中包括網址對應與後端服務。

清除

如何避免系統向您的 Google Cloud Platform 帳戶收取您在本教學課程中使用資源的相關費用:

執行拆解指令碼

如果您執行了 deploy.sh 指令碼,請執行 teardown.sh 指令碼來移除 deploy.sh 指令碼建立的所有資源。這會將您的專案恢復為執行 deploy.sh 指令碼之前的狀態,且有助於避免後續收費。如要移除在本教學課程開頭建立的單一執行個體與 Cloud Storage 值區,請按照下一個部分中的操作說明操作。

手動刪除資源

如果您已按照本教學課程中的步驟操作,您可以手動刪除之前建立的雲端資源。

刪除負載平衡器

  1. 在 GCP 主控台中,前往「Load Balancing」(負載平衡) 頁面。

    前往「負載平衡」頁面

  2. 勾選您要刪除之負載平衡器旁的核取方塊。

  3. 按一下頁面頂端的 [刪除] 按鈕,刪除負載平衡器。

  4. 在「刪除負載平衡器」對話方塊中,選取關聯的後端服務和健康狀態檢查資源。

  5. 按一下 [Delete Load Balancer] (刪除負載平衡器) 按鈕,刪除負載平衡器及其關聯資源。

刪除 Compute Engine 代管執行個體群組

如要刪除 Compute Engine 執行個體群組:

  1. 前往 GCP Console 的「Instance groups」(執行個體群組) 頁面。

    前往「Instance groups」(執行個體群組) 頁面

  2. 勾選您要刪除的執行個體群組相應核取方塊。
  3. 按一下 [Delete] (刪除) ,藉此刪除執行個體群組。

刪除單一 Compute Engine 執行個體

如要刪除 Compute Engine 執行個體:

  1. 前往 GCP Console 的「VM Instances」(VM 執行個體) 頁面。

    前往「VM Instances」(VM 執行個體) 頁面

  2. 勾選您要刪除的執行個體相應核取方塊。
  3. 按一下 [Delete] (刪除) ,藉此刪除執行個體。

刪除 Cloud Storage 值區

如要刪除 Cloud Storage 值區:

  1. 前往 GCP Console 的「Cloud Storage Browser」(Cloud Storage 瀏覽器) 頁面。

    前往「Cloud Storage Browser」(Cloud Storage 瀏覽器) 頁面

  2. 按一下您要刪除的值區的核取方塊。
  3. 按一下「Delete」(刪除) 圖示 以刪除值區。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁