跳至主要内容

[GCP] Google Cloud Storage API

gcloud CLI

$ gcloud storage --help
$ gcloud storage buckets --help

# List
$ gcloud storage ls gs://my-awesome-bucket # List contents of a bucket or folder
$ gcloud storage ls gs://my-awesome-bucket/kitten.png --long # List details for an object
$ gcloud storage ls gs://my-awesome-bucket/index.html --log-http --verbosity=debug

# Upload
$ gcloud storage cp Desktop/kitten.png gs://my-awesome-bucket
$ gcloud storage cp -R ./dist/* gs://my-awesome-bucket # upload a folder (--recursive, -R)
$ gcloud storage cp *.txt gs://my-bucket # uploads all text files

# Download
$ gcloud storage cp gs://my-awesome-bucket/kitten.png Desktop/kitten2.png

# Copy
$ gcloud storage cp gs://my-awesome-bucket/kitten.png gs://my-awesome-bucket/just-a-folder/kitten3.png

# Delete
$ gcloud storage rm gs://my-awesome-bucket/kitten.png # delete a object
$ gcloud storage rm gs://my-awesome-bucket --recursive # remove all object in a bucket

# Permission
$ gcloud storage buckets add-iam-policy-binding gs://my-awesome-bucket --member=allUsers --role=roles/storage.objectViewer # Make the objects publicly accessible
$ gcloud storage buckets remove-iam-policy-binding gs://my-awesome-bucket --member=allUsers --role=roles/storage.objectViewer # Remove publicly accessible
$ gcloud storage buckets add-iam-policy-binding gs://my-awesome-bucket --member=user:jane@gmail.com --role=roles/storage.objectCreator # Give someone access permission
$ gcloud storage buckets remove-iam-policy-binding gs://my-awesome-bucket --member=user:jane@gmail.com --role=roles/storage.objectCreator # Remove someone's access permission
upload 時路徑的寫法

在這段指令中 gcloud storage cp -R ./dist/* gs://my-awesome-bucket,如果是寫 ./dist/* 則會把 dist folder 中的檔案上傳到 bucket 中,但如果是寫 ./dist/.,這會在 bucket 中建立 dist folder,並把檔案放在 dist folder 內。

Host a Static Website

keywords: Frontend Router, SPA, Single Page Application

可以跟著這篇 Host a static website 文件,主要的步驟包含:

  • 建立 Bucket

  • 上傳 static website 到 Google Cloud Storage

  • 在 Network Services 裡的 Load balancing 設定 Load Balancer,和對應的 SSL certificate

    • 第一頁 Create Load Balancer 基本上都用 Default 設定即可

    • Frontend Configuration

      • Protocol 的地方選 HTTPS
      • 在 IP Address 的部分,可以選擇「CREATE IP ADDRESS」
      • 在 Certificate 的地方「Create a New Certificate」
        • 在 Security 的 Certificate Manager 中「Classic Certificates」可以看到所有的 Certificates
    • Backend Configuration

      • 選擇對應的 Cloud Storage bucket
      • (Optional)如果需要透過 Cloud Armor 限制可以存取的 IP,要在 Backend Bucket 的 Cloud Armor edge security policy 中,選擇對應的 policy。

      image-20240729171606277

    • 設定 Routing Rules(官方文件中沒有說明到這一步)

      • 由於 Single Page Application 的 Routes 是前端路由,雖然透過 GCS 的 website configuration 設定,可以把所有請求都導到 index.html,但預設 HTTP status code 還是會回傳 404(可以拿到 index.html,只是 response code 有錯),這並不是我們期望的。要解決這個問題可以用 load balancer 中 Routing rules 的設定
      • 選擇 Advanced host and path rule,然後它訂 "(Default) Route ..." 這個是可以展開的 image-20240814233001175
      • 展開後這裡可以設定,但 Backend Bucket (GCS) 如果回傳 4xx 時,把 response code overwrite 成 200 在回給前端,這樣就不會有 404 的問題

      image-20240814233441317

修改後沒作用

修改後,即使沒有開 Cloud CDN,但同樣的網址(路徑)有時候還是會看到原本的 response code(不知道為什麼),比較好的測試方式是去沒有踩過的網址,看看 response code 有沒有更新。或者可以試著執行 gcloud compute url-maps invalidate-cdn-cache [url-map] --path="/*" 把 CDN Cache 清掉看看。

  • 在 Network Services 裡的 Cloud DNS 設定 DNS 的 A Record 或 CNAME

    image-20240729171727225

使用 gcloud CLI

gcloud storage ls gs://BUCKET_NAME/OBJECT_NAME --log-http --verbosity=debug
gcloud storage rm gs://BUCKET_NAME/OBJECT_NAME # delete objects

點擊某個 object(檔案)後,可以看到它的 gsutil URI

image-20240416104851907

Node.js Client

Google Cloud Snippets @ PJCHENder Github

檢視並篩選檔案

getFiles @ Google Cloud Snippets > PJCHENder Github

gsutil 工具

注意

提醒:使用 gsutil 前需要先安裝 google cloud sdk 並進行 gCloud init

# 列出 bucket 內的資料
$ gsutil ls gs://bucket
$ gsutil ls gs://pjchender_cloud_storage/2020

上傳物件(檔案)

cp @ gsutil

# 上傳單一檔案
# -n: No-clobber,檔案存在時不會覆蓋重傳
# -r: 複製該資料夾內的資料夾
$ gsutil cp [LOCAL_OBJECT_LOCATION] gs://[DESTINATION_BUCKET_NAME]/

# 上傳整個資料夾內的檔案(有時候會掉檔案)
$ gsutil -m cp -r -n [LOCAL_DIR] gs://pjchender_cloud_storage/

# 進到該資料夾後輸入(比較保險)
$ gsutil -m cp -r -n . gs://pjchender_cloud_storage/foobar/ # 記得要先在 GCP 上建立資料夾

移動物件(檔案)/修改檔名

mv @ gsutil

# -p: preserve ACLs
# -m: multi-threaded/multi-processing

# 將某一資料夾搬移到某一資料夾內
$ gsutil -m mv gs://my_bucket/old_prefix gs://my_bucket/new_prefix

$ gsutil -m mv gs://pjchender_cloud_storage/foobar gs://pjchender_cloud_storage/2014

下載物件(檔案)

# 下載單一檔案
$ gsutil cp gs://pjchender_cloud_storage/[OBJECT_NAME] [OBJECT_DESTINATION]

# 下載整個資料夾中的所有物件(檔案)
$ gsutil -m cp -r gs://pjchender_cloud_storage/foo [LOCAL_DIR]

# 下載所有某類型的檔案
$ gsutil cp 'gs://my-bucket/*.txt' .
注意

提醒:當使用 wildcard(*)時,zsh 會先進行處理,導致出現 Not Found 的錯誤,因此需要使用單引號把路徑包起來

檢視使用的容量

# 檢視某一 bucket 使用的總容量
gsutil du -sh gs://pjchender_cloud_storage

檢查檔案數量

gsutil ls "gs://pjchender_cloud_storage" | grep -v "/$" | wc -l

價格

Cloud Storage Pricing

除了下述費用之外,還有其他額外的費用,需進一步檢視 Cloud Storage Pricing 的說明。

資料儲存費用(Data Storage)

Imgur

操作費用(Operation)

Cloud Storage Pricing 中清楚說明 Class A Operations, Class B Operations 分別指的是什麼,這些操作每個月都會提供免費的額度,超過的話則會收費。一般來說,「刪除」的動作是不用收費的;「下載(GET)」的動作比較便宜,屬於 Class B(每月免費 50,000 次);但是「新增」、「複製」、「更新」、「列出清單(list)」鑿是屬於 Class A(每月免費 5,000 次)。

Imgur

Imgur

中英對照

英文中文
bucket值區

Q & A