# Cloud Storage簡介

Cloud Storage (GCS) 為Google新一代Object Storage，以Google Datacenter的規模，提供GCP的開發者使用。是為具備高性能、全球網際網路存取規模之固定的BLOB（Binary Large Object）儲存裝置... GCS並非檔案系統（可從 Cloud Storage Fuse 之類的第三方工具，以類似檔案系統的方式進行存取），提供使用者以Google Web Console介面或是SDK以及RESTful API的方式存取。

GCS提供簡單的管理作業介面，提供使用者無需花費心力去管理容量，且資料無論是在使用中或閒置中一律維持加密的狀態等優點，讓GCS資料存放具備高可用性與高安全性等特色。

## Cloud Storage的Class種類

依據不同使用者的需求，GCS提供四種不同類別(Class)的儲存方案，主要差異在儲存的複製份數與區域，以及價格上的差異。

* Multi Region: 為具有地理性備援能力的儲存裝置層級，可用性與效能為最高等級。適合為跨區域的使用者提供低延遲、高QPS的服務。
* Regional: 在指定的一個區域內的可用性與效能為最高等級。適用於特定區域中的運算、分析、機器學習等工作負載。
* Nearline: 適用於資料的存取頻率為 1 個月不到 1 次的用途，為高速、低成本、高耐用性的儲存裝置。
* Codeline: 適用於資料的存取頻率為 1 年不到 1 次的用途，為高速、低成本、高耐用性的儲存裝置。

關於儲存服務的價格，可以參考：<https://cloud.google.com/storage/pricing>

## Cloud Storage的各項功能

Cloud Storage本身以分散式儲存的方式將上傳的物件進行切割(sharding)與複製(replicate)，然後儲存到多個儲存體，在Google安全性保護下，儲存的檔案本身在傳輸過程會有SSL加密與Oauth2的認證保護，資料進入Google資料中心後，儲存到磁碟也會有AES的加密保護，讓資料的傳輸、儲存都更有保障。除此之外，GCS也提供許多其他的加值功能...

### 用戶端工具 - gsutil

GCS提供用戶端工具gsutl，預設提供於gcloud工具安裝後即可執行... gsutil使用方式與linux指令類似，下面為幾個常用的gsutil指令...

* 建立bucket:

  ```
  gsutil mb gs://simon-gcp-bucket
  ```
* 複製檔案到bucket

  ```
  gsutl cp /path/to/myfile gs://simon-gcp-bucket
  ```
* 複製檔案到local

  ```
  gsutil cp gs://simon-gcp-bucket/objectname .
  ```
* 刪除GCS檔案

  ```
  gsutil rm gs://simon-gcp-bucket/objectname
  ```
* 更多gsutil用法，可以參考：<https://cloud.google.com/storage/docs/gsutil/commands/acl>

### 針對物件與Bucket可以設定專屬的ACL

針對每個Bucket與物件均可以設定所屬的ACL(Access Control List)，設定同意哪些對象可以讀寫、唯獨或分享您的資源。權限的授權可以是Google Account, Gsuite Account, Gsuite Domain, Google Group與Service Account等。

簡單的授權動作可以在Web Console上操作，也可以透過gsutil指令來執行...

Dump某個bucket內某個物件的ACL到acl.txt檔案：

```
gsutil acl get gs://bucket/file.txt > acl.txt
```

將設定好的權限檔案設定到某個bucket內的某個文件:

```
gsutil acl set acl.txt gs://cats/file.txt
```

### Regional儲存

GCS提供建立Bucket的時候，指定Bucket所屬的Region或Zone，透過這些指定，可以讓您的資料鎖定在所指定的地區，以符合一些特定服務的規範。如果需要進一步管理資料所在地區，可以透過限定地區的方式提供資料儲存的Bucket。反之，如果希望資料以多Region的方式備份，則可以選用Multi Region的方案，讓GCS Bucket預設以跨Region的高可用性提供服務。

### 物件生命週期 / Object Lifecycle

GCS提供Bucket階段設定物件生命週期，讓物件可以透過設定生命週期參數後，在指定的時間到達時進行指定的動作(目前物件動作可以為刪除或是更換物件的Class)。

例如：以下acl.json檔案指定對象在365天之後，進行刪除動作。

```
# cat acl.json
{
  "rule":
  [
    {
      "action": {"type": "Delete"},
      "condition": {"age": 365}
    }
  ]
}
```

將這個設定檔，使用lifecycle的指令設定到指定的Bucket中

```
$ gsutil lifecycle set acl.json gs://simon-gcp-bucket/
```

設定無誤後，可以透過lifecycle get的方式查詢。

```
$ gsutil lifecycle get gs://simon-gcp-bucket/
{"rule": [{"action": {"type": "Delete"}, "condition": {"age": 365}}]}
```

更進一步資訊可參考：<https://cloud.google.com/storage/docs/lifecycle>

### 物件版本功能 / Object Versioning

GCS提供一般的物件存放之外，也提供物件以附加版本號碼的方式存放，讓相同名稱的物件可以在存放在相同的Bucket中，需要時候，可以附加版號來取用該版本的物件內容。

首先啟用Bucket的版本功能...

```
$ gsutil versioning set on gs://simon-gcp-bucket
Enabling versioning for gs://simon-gcp-bucket/...
```

然後模擬使用不同的內容但相同檔案名稱去存放到GCS上...

```
$ echo 123 > abc

$ gsutil cp abc gs://simon-gcp-bucket
Copying file://abc [Content-Type=application/octet-stream]...
/ [1 files][    4.0 B/    4.0 B]
Operation completed over 1 objects/4.0 B.

$ echo 1234 > abc

$ gsutil cp abc gs://simon-gcp-bucket
Copying file://abc [Content-Type=application/octet-stream]...
/ [1 files][    5.0 B/    5.0 B]
Operation completed over 1 objects/5.0 B.
```

關於存放檔案的版本內容部分，我們可以使用gsutil ls -a來檢視物件的版號

```
$ gsutil ls -la gs://simon-gcp-bucket/abc
         4  2017-04-15T08:14:34Z  gs://simon-gcp-bucket/abc#1492244074445634  metageneration=1
         6  2017-04-15T08:22:07Z  gs://simon-gcp-bucket/abc#1492244527566595  metageneration=1
         7  2017-04-15T08:23:24Z  gs://simon-gcp-bucket/abc#1492244604563551  metageneration=1
TOTAL: 3 objects, 17 bytes (17 B)
```

然後透過gsutil cat加上物件版號，即可取到該版本的內容...

```
$ gsutil cat gs://simon-gcp-bucket/abc#1492244527566595
12345
```

### Transfer Service / Online Import

Google提供想要將資料上傳到GCS的用戶，可以透過Transfer Service，也就是Online Import的方式來傳輸檔案，您可以至Web Console的Storage頁面，透過Wizard的設定來將檔案傳輸到GCS上。

![](/files/-LAi7-MvIeUmQl084Y8z)

目前Transfer Service支援：

* Google Cloud Storage bucket
* AWS S3 bucket
* Object URLs

想要更了解Transfer Service，可以參考：<https://cloud.google.com/storage/transfer/create-manage-transfer-console>

### Offline Import

除了Online Import的方式外，Google也提供需要在第一時間上傳大量資料的用戶，直接將硬碟打包後郵寄至Google指定的服務提供商，然後由Google協助將資料上傳的方式。Offline Import適合有需要將大量資料上傳到Google的用戶，且上傳的頻寬不足或考慮上傳時間過久的用戶。

### Object Change Notification

為了提供開發者可以監控Bucket中物件的動態，GCS提供Object Change Notification來觸動使用者設定的Webhook，讓Bucket中有任何物件上傳或異動都可以直接反映到用戶的系統。類似的功能可以應用在終端用戶上傳照片檔案後，系統需要抓取檔案來進行格式的特別轉檔或設定的情境，使用者只要準備好Webhook接收GCS的資訊，然後針對上傳的檔案來進行操作。

### Website Bucket

GCS的另一項好用的功能 - Website Bucket，是可以透過GCS的儲存能力來作為使用者存放靜態網頁檔案的地方，然後透過DNS CNAME的對應後，即可將GCS當作靜態網頁伺服器使用。Website Bucket的提供可以免除使用者想要提供像官方網站或是產品網站的靜態網頁，卻又希望可以不用架設Web Server的用戶，也可以順便省下主機的成本。

想更近一步了解Website Bucket的建置，可以參考下面章節：[設定Website Bucket](https://github.com/gcpug-tw/google-cloud-platform-in-practice/tree/fb75f8263141bcca574cb9c93ba57cd623b0f7eb/cloud_storage/website-bucket.md)

### Load Balancer & CDN Bucket

除了使用Website Bucket來當作靜態網頁使用之外，GCS也提供使用Load Balancer的掛載方式，讓GCS作為Load Balancer的Backend，並掛載Frontend IP來轉導使用者的需求到背後的Backend Bucket。透過Load Balancer掛載GCS Bucket的另一個好處，是可以透過Load Balancer的CDN功能提供Bucket內物件在存取的過程當中可以透過CDN來進行Cache，讓存取可以透過CDN更加快速。

想更進一步了解Load Balancer與CDN Bucket，可以參考下面章節：[透過HTTP(S) Load Balancer幫GCS加上CDN](https://github.com/gcpug-tw/google-cloud-platform-in-practice/tree/fb75f8263141bcca574cb9c93ba57cd623b0f7eb/cloud_storage/http-load-balancergcscdn.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gdgcloud-taipei.gitbook.io/google-cloud-platform-in-practice/google-cloud-shang-de-chu-cun-fu-wu/cloud-storage/cloud-storage-jian-jie.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
