在 Node.js 上使用 Cloud Run 部署及執行容器

1. 事前準備

6a5cf23c8e20491f.png

Cloud Run 是代管運算平台,能讓您執行可透過 HTTP 要求叫用的無狀態容器。Cloud Run 採用無伺服器技術,可為您省去管理基礎架構的麻煩,讓您專心處理最重要的工作,也就是建構出色的應用程式。這項服務是以 Knative 打造而成,可讓您選擇透過 Cloud Run (全代管) 或 Cloud Run for Anthos 執行容器。本程式碼研究室的目標是協助您建構容器映像檔,並部署至 Cloud Run。

必要條件

不適用

2. 設定和需求條件

自修實驗室環境設定

  1. 登入 Cloud 控制台,建立新專案或重複使用現有專案。(如果沒有 Gmail 或 G Suite 帳戶,請先建立帳戶)。

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

請記住專案 ID,這是所有 Google Cloud 專案中不重複的名稱 (上述名稱已遭占用,因此不適用於您,抱歉!)。本程式碼研究室稍後會將其稱為 PROJECT_ID

  1. 接著,您必須在 Cloud 控制台中啟用帳單,才能使用 Google Cloud 資源。

完成本程式碼研究室的費用應該不高,甚至完全免費。請務必按照「清除」部分的指示操作,瞭解如何停用資源,避免在本教學課程結束後繼續產生帳單費用。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

Cloud Shell

雖然您可以透過筆電遠端操作 Google Cloud,但本實驗室會使用 Cloud Shell,這是 Google Cloud 中執行的指令列環境。

這部以 Debian 為基礎的虛擬機器,搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。也就是說,您只需要瀏覽器 (Chromebook 也可以) 就能完成本程式碼研究室。

  1. 如要從 Cloud 控制台啟用 Cloud Shell,只要按一下「啟用 Cloud Shell」 fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q 即可 (佈建並連線至環境的作業需要一些時間才能完成)。

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

連至 Cloud Shell 後,您應該會看到驗證已完成,專案也已設為獲派的專案 ID PROJECT_ID

gcloud auth list

指令輸出

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

指令輸出

[core]
project = <PROJECT_ID>

如果專案未設定,請發出下列指令:

gcloud config set project <PROJECT_ID>

在尋找「PROJECT_ID」嗎?請檢查您在設定步驟中使用的 ID,或在 Cloud 控制台資訊主頁中尋找:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell 也會預設設定部分環境變數,這些變數在您執行後續指令時可能很有用。

echo $GOOGLE_CLOUD_PROJECT

指令輸出

<PROJECT_ID>
  1. 最後,設定預設可用區和專案。
gcloud config set compute/zone us-central1-f

你可以選擇各種不同區域。詳情請參閱「地區和區域」。

啟用 Cloud Run API

在 Cloud Shell 中啟用 Cloud Run API。

gcloud services enable run.googleapis.com

這時應該會顯示類似以下的成功訊息:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. 編寫範例應用程式

您將建構以 Express 為基礎的簡易型 Node.js 應用程式,用於回應 HTTP 要求。

如要建構應用程式,請使用 Cloud Shell 建立名為 helloworld-nodejs 的新目錄,然後將目錄變更為該目錄。

mkdir helloworld-nodejs
cd helloworld-nodejs

建立 package.json 檔案,並加入以下內容:

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

最重要的是,上述檔案包含 start 指令碼,以及 Express 網頁應用程式架構的依附元件。

接著,在同一個目錄中建立 index.js 檔案,然後將下列內容複製到檔案中:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

這段程式碼會建立基本的網路伺服器,用於監聽 PORT 環境變數定義的通訊埠。應用程式現已就緒,您可以開始將應用程式容器化、測試,並上傳至 Container Registry。

4. 將應用程式容器化並上傳至 Container Registry

如要將範例應用程式容器化,請在來源檔案所在的目錄中建立名為 Dockerfile 的新檔案,然後複製下列內容:

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

接著,從含有 Dockerfile 的目錄執行下列指令,使用 Cloud Build 建構容器映像檔:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT 是環境變數,在 Cloud Shell 中執行時,會包含您的 Google Cloud 專案 ID。您也可以執行 gcloud config get-value project 取得。

容器推送到 Artifact Registry 後,您會看到包含映像檔名稱 (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld) 的 SUCCESS 訊息。映像檔會儲存在 Container Registry 中,日後如有需要,可以重複使用。

使用以下指令,列出與當前專案相關聯的所有容器映像檔:

gcloud container images list

如要透過 Cloud Shell 在本機執行及測試應用程式,請使用下列標準 docker 指令啟動應用程式:

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

在 Cloud Shell 中,按一下「Web Preview」(網頁預覽) 170b7a95be8c6296.png,然後選取「Preview on port 8080」(透過以下通訊埠預覽:8080)

3618ca3a4a135570.png

系統會開啟瀏覽器視窗,顯示「Hello World!」

a0307f34cacf9e6a.png

您也可以直接使用 curl localhost:8080

5. 部署至 Cloud Run

如要將容器化應用程式部署至 Cloud Run,請執行下列指令 (請務必根據您建構的應用程式調整為正確的映像檔名稱,或使用gcr.io/cloudrun/hello預先建構的映像檔):

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

--allow-unauthenticated 部署選項可讓您不必驗證就能存取應用程式。--platform managed \ 部署選項表示您要求的是全代管環境 (而非透過 Anthos 取得 Kubernetes 基礎架構)。

稍候片刻,等待部署作業完成。完成後,指令列會顯示服務網址。

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

您現在可以在網路瀏覽器中開啟服務網址,造訪您所部署的容器:

63260b4d3aee42b8.png

Cloud Run 會自動水平擴充容器映像檔以處理收到的要求,並在需求減少時縮減規模。您只需要支付處理要求期間使用的 CPU、記憶體和網路費用。

6. 清除所用資源

不使用服務時,Cloud Run 不會收費,但您可能仍須支付已建構容器映像檔的儲存費用。

如要避免產生費用,您可以刪除 Google Cloud 專案,讓專案中使用的所有資源不再產生費用;您也能執行下列指令,直接刪除 helloworld 映像檔:

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

如要刪除 Cloud Run 服務,請使用下列指令:

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

7. 恭喜

恭喜!您已將封裝在容器映像檔的應用程式部署到 Cloud Run。

瞭解詳情

建議您接下來參閱「快速入門:部署至 Google Cloud 中的 Cloud Run for Anthos」。

如要進一步瞭解如何從程式碼來源建構適用於 Cloud Run 的無狀態 HTTP 容器,並推送至 Container Registry,請參閱下列資源:

如要進一步瞭解基礎開放原始碼專案 Knative,請參閱 Knative