首頁  >  文章  >  後端開發  >  在 Google Cloud Run 上部署無伺服器應用程式

在 Google Cloud Run 上部署無伺服器應用程式

Susan Sarandon
Susan Sarandon原創
2024-11-19 18:23:02501瀏覽

介紹

在本指南中,我將從 Twitch 的 TeoMeWhy 系統(目前位於 AWS 上)部署容器,並將其放置在 GCP 上。

AWS 的當前結構
Implantando Aplicações Serverless no Google Cloud Run

GCP 架構

Implantando Aplicações Serverless no Google Cloud Run

不會使用複雜的自動化工具,一切都將透過控制台完成,與 Github 整合並在每次提交到 main 時部署映像。
我們將使用:

  • Cloud Run - 適用於 Web 應用程式
  • Cloud SQL - 適用於 MySQL 資料庫
  • GCE - 運行 Teomebot
  • 雲端儲存 - 物件儲存 (S3)
  • Cloud Build - 建立應用程式部署
  • 秘密管理器 - 安全地保存應用程式憑證。

取得應用程式

  1. 存取 TeoMeWhy 的 GitHub 和 fork 與該專案相關的應用程式。
  2. 在儲存庫頁面上,按一下已加星號,然後按一下分叉Implantando Aplicações Serverless no Google Cloud Run
  3. 分叉頁面上,為分叉命名,然後按建立分叉Implantando Aplicações Serverless no Google Cloud Run
  4. 如果您想複製整個環境,請對專案中的其他儲存庫重複此程序。
  5. 製作 分叉 克隆 ,以便在將應用程式傳送到 GCP 之前根據需要調整應用程式。
git clone git@github.com:cslemes/points-to-go.git

建立 Dockerfile 以建立容器映像

導航到克隆的儲存庫資料夾。該存儲庫已包含為 Docker 設計的 Dockerfile。我們來分析一下:

```
FROM golang:latest
WORKDIR /app/
COPY . .
RUN go build main.go
CMD ["./main"]
```

這個 Dockerfile 是可用的,但我們將使用 多階段建置 來最佳化它,以減少最終映像的大小。由於 Go 不需要外部依賴項,因此我們可以使用最小的基礎鏡像,例如 scratch.

  1. 建構鏡像替換為更輕的版本,並命名以供其他階段參考。

    FROM golang:1.23.1-alpine3.20 AS build
    
  2. 新增 go mod download 指令來快取依賴項並進行 go mod 驗證以確保它們與 go.sum. 檔案中的 checksums
    匹配

    RUN go mod download && go mod verify
    
  3. 要最佳化生產二進位文件,請新增以下參數:

    • CGO_ENABLED=0:停用 CGO 支援。 CGO 是 Go 中的功能,可讓您呼叫 C 程式碼,但是當您停用它時,您將獲得完全靜態的二進位文件,不依賴外部程式庫。
    • GOARCH=amd64:設定編譯的目標架構。 amd64 是具有 64 位元處理器的機器上使用的架構,例如大多數現代伺服器和桌上型電腦。
    • GOOS=linux:定義編譯的目標作業系統。這裡是針對 Linux 進行配置的,這意味著生成的二進位檔案將在 Linux 系統上可執行。
    • go build -o /app/points:編譯程式碼並將二進位檔案儲存到指定路徑(/app/points)。
    • -a:強制重新編譯所有套件,包括依賴項,即使它們沒有更改。確保使用新標誌和設定重新編譯所有內容可能很有用。
    • -ldflags="-s -w":這些是大小最佳化標誌。
    • -s 從二進位檔案中刪除偵錯符號表。
    • -w 刪除堆疊追蹤資訊。這些選項減少了最終二進位檔案的大小。
    • -installsuffix cgo:在安裝目錄中添加後綴,以區分禁用了 CGO 的二進位。這可以避免與使用 CGO 的二進位檔案發生衝突。
    git clone git@github.com:cslemes/points-to-go.git
    
  4. (可選)為了使鏡像更小,我們可以使用upx來壓縮二進位文件,upx(Ultimate Packer for eXecutables)是一個壓縮可執行二進位檔案以減少檔案大小的工具,例如Go二進位檔案。將會有更長的建置時間,以及容器啟動的更長延遲,因此必須評估哪一個對其實施最有利。由於目標是在已經具有冷啟動功能的 Cloud Run 中使用它,它會在不使用容器時暫停容器,我們不會使用它,因為它會增加容器的初始化時間。

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
  • upx --ultra-brute -qq 點:使用所有可能的壓縮選項,積極壓縮點二進位文件,並且不顯示輸出訊息。
  • upx -t 點:測試壓縮的二進位以確保它仍然正常工作。
  • 現在二進位檔案準備好了,讓我們進行第二階段,即將二進位檔案複製到乾淨的映像。

    FROM golang:1.23.1-alpine3.20 AS build
    
    • scrap 是 Docker 中的一個特殊基礎映像,它代表一個完全空的映像,沒有任何作業系統或依賴項。在 Go 應用程式的極簡圖像中使用 FROM scrap 很常見,靜態二進位就足夠了。
  • 完整文件

    git clone git@github.com:cslemes/points-to-go.git
    
  1. 比較建構
  2. Dockerfile 最佳化和使用 upx 可將映像縮小多達 3 倍。
  3. 使用 Trivy 分析原始影像顯示有 904 個 CVE,而暫存影像則沒有 CVE。
