[GCP] Google Cloud Storage API
- Google Cloud Storage: Node.js Client @ GoogleAPIs
- Google Cloud Storage @ Google Cloud
gcloud CLI
- gcloud storage @ API reference
- Discover object storage with the gcloud tool
$ 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
在這段指令中 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。
-
設定 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 ..." 這個是可以展開的
- 展開後這裡可以設定,但 Backend Bucket (GCS) 如果回傳
4xx
時,把 response code overwrite 成200
在回給前端,這樣就不會有 404 的問題
- 由於 Single Page Application 的 Routes 是前端路由,雖然透過 GCS 的 website configuration 設定,可以把所有請求都導到
-
修改後,即使沒有開 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
使用 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
:
Node.js Client
Google Cloud Snippets @ PJCHENder Github
檢視並篩選檔案
getFiles @ Google Cloud Snippets > PJCHENder Github
gsutil 工具
提醒:使用 gsutil 前需要先安裝 google cloud sdk 並進行 gCloud init
- 使用 gsutil 工具 @ Google Cloud Storage
- gsutil 工具 - API @ Google Cloud Storage
# 列出 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 的錯誤,因此需要使用單引號把路徑包起來。
檢視使用的容量
- 使用 Google Cloud Monitoring
- 使用 gsutil du 指令
# 檢視某一 bucket 使用的總容量
gsutil du -sh gs://pjchender_cloud_storage
檢查檔案數量
gsutil ls "gs://pjchender_cloud_storage" | grep -v "/$" | wc -l
價格
除了下述費用之外,還有其他額外的費用,需進一步檢視 Cloud Storage Pricing 的說明。
資 料儲存費用(Data Storage)
操作費用(Operation)
在 Cloud Storage Pricing 中清楚說明 Class A Operations, Class B Operations 分別指的是什麼,這些操作每個月都會提供免費的額度,超過的話則會收費。一般來說,「刪除」的動作是不用收費的;「下載(GET)」的動作比較便宜,屬於 Class B(每月免費 50,000 次);但是「新增」、「複製」、「更新」、「列出清單(list)」鑿是屬於 Class A(每月免費 5,000 次)。
中英對照
英文 | 中文 |
---|---|
bucket | 值區 |