Google cloud storage hướng dẫn

Google cloud storage hướng dẫn

Views: 118

Khi làm việc với các Cloud Provider, chúng ta cần tính toán đến các giải pháp để tiết kiệm chi phí, ít nhất là ở giai đoạn development. Vì đa số các service của các Cloud Provider mà chúng ta cần sử dụng, sẽ ít nhiều tốn tiền. Một giải pháp mà mình giới thiệu với các bạn trong bài viết này là về giả lập Google Cloud Storage sử dụng một open-source tên là fake-gcs-server, phù hợp cho những dự án nào có sử dụng Google Cloud Platform. Nó giúp chúng ta có thể start lên một standalone server có chức năng gần giống với Google Cloud Storage. Các bạn có thể sử dụng các thư viện của Google provide để làm việc với Google Cloud Storage, để làm việc với open-source này luôn.

Cài đặt fake-gcs-server

fake-gcs-server cung cấp cho chúng ta một Docker Image, giúp chúng ta có thể dễ dàng start nó lên chỉ với vài bước.

Cụ thể, các bạn cần chạy Docker command sau:

docker run-d--name fake-gcs-server-p4443:4443fsouza/fake-gcs-server

Lúc này, nếu các bạn request tới URL để lấy thông tin &lt;a href="https://cloud.google.com/storage/docs/json_api/v1/buckets/list" target="_blank" rel="noopener noreferrer"&gt;Buckets list&lt;/a&gt; với host port sử dụng fake server: https://localhost:4443/storage/v1/b, các bạn sẽ thấy kết quả như sau:&lt;/p&gt; &lt;p&gt;&lt;img class="aligncenter wp-image-17417 size-full" src="https://huongdanjava.com/wp-content/uploads/2021/07/gia-lap-google-cloud-storage-su-dung-fake-gcs-server-1.png" alt="Giả lập Google Cloud Storage sử dụng fake-gcs-server" width="700" height="324"&gt;&lt;/p&gt; &lt;p&gt;Items hiển thị empty vì chúng ta chưa có một bucket nào trong fake-gcs-server.&lt;/p&gt;&lt;span id="ezoic-pub-ad-placeholder-117" data-inserter-version="2"&gt;&lt;/span&gt;&lt;span class="ezoic-ad ezoic-at-0 medrectangle-4 medrectangle-4117 adtester-container adtester-container-117" data-ez-name="huongdanjava_com-medrectangle-4"&gt;&lt;span id="div-gpt-ad-huongdanjava_com-medrectangle-4-0" ezaw="300" ezah="250" style="position:relative;z-index:0;display:inline-block;padding:0;min-height:250px;min-width:300px" class="ezoic-ad"&gt;&lt;script data-ezscrex="false" data-cfasync="false" type="text/javascript" style="display:none"&gt;if(typeof ez_ad_units != 'undefined'){ez_ad_units.push([[300,250],'huongdanjava_com-medrectangle-4','ezslot_1',117,'0','0'])};if(typeof __ez_fad_position != 'undefined'){__ez_fad_position('div-gpt-ad-huongdanjava_com-medrectangle-4-0')}; </p><p>Các bạn có thể mount một số data có sẵn và chạy fake-gcs-server như sau:</p> <div id="crayon-6303245694fee824857445" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style="margin-top:12px;margin-bottom:12px;font-size:12px!important;line-height:15px!important"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size:12px!important;height:18px!important;line-height:18px!important"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size:12px!important;height:18px!important;line-height:18px!important"><div class="crayon-button crayon-nums-button" title="Toggle Line Numbers"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Java</span></div></div> <div class="crayon-info" style="min-height:18px!important;line-height:18px!important"></div> <div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4;-o-tab-size:4;-webkit-tab-size:4;tab-size:4;font-size:12px!important;line-height:15px!important">docker run -d --name fake-gcs-server -p 4443:4443 -v ${PWD}/examples/data:/data fsouza/fake-gcs-server</textarea></div> <div class="crayon-main"> <table class="crayon-table"> <tbody><tr class="crayon-row"> <td class="crayon-nums" data-settings="show"> <div class="crayon-nums-content" style="font-size:12px!important;line-height:15px!important"><div class="crayon-num" data-line="crayon-6303245694fee824857445-1">1</div></div> </td> <td class="crayon-code"><div class="crayon-pre" style="font-size:12px!important;line-height:15px!important;-moz-tab-size:4;-o-tab-size:4;-webkit-tab-size:4;tab-size:4"><div class="crayon-line" id="crayon-6303245694fee824857445-1"><span class="crayon-e">docker </span><span class="crayon-i">run</span><span class="crayon-h"> </span>-<span class="crayon-i">d</span><span class="crayon-h"> </span>--<span class="crayon-e">name </span><span class="crayon-i">fake</span>-<span class="crayon-i">gcs</span>-<span class="crayon-i">server</span><span class="crayon-h"> </span>-<span class="crayon-i">p</span><span class="crayon-h"> </span><span class="crayon-cn">4443</span><span class="crayon-sy">:</span><span class="crayon-cn">4443</span><span class="crayon-h"> </span>-<span class="crayon-e">v</span><span class="crayon-h"> </span><span class="crayon-sy">$</span><span class="crayon-sy">{</span><span class="crayon-i">PWD</span><span class="crayon-sy">}</span>/<span class="crayon-i">examples</span>/<span class="crayon-i">data</span><span class="crayon-sy">:</span>/<span class="crayon-e">data </span><span class="crayon-i">fsouza</span>/<span class="crayon-i">fake</span>-<span class="crayon-i">gcs</span>-<span class="crayon-i">server</span></div></div></td> </tr> </tbody></table> </div> </div> <p>${PWD} là thư mục hiện hành các bạn đang chạy lệnh Docker cộng với thư mục example/data, sẽ được map với thư mục /data bên trong container của fake-gcs-server. Các bạn có thể thay đổi ${PWD}/examples/data thành bất cứ thư mục nào mà các bạn muốn. Những thư mục trong thư mục ${PWD}/examples/data này sẽ là những bucket, và tất nhiên những tập tin nằm trong các bucket sẽ là những object của những bucket này.</p> <p>Ví dụ mình có tập tin test.txt nằm trong thư mục /Users/khanh/Document/data/sample-bucket, mình chạy câu lệnh start fake-gcs-server như sau:</p> <div id="crayon-6303245694ff0868104314" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style="margin-top:12px;margin-bottom:12px;font-size:12px!important;line-height:15px!important"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size:12px!important;height:18px!important;line-height:18px!important"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size:12px!important;height:18px!important;line-height:18px!important"><div class="crayon-button crayon-nums-button" title="Toggle Line Numbers"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Java</span></div></div> <div class="crayon-info" style="min-height:18px!important;line-height:18px!important"></div> <div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4;-o-tab-size:4;-webkit-tab-size:4;tab-size:4;font-size:12px!important;line-height:15px!important">docker run -d --name fake-gcs-server -p 4443:4443 -v /Users/khanh/Documents/data:/data fsouza/fake-gcs-server</textarea></div> <div class="crayon-main"> <table class="crayon-table"> <tbody><tr class="crayon-row"> <td class="crayon-nums" data-settings="show"> <div class="crayon-nums-content" style="font-size:12px!important;line-height:15px!important"><div class="crayon-num" data-line="crayon-6303245694ff0868104314-1">1</div></div> </td> <td class="crayon-code"><div class="crayon-pre" style="font-size:12px!important;line-height:15px!important;-moz-tab-size:4;-o-tab-size:4;-webkit-tab-size:4;tab-size:4"><div class="crayon-line" id="crayon-6303245694ff0868104314-1"><span class="crayon-e">docker </span><span class="crayon-i">run</span><span class="crayon-h"> </span>-<span class="crayon-i">d</span><span class="crayon-h"> </span>--<span class="crayon-e">name </span><span class="crayon-i">fake</span>-<span class="crayon-i">gcs</span>-<span class="crayon-i">server</span><span class="crayon-h"> </span>-<span class="crayon-i">p</span><span class="crayon-h"> </span><span class="crayon-cn">4443</span><span class="crayon-sy">:</span><span class="crayon-cn">4443</span><span class="crayon-h"> </span>-<span class="crayon-i">v</span><span class="crayon-h"> </span>/<span class="crayon-i">Users</span>/<span class="crayon-i">khanh</span>/<span class="crayon-i">Documents</span>/<span class="crayon-i">data</span><span class="crayon-sy">:</span>/<span class="crayon-e">data </span><span class="crayon-i">fsouza</span>/<span class="crayon-i">fake</span>-<span class="crayon-i">gcs</span>-<span class="crayon-i">server</span></div></div></td> </tr> </tbody></table> </div> </div> <p>thì lúc này sample-bucket sẽ là một bucket trong fake-gcs-server, và tập tin test.txt sẽ là một object trong bucket này.</p><span id="ezoic-pub-ad-placeholder-118" data-inserter-version="2"></span><span class="ezoic-ad ezoic-at-0 box-4 box-4118 adtester-container adtester-container-118" data-ez-name="huongdanjava_com-box-4"><span id="div-gpt-ad-huongdanjava_com-box-4-0" ezaw="728" ezah="90" style="position:relative;z-index:0;display:inline-block;padding:0;width:100%;max-width:1200px;margin-left:auto !important;margin-right:auto!important;min-height:90px;min-width:728px" class="ezoic-ad"><script data-ezscrex="false" data-cfasync="false" type="text/javascript" style="display:none">if(typeof ez_ad_units != 'undefined'){ez_ad_units.push([[728,90],'huongdanjava_com-box-4','ezslot_2',118,'0','0'])};if(typeof __ez_fad_position != 'undefined'){__ez_fad_position('div-gpt-ad-huongdanjava_com-box-4-0')};

Request lại URL https://localhost:4443/storage/v1/b, các bạn sẽ thấy kết quả như sau:

Google cloud storage hướng dẫn

Lấy thông tin tất cả các object của bucket với URL https://localhost:4443/storage/v1/b/sample-bucket/o, các bạn sẽ thấy kết quả như sau:

Google cloud storage hướng dẫn

Các bạn có thêm tuỳ ý bao nhiêu bucket cũng được, bao nhiêu object cũng được.

Mặc định thì fake-gcs-server sử dụng HTTPS, các bạn có thể sử dụng HTTP bằng cách thêm vào command start nó tham số scheme như sau:

docker run-d--name fake-gcs-server-p4443:4443-v/Users/khanh/Documents/data:/data fsouza/fake-gcs-server -scheme http

Lúc này chúng ta có thể sử dụng fake-gcs-server với HTTP:

Google cloud storage hướng dẫn

Sử dụng Spring Cloud GCP Storage để access vào bucket của fake-gcs-server

Để access vào các bucket trên Google Cloud Storage, các bạn có thể sử dụng thư viện spring-cloud-gcp-storage. Chúng ta cũng có thể sử dụng thư viện này với fake-gcs-server.

Một điều các bạn cần lưu ý là chúng ta không cần sử dụng credentials để access vào các bucket của fake-gcs-server.

Mình sẽ tạo một Maven project đơn giản, khai báo sử dụng spring-cloud-gcp-storage để access vào fake-gcs-server mà mình đã start ở trên, như sau:

Google cloud storage hướng dẫn

với:

<dependency>

    <groupId>com.google.cloud</groupId>

    <artifactId>spring-cloud-gcp-storage</artifactId>

    <version>2.0.3</version>

</dependency>

Mình sẽ tạo mới một class main, sử dụng API của spring-cloud-gcp-storage để access vào bucket sample-bucket như sau:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

packagecom.huongdanjava.springcloudgcs;

importcom.google.cloud.storage.Blob;

import com.google.cloud.storage.BlobId;

importcom.google.cloud.storage.Storage;

import com.google.cloud.storage.StorageOptions;

publicclassApplication{

    publicstaticvoid main(String[]args){

        Storage storage=getStorage();

        Blob blob= storage.get(BlobId.of("sample-bucket","test.txt"));

        System.out.println(blob.getGeneratedId());

    }

    privatestaticStorage getStorage(){

        // @formatter:off

        StorageOptions storageOptions =StorageOptions.newBuilder()

            .setHost("http://localhost:4443")

            .build();

        // @formatter:on

        returnstorageOptions.getService();

    }

}

Ở đây, mình không sử dụng credentials để access vào bucket của fake-gcs-server. Các bạn có thể thao tác trên bucket của fake-gcs-server tương tự như trên Google Cloud Storage sử dụng thư viện này.

Kết quả khi chạy ví dụ này như sau:

Google cloud storage hướng dẫn

Google cloud storage hướng dẫn