Google Cloud 使用 artifact registry 和 compute engine
on 2022-12-01
前言
基於公司之前的架構設計
使用 GCP 重現一個簡化版的部署架構
基本是使用 artifact registry 和 compute engine
GCP 官方也有 artifact registry + compute engine 的部署設計
但是因為是 side project, 不想搞得太複雜, 所以沒有採用官方的方式(官方的方式再搭配其他的服務比較建議用在正式專案上面, 會是比較有彈性且可以進行高承載的設計, 不過主要還是看預算和承載量的考量)
架構
side project 是一個單純的 web service
目前也不考慮高流量的問題
前後端分離, 主要會有前端的服務和 api 的服務
google cloud
- Compute Engine(1 instance)
- Cloud SQL(1 sql, 沒有開 HA, 需要注意的是有開 HA, sql 費用會是兩倍計算)
- Artifact Registry
code
- Vue(nuxt SSR)
- CodeIgniter 4(當作 API server)
因為會有前端和後端的部分, 會有兩個 service
- node
- PHP
所以最簡單的方式就是兩個分開開發
因為有使用 docker
所以就把分成兩個 docker image
要部署的程式和環境都包在 docker image 裡面
這樣在 VM 裡面不用考慮環境問題, 只要跑起來 docker container 就可以了
開發與部署
本地開發已經是使用 ARM 架構的 mac
所以需要注意的是 build image 時會因為不同的 CPU 架構需要 build 對應架構的 docker image
還有需要注意的是程式的套件對應開發環境的版本, 基本上除非要集小化 Image, 不然會建議 docker image 使用 Linux ubuntu 來當成 base
為了方便開發, 本地直接使用 mac 自己的環境開發
另一種做法就是本地就直接啟動使用 docker container 開發, 把要開發的程式 mount 進去
開發完後就是 build docker image
上面提到做法就是把要執行的程式和環境整個打包成 docker image
這樣部署時就不會受到部署環境影響
這邊採用的 docker image 管理服務就是 Artifact Registry
簡單的說就是一個私有的 docker hub
AWS 對應的服務是 Elastic Container Registry
這邊會著重在 Artifact Registry 的建立與部署
Artifact Registry
Artifact Registry provides a single location for storing and managing your packages and Docker container images.
從上述文件的介紹其實可以知道 Artifact Registry 不只有 docker image 的管理功能
其實還包含 Java, Node.js, Python, Debian, RPM 等等的套件管理
所以有開發以上的套件又需要有個私有的 repositories 也可以用這個服務
因為這服務的文件蠻多且有點複雜
這邊會稍微整理專注在使用 docker 相關的文件出來
- 建立 repositories
就和使用 docker hub 一樣必須要先建立 repositories 來擺放 image
可以直接參考以下文件
這邊建議直接在 google console 的 web 介面建立比較好操作
建立 repositories 後需要注意的是能夠操作這個 repositories 的帳號
專案擁有者一定是可以操作, 如果要要建立 CI/ÇD 的話建議另外建立 service account 來賦予相關權限
有其他開發者要共同操作的話, 就去 IAM 添加並賦予相關權限
- 開始進行 push & pull
要在本地端進行 Artifact Registry 的 docker push & pull 操作要先具備以下條件
- 要安裝 gcloud 並且登入
- 登入的帳號需要具備 Artifact Registry 權限
- 啟動 Artifact Registry API
- 設定 gcloud config Set defaults for gcloud commands
- docker 設定 repositories Changes for Docker
在 google 其他服務大多已經具備權限了(在正式專案上建議對沒有必要的權限做關閉)
來確認之後要部署時可不可以直接使用
安裝後登入自己的帳號或登入需要使用的 service account
其實上面講了那麼多
簡單列一下要執行的指令
gcloud auth login
gcloud services enable artifactregistry.googleapis.com
gcloud config set project <PROJECT ID>
gcloud config set artifacts/location <LOCATION>
gcloud config set artifacts/repository <REPOSITORY>
gcloud artifacts packages list --repository=<PROJECT ID>
gcloud config list
gcloud services enable artifactregistry.googleapis.com
gcloud auth configure-docker <LOCATION>-docker.pkg.dev
這樣之後就可以開始 pull & push 了
可以看到要拉取的 path 結構大致上如下
us-central1-docker.pkg.dev/my-project/team1/web-app:1.0
基本上結構就是
<LOCATION>-docker.pkg.dev/<PROJECT ID>/<REPOSITORY>/<IMAGE NAME>:<VERSION>
補充
有時為了指令的便利性可以利用以下設定來避免需要 sudo
Puppeteer 安裝在 ubuntu server 使用紀錄
on 2020-11-20
Puppeteer 是 Google 推出的基於 nodejs 的一套工具 可以控制 Chrome 和 Chromium 所以在爬蟲和測試等等需求都很好用
這裡記錄一下在 GCP 上面開一台 Computer Engine 後裝 Puppeteer 的紀錄
1. CE 開一個 instance
之前開 f1-mirco(1vCPU & 0.6G RAM)(共用核心)
這樣的等級如果只是 load 完頁面爬內容還是可以撐得住的
但是要做一些操作行為或是下滑垃取 AJAX 內容等等就不夠用了
所以就開了一台 e2-small (2vCPU & 2GB RAM)(非共用核心) 來跑
這次是裝 ubuntu 20.04 LTS
2. 安裝 node
先拉 node 套件庫下來
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
裝 nodejs
sudo apt install nodejs
Refer - How to Install Node.js and npm on Ubuntu 18.04
3. 裝要啟動 Puppeteer 和 chrome 等相關套件
sudo sudo apt update
sudo apt-get install ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils
通常裝完 Puppeteer 沒有啟動成功大多是有套件遺漏造成啟動不了 Chrome/Chromium
3. 裝 Puppeteer
npm i puppeteer
不要裝 puppeteer-core(因為這不包含 browser), 這個東西要裝請在自己的電腦裝來玩
4. 寫個 sample code 吧
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({
args: ["--no-sandbox"],
});
const page = await browser.newPage();
await page.goto("https://google.com");
await page.screenshot({ path: "example.png" });
await browser.close();
})();
記得加上 –no-sandbox 有時在 terminal 有問題是因為沒加這個參數(但這是個選項)
Troubleshooting
在 Puppeteer 有個整理出來的 Troubleshooting
如果有任何狀況都可以參考該頁面
Log
在使用時參考 launch
的 arg
使用以下的內容當參考
List of Chromium Command Line Switches
puppeteer 文件也是有許多 method 的使用方式