Imagem Tipo Tamanho
points-to-go Otimizado 14MB
points-to-go Com upx 5.77MB
points-to-go original 1.76GB

Implantando Aplicações Serverless no Google Cloud Run

  1. 對其他儲存庫重複這些設定。

部署資料庫

  1. 在控制台中,存取側邊選單中的SQLImplantando Aplicações Serverless no Google Cloud Run
  2. 或在搜尋列中搜尋“SQL”,然後從清單中選擇 SQL。 Implantando Aplicações Serverless no Google Cloud Run
  3. 在 Cloud SQL 頁面上,點選建立實例並選擇 MySQL。 Implantando Aplicações Serverless no Google Cloud Run
  4. 選擇正在編輯的企業
  5. 在「編輯預設」下,選擇沙盒
  6. 將資料庫版本保留為MySQL 8.0Implantando Aplicações Serverless no Google Cloud Run
  7. 實例 ID 下為實例命名並設定密碼。
  8. 您可以透過擴充密碼原則來指定密碼原則 Implantando Aplicações Serverless no Google Cloud Run
  9. 定義區域和區域,我們將把它留在一個區域中。 Implantando Aplicações Serverless no Google Cloud Run
  10. 在自訂實例中我們可以根據需要調整硬件,選項會根據我們選擇的版本而有所不同。
  11. 依需求將CPU調整為1,磁碟調整為10GB。 Implantando Aplicações Serverless no Google Cloud Run
  12. 在連線中,取消選取公用 IP 並選取私人 IP。
  13. 在私人存取連線中按一下設定連線
  14. 選擇使用自動分配的範圍
  15. 點選繼續
  16. 點選建立連線 Implantando Aplicações Serverless no Google Cloud Run
  17. 點選建立實例並等待建立。 Implantando Aplicações Serverless no Google Cloud Run
  18. 要連接到實例,請啟動 Cloud Shell 並執行:

    git clone git@github.com:cslemes/points-to-go.git
    

Implantando Aplicações Serverless no Google Cloud Run

  1. 輸入上一個步驟中指派的密碼。
  2. 然後您將收到連線錯誤,因為 Cloud shell 無法存取您的私人 VPC。 Implantando Aplicações Serverless no Google Cloud Run
  3. 為了簡化通過Cloud shell的連接,讓我們編輯實例並標記公共IP,在附錄中我將展示如何創建VPC對等以通過雲貝殼 Implantando Aplicações Serverless no Google Cloud Run
  4. 再次嘗試連線。
  5. Implantando Aplicações Serverless no Google Cloud Run
  6. 建立應用程式資料庫:


    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
  7. Cloud Shell仍然有一個基於VSCode的文字編輯器,你可以直接透過它做一些活動,它在你的/home 中有5GB 的持久卷,硬體是具有1vCPU 和1.7GB RAM 的e2-small VM。
    Implantando Aplicações Serverless no Google Cloud Run

