category: gcp

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

  1. node
  2. 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 相關的文件出來

  1. 建立 repositories

就和使用 docker hub 一樣必須要先建立 repositories 來擺放 image

可以直接參考以下文件

Create repositories

這邊建議直接在 google console 的 web 介面建立比較好操作

建立 repositories 後需要注意的是能夠操作這個 repositories 的帳號

專案擁有者一定是可以操作, 如果要要建立 CI/ÇD 的話建議另外建立 service account 來賦予相關權限

有其他開發者要共同操作的話, 就去 IAM 添加並賦予相關權限

  1. 開始進行 push & pull

要在本地端進行 Artifact Registry 的 docker push & pull 操作要先具備以下條件

在 google 其他服務大多已經具備權限了(在正式專案上建議對沒有必要的權限做關閉)

可以參考 Deploy to Google Cloud

來確認之後要部署時可不可以直接使用

Install the Google Cloud CLI

安裝後登入自己的帳號或登入需要使用的 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

Manage Docker as a non-root user

Read more

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

refer - Troubleshooting

通常裝完 Puppeteer 沒有啟動成功大多是有套件遺漏造成啟動不了 Chrome/Chromium

3. 裝 Puppeteer

npm i puppeteer

不要裝 puppeteer-core(因為這不包含 browser), 這個東西要裝請在自己的電腦裝來玩

Github - puppeteer

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

如果有任何狀況都可以參考該頁面

troubleshooting

Log

在使用時參考 launcharg

使用以下的內容當參考

List of Chromium Command Line Switches

puppeteer 文件也是有許多 method 的使用方式

https://pptr.dev/

Read more