在 Cloud Run 上建立服務 - Nginx 靜態網頁

在 Google GCP 上建立靜態網頁

在已經有了透過自己 host 的機器跑 docker 服務之後,一直想試試看把某些服務移動到雲端 serverless 架構去使用,而雖然我已經有用了如 Cloudflarfe Page 這樣的靜態網頁,還是一直想試試看以及了解 GCP Cloud Run ,因此簡單花了時間研究。

先說一下結論

Cloud run 跑靜態網頁實在太貴了
後續應該可以試試看用來當 API Server

不過這篇文章還是有用途的,可以理解 如何初步在 Cloud Run 上建立服務,並且主要分成以下章節:

  1. User Story
  2. 流程架構
  3. 前置作業 - 服務啟用與 Artifact Registry 建立
  4. 在 gcloud shell 建立 docker 專案
  5. Docker 打包上傳到 Artifact Registry
  6. 在 Cloud Run 建立服務與測試

本篇文章的前提作業是:

  1. 你有一個 GCP 專案
  2. 你有操作 terminal 的基本知識

1. User Story

我是 一個開發者
我想要 把我的靜態網站服務放上 Cloud Run
如此一來 我不用自己租 Server,並且用 GCP 代管

2. 流程架構

把包含 GCP Console 以及要寫 Code 的部分一起講

  
@startuml
actor User as user
participant "API" as api
participant "IAM" as iam
participant "Cloud Shell" as shell
database "Artifact Registry" as repo
collections "Cloud Run" as cloudrun

== 階段 1:前置作業 ==
user -> api : 啟用 API
user -> iam : 更新權限
user -> repo : 創建空的儲存庫

== 階段 2:建置並推送 Image ==
user -> shell : 進入 Cloud Shell
rnote over shell
 建立 Docker 專案
 docker build → 建立 Image
 docker tag → 標記版本
endrnote
shell -> repo : docker push 推送 Image

== 階段 3:部署到 Cloud Run ==
user -> cloudrun : 前往建立服務
repo -> cloudrun : 使用推送的 Iamge
rnote over cloudrun
 設定部署,測試
endrnote
@enduml

  

3. 前置作業 - 服務啟用與 Artifact Registry 建立

首先,先要登入到你的 GCP 專案上,依序完成以下內容:

(1) API 設定

前往 Google API Console 啟用 Artifact Registry API,其實也就只有這個而已,不過也可以一起打開 Cloud Run

(2) IAM 設定

前往 IAM,為自己的帳號添加以下權限內容:

  • roles/cloudbuild.builds.editor
  • roles/run.admin
  • roles/iam.serviceAccountUser

這些都是之後操作會比較方便使用

(3) Artifact Registry 建立存放區

前往 Artifact Registry 創建空的儲存庫,區域都可以選,我是建議可以先用 asia-east1 選擇台灣區域,然後建立時的類別選擇 Docker

4. 在 gcloud shell 建立 docker 專案

在你的 GCP Console 中,從右上角點擊看起來很像 terminal 的 icon,開始使用 G shell,這裡你可以想成就是你的 GCP 帳號提供給你的個人 terminal 環境,當作自己 local 使用。

gshell

打開之後,可以先確認下是不是在你的專案,然後透過指令建立 docker 靜態資料夾,這裡可以參考 新手自建 Docker 伺服器 - (3) 建立應用,以靜態網頁為例 中的步驟二,基本上是一模一樣的。

GCP terminal 有個方便的功能是可以直接打開編輯器,因此也可以透過編輯器進行,操作起來會比較方便

gshell-editor

再來是要在同一個資料夾建立 Dockerfile,建立之後寫下以下內容

# Dockerfile
FROM nginx:alpine

# 刪除預設網頁
RUN rm -rf /usr/share/nginx/html/*

# 複製靜態網頁內容到 Nginx 網頁資料夾
COPY web/ /usr/share/nginx/html

# 修改 Nginx 設定讓他用 8080
RUN sed -i 's/80;/8080;/g' /etc/nginx/conf.d/default.conf

EXPOSE 8080

CMD ["nginx", "-g", "daemon off;"]

5. 建置並推送 Image

完成之後,在 Console 依序進行以下內容來推送 Image 到 Artifact Registry 上

# 打包 docker image
docker build -t web-nginx:latest .
# Image 打上 tag,這裡要注意要包含三個變數{{region}}、{{project_id}}、{{artifact 儲存庫名稱}}
docker tag web-nginx:latest {{region}}-docker.pkg.dev/{{project_id}}/{{repository_name}}/web-nginx:latest

# 推送到 Artifact Registry
docker push {{region}}-docker.pkg.dev/{{project_id}}/{{artifact 儲存庫名稱}}/web-nginx:latest

如果要簡化的話也可以直接用以下

gcloud builds submit --tag {{region}}-docker.pkg.dev/{{project_id}}/{{repository_name}}/web-nginx:latest .

這個的目的就是把 image 推到 Artifact Registry 上,這樣之後就可以在 Cloud Run 上跑了

6. 在 Cloud Run 建立服務與測試

最後啦!進入到 Cloud Run 的頁面,點擊建立容器,選擇 Artifact Registry 儲存庫的位置,並且選擇剛剛推上去的 Image,建立後會產出一個 Cloud run 的 url 類似 https://your-service-name-xxxxxxxxxx.region.run.app,接著就可以開始使用啦。

不過必須要說 Cloud run 還是相對貴,我跑一個靜態網頁一天可能就要 6-8 塊台幣,因此實際放網頁可能太貴了,未來或許可以試試看 API Server,應該是比較有機會減少使用費用,不過就當作是自己的第一個 Cloud Run 專案吧,順利跑起來還是滿有成就感的。

comments powered by Disqus