在 Cloud Run 中建立容器

    在 Google Cloud 控制台中,透過側邊選單或搜尋列存取
  1. Cloud Run Implantando Aplicações Serverless no Google Cloud Run
  2. 在 Cloud Run 頁面上,按一下
  3. 部署容器 並選擇 服務 選項。 Implantando Aplicações Serverless no Google Cloud Run
  4. 選擇部署方法
  5. 部署服務有三個選項:
    • 使用登錄中的容器映像。
    • 直接連接到儲存庫。
    • 建立一個函數(使用
    • 雲函數,與 Run 整合)。
  6. 對於本指南,選擇
  7. 使用 GitHub 進行持續部署,讓 Google 自動設定 CI/CD 管道。
  8. 點選

    使用 Cloud Build 設定
    Implantando Aplicações Serverless no Google Cloud Run

  9. 設定與 GitHub 的連線

  10. 點擊

    驗證以啟用 Google 與您的 GitHub 整合。

  11. 授權訪問,選擇允許存取所有儲存庫或僅允許存取特定儲存庫。

  12. 登入完成後,點選下一步
    Implantando Aplicações Serverless no Google Cloud Run

  13. 選擇建置類型

  14. 在建置步驟中,選擇使用 Dockerfile 或受支援的應用程式以及來自 GCP 的 Buildpacks

  15. 選擇Dockerfile並根據需要調整路徑/檔案名稱
    Implantando Aplicações Serverless no Google Cloud Run

  16. 服務設定

  17. 配置以下參數:

    • 驗證:選擇允許未經身份驗證的呼叫
    • CPU 分配:選擇 CPU 僅在請求處理期間分配
    • 輸入控制:選擇內部Implantando Aplicações Serverless no Google Cloud Run
  18. 依應用需求調整容器連接埠。
    Implantando Aplicações Serverless no Google Cloud Run

  19. 在安全性標籤中的服務帳戶下,按一下建立新服務帳戶
    Implantando Aplicações Serverless no Google Cloud Run

  20. 新增角色

    • 儲存物件管理員
    • Cloud Run 管理員
    • 秘密經理秘密顧問
    • Cloud SQL 用戶端
    • 雲端建置服務帳戶
    • 工件註冊表記錄器
    • 服務帳戶用戶 Implantando Aplicações Serverless no Google Cloud Run
  21. 分析應用程式程式碼,我們需要將環境變數傳遞給資料庫。

    git clone git@github.com:cslemes/points-to-go.git
    
  22. 我們必須將應用程式程式碼更改為使用 Unix 套接字的 Cloud Sql 標準,並且 Cloud Run 不直接存取資料庫,它使用 Cloud SQL Auth Proxy

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
  23. 在容器中,前往「變數和秘密」選項卡,然後按一下「新增變數」。

  24. 加入必要的變數。

  25. 銀行地址遵循以下模式:PROJECT_ID:REGION:INSTANCE_NAME,您也可以在第 16 項中取得下面的名稱。
    Implantando Aplicações Serverless no Google Cloud Run

  26. 我們將在「參考機密」中輸入的銀行密碼

  27. 如果建立新金鑰選項已停用,那是因為您需要啟動 Api。

  28. 點選建立新秘密
    Implantando Aplicações Serverless no Google Cloud Run

  29. 定義金鑰名稱並點選建立金鑰
    Implantando Aplicações Serverless no Google Cloud Run

  30. 在 Cloud SQL Connections 中,我們將新增我們建立的銀行的 URL
    Implantando Aplicações Serverless no Google Cloud Run

  31. 要建立應用程式架構,程式碼要求我們傳遞參數migrations=true。

  32. 我們將在函數參數中新增migrations=true,然後在下一個容器版本中將其刪除。
    Implantando Aplicações Serverless no Google Cloud Run

  33. 其他欄位保留默認,然後按一下「建立」
    Implantando Aplicações Serverless no Google Cloud Run

  34. 使用 Thunder 用戶端測試應用程式。

  35. 建立客戶端
    Implantando Aplicações Serverless no Google Cloud Run

  36. 閱讀註冊客戶
    Implantando Aplicações Serverless no Google Cloud Run

建立 Teomebot 服務

聊天機器人不會部署在 Cloud Run 上,而是安裝在 Google Compute Engine (GCE) 上。與 Cloud Run 不同,Compute Engine 非常理想,因為聊天機器人需要持續活躍才能與聊天互動。

此外,我們還將介紹如何使用容器、秘密管理和 Cloud Build 配置來實現部署自動化。

在 Google Compute Engine (GCE) 上建立虛擬機

  1. 在 GCP Console 側邊選單中存取 Compute Engine
  2. 點選建立實例Implantando Aplicações Serverless no Google Cloud Run
  3. 輸入實例的名稱(例如 teomebot-instance)。
  4. 依需求設定區域區域並記下此資訊以供以後使用。 Implantando Aplicações Serverless no Google Cloud Run
  5. 機器設定中,選擇E2類型,並在預設中,選擇e2-micro。 Implantando Aplicações Serverless no Google Cloud Run
  6. 點選容器選項卡,然後點選部署容器
  7. 暫時使用nginx:latest鏡像來完成初始配置。
  8. 新增環境變數:
    • TWITCH_BOT:機器人名稱。
    • TWITCH_CHANNEL:Twitch 頻道名稱。
    • HOST_DB:Cloud SQL 資料庫的私有 IP。
    • USER_DB:銀行用戶。
    • PORT_DB:銀行埠。
    • URL_POINTS:服務端點Points-to-Go
  9. 點選選擇 Implantando Aplicações Serverless no Google Cloud Run
  10. 身分和 API 存取下,選擇為此專案配置的服務帳戶。 Implantando Aplicações Serverless no Google Cloud Run
  11. 其餘設定保留預設值,然後按一下建立

使用 Secret Manager 新增 Secret

  1. 您可能已經注意到,我們沒有傳遞秘密,在運算引擎中沒有像在雲端運行中那樣簡單的方法來傳遞它們。我的解決方案是在應用程式程式碼中添加一個函數,以直接從秘密管理器讀取資訊。
  2. 在 GCP Console 中存取 Secret Manager
  3. 點選建立秘密
  4. 輸入描述性名稱(例如 twitch-token)並新增對應的值。
  5. 複製產生的金鑰的路徑(例如:projects/123456/secrets/twitch-token/versions/latest)。 Implantando Aplicações Serverless no Google Cloud Run
    1. 建立一個新的 utils/gcp.go 文件
  6. 更改 utils/db.go 來呼叫該函數,並將秘密管理器路徑作為參數傳遞。

    git clone git@github.com:cslemes/points-to-go.git
    
  7. 更改 main.go 以取得 Twitch 憑證

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    

   migration := flag.Bool("migrations", false, "執行資料庫遷移")

    flag.Parse()

    godotenv.Load()
    使用者 := os.Getenv("TWITCH_BOT")
    // 改變
    oauth := utils.AccessSecretVersion("projects/551619572964/secrets/twitch-token/versions/latest")

    頻道 := os.Getenv("TWITCH_CHANNEL")
``

雲端建置

配置雲端建置

Cloud Build 將用於自動建立容器映像並將其部署到 Compute Engine。

  1. 在儲存庫的根目錄中建立一個 cloudbuild.yaml 文件,內容如下:
  2. 替換

    FROM golang:1.23.1-alpine3.20 AS build
    

_VERSION 變數設定為與 v1.0 相符的值。與目前提交的雜湊值 (${COMMIT_SHA})。這會為每個建置創建一個唯一的版本,確保每個鏡像都可以透過版本和提交來識別。

  • 步驟
    步驟部分定義 Cloud Build 必須執行的步驟。在這裡,我們有四個步驟:建置、推送(兩次)和更新。

  • 第 1 步:建立 Docker 映像

    RUN go mod download && go mod verify
    

此步驟執行 Docker 映像的建置:

  • “--no-cache”:強制建置而不使用快取。
  • “-t”:為建立的圖像定義標籤:
    • gcr.io/$PROJECT_ID/teomebot:$_VERSION:有使用提交雜湊的標籤的圖片。
    • gcr.io/$PROJECT_ID/teomebot:latest: 有最新標籤的圖片。
  • “.”:將目前目錄定義為建置上下文。

id: Build 標籤是步驟的可選標識符,對於參考和偵錯很有用。

  • 第二步:帶有版本標籤的鏡像推送
RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o /app/points -a -ldflags="-s -w" -installsuffix cgo

此步驟將帶有特定標籤 ($_VERSION) 的鏡像推送到 Google 容器註冊表,從而允許將建置中產生的版本儲存在儲存庫中。

  • 第三步:帶標籤最新的圖片推播

    RUN apk add --no-cache curl upx
    RUN upx --ultra-brute -qq points && upx -t points
    

此步驟將帶有最新標籤的鏡像推送到 Google Container Registry,以最新版本更新最新鏡像。

  • 第 4 步:GCE 實例上的容器更新

     FROM scratch AS prod
     WORKDIR /app
     COPY --from=build /app/points /
     CMD ["./points"]
    

此步驟使用 gcloud 指令更新 Google Compute Engine 實例上的容器:

  • “teomebot-instance”:指定運行容器的實例的名稱。
  • --container-image:定義實例應使用的容器映像。在這裡,使用最新版本的圖像。
  • --zone=$_DEPLOY_ZONE:使用變數指定部署區域。
  • --container-restart-policy=always:將容器重新啟動策略設定為在失敗時始終重新啟動。
  • 選項

    git clone git@github.com:cslemes/points-to-go.git
    

logging: CLOUD_LOGGING_ONLY 選項指定 Cloud Build 應僅記錄至 Cloud Logging,儲存資料並專注於 GCP 日誌。

  • 最終文件

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    

建立容器鏡像建立觸發器

設定服務帳戶

  1. 前往 Google Cloud 控制台中的 Cloud Build
  2. 前往設定
  3. 點選服務帳號權限
  4. 找到為Cloud Run建立的服務帳戶。
  5. 啟動選項設定為首選服務帳戶
  6. 為服務帳戶啟用計算實例管理員角色。 Implantando Aplicações Serverless no Google Cloud Run 建立觸發器
  7. 在側邊選單中,點選觸發器,然後點選建立觸發器Implantando Aplicações Serverless no Google Cloud Run
  8. 輸入觸發器的描述性名稱。
  9. 儲存庫中,按一下連接儲存庫並選擇Teomebot儲存庫。 Implantando Aplicações Serverless no Google Cloud Run
  10. 設定中,選擇選項雲端建置設定檔
  11. 新增 _DEPLOY_ZONE 替換變量,其值與建立實例的區域相對應。
  12. 在服務帳戶中,檢查所選帳戶是否符合步驟 6 中的設定。 Implantando Aplicações Serverless no Google Cloud Run
  13. 點選儲存運行觸發器
  14. 在概述畫面上,在新建立的觸發行中,按一下「執行」以手動執行該流程。 Implantando Aplicações Serverless no Google Cloud Run
  15. 在流程詳細資料中,請按照鏡像建置步驟檢查可能存在的錯誤。 Implantando Aplicações Serverless no Google Cloud Run

測試應用程式

  1. 在 Compute Engine 面板中,複製 ssh 指令來存取實例,或使用 ssh Web 用戶端,然後連線實例。
  2. 連接到實例並執行以下命令來檢查容器的狀態:

    git clone git@github.com:cslemes/points-to-go.git
    

Implantando Aplicações Serverless no Google Cloud Run

解決證書問題

  1. 如果發生與憑證相關的錯誤(由臨時基礎映像引起),請將其替換為 distroless 映像。在 Dockerfile 中,將定義基礎映像的行變更為:

    git clone git@github.com:cslemes/points-to-go.git
    

致:

```
FROM golang:latest
WORKDIR /app/
COPY . .
RUN go build main.go
CMD ["./main"]
```

Dockerfile 已更新:

FROM golang:1.23.1-alpine3.20 AS build

調整 Secret Manager 權限

  1. 更改服務帳戶範圍以存取Secret Manager
  2. 前往 Google Cloud Console。
  3. 在側邊選單中,前往Compute Engine > > VM 實例.
  4. 找到並點選您的虛擬機器實例的名稱。
  5. 在虛擬機器詳情頁面,點擊停止關閉實例(此步驟是必要的,因為服務帳戶範圍只能在實例停止時修改)。
  6. 實例停止後,點選頁面頂部的編輯
  7. 向下捲動到身分和存取 API 部分。
  8. 服務帳戶下,選擇您的應用程式所使用的服務帳戶。
  9. API 存取範圍下,選擇允許完全存取所有雲端API 或按一下設定特定API 存取範圍 並新增範圍https://www .googleapis.com/auth/cloud-platform.
  10. 調整範圍後,點選儲存套用變更。
  11. 透過點選開始重新啟動實例。
  12. 或透過命令列,停止實例,執行命令,然後啟動。

    RUN go mod download && go mod verify
    

增加更多容器

其他服務遵循相同的點到去流程,對於相互通訊的服務,建立環境變數來配置端點位址,該位址始終為 https 連接埠 443。

為了與其他服務通信,我調整了程式碼以接收另一個帶有服務 url 的環境變量,例如,它看起來像這樣:

RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o /app/points -a -ldflags="-s -w" -installsuffix cgo

測試機器人

測試機器人與 Twitch 的通訊。

Implantando Aplicações Serverless no Google Cloud Run

網路安全調整
完成測試後,將僅供內部存取的容器放置在VPC中。

Implantando Aplicações Serverless no Google Cloud Run

結論

至此,我們完成了 TeoMeWhy 系統的遷移,該指南將作為遷移其他 TeoMeWhy 服務的基礎。

實現的主要目標是:

技術成果

  • 將容器化應用程式遷移到 Cloud Run,實現自動擴展並降低成本
  • 透過多階段建置最佳化 Docker 映像,顯著減少映像大小和漏洞
  • 使用 Cloud SQL 實作託管資料庫,確保高可用性和安全性
  • 使用 Cloud Build 進行自動化 CI/CD 配置,支援從 GitHub 自動部署
  • 使用 Secret Manager 進行安全憑證管理

架構改進

  • 服務之間明確的職責分離
  • 使用私有連線以提高安全性
  • 實作無伺服器標準以最佳化成本
  • 建置與部署流程的自動化
  • 與 GitHub 儲存庫無縫整合

獲得的好處

  1. 成本:透過無伺服器模型和資源最佳化降低成本
  2. 可維護性:透過自動化部署輕鬆維護
  3. 安全性:正確管理秘密與私人連結
  4. 可擴充性:能夠依照需求自動擴充
  5. 監控:透過原生 GCP 工具提高基礎設施可見度

附錄

啟用秘密管理器 API

  1. 在 Google Cloud 控制台中,搜尋 Secret Manager API
  2. 點選搜尋結果中的API。 Implantando Aplicações Serverless no Google Cloud Run
  3. 在詳細資料畫面上,按一下啟動Implantando Aplicações Serverless no Google Cloud Run

參考

  • Github TeoMeWhy
  • Twitch Teo Me Why
  • Cloud Run 文件
  • 計算引擎文件
  • 雲端建置文件
  • 秘密管理器文件

以上是在 Google Cloud Run 上部署無伺服器應用程式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn