在已經有了透過自己 host 的機器跑 docker 服務之後,一直想試試看把某些服務移動到雲端 serverless 架構去使用,而雖然我已經有用了如 Cloudflarfe Page 這樣的靜態網頁,還是一直想試試看以及了解 GCP Cloud Run ,因此簡單花了時間研究。
先說一下結論
Cloud run 跑靜態網頁實在太貴了
後續應該可以試試看用來當 API Server
不過這篇文章還是有用途的,可以理解 如何初步在 Cloud Run 上建立服務
,並且主要分成以下章節:
- User Story
- 流程架構
- 前置作業 - 服務啟用與 Artifact Registry 建立
- 在 gcloud shell 建立 docker 專案
- Docker 打包上傳到 Artifact Registry
- 在 Cloud Run 建立服務與測試
本篇文章的前提作業是:
- 你有一個 GCP 專案
- 你有操作 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 使用。
打開之後,可以先確認下是不是在你的專案,然後透過指令建立 docker 靜態資料夾,這裡可以參考 新手自建 Docker 伺服器 - (3) 建立應用,以靜態網頁為例 中的步驟二,基本上是一模一樣的。
GCP terminal 有個方便的功能是可以直接打開編輯器,因此也可以透過編輯器進行,操作起來會比較方便
再來是要在同一個資料夾建立 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 專案吧,順利跑起來還是滿有成就感的。