顯示廣告
隱藏 ✕
看板 KnucklesNote
作者 Knuckles (站長 那克斯)
標題 [Linode] Object Storage 相容 S3 的檔案儲存空間
時間 2024-01-09 Tue. 03:22:30


Object Storage 是 Linode 提供的檔案儲存空間服務,
與 Amazon S3 (Simple Storage Service) 相容,
可以用來上傳大量靜態檔案讓人連結。

[圖]
 

登入 Linode 控制台,點「Create Bucket」,建立一個 Bucket 後,
就會啟用 Object Storage,只要啟動後,每月就要基本費用 $5 美金,
如果要停用的話,要在 Account / Settings 裡點「Cancel Object Storage」

每月 $5 美金就可以有 250G 的空間,超過 250G 的話 $0.02/GB,
傳入的流量不計費,傳出的流量與帳號的總流量限制共用,
啟用 Object Storage 時會在帳號的總流量限制加上 1TB。


# 建立 Bucket

建立一個 Bucket,取一個名稱並選擇區域,此名稱會用做網址所以不能與同區域的其他人重覆,
例如下圖建立的 Bucket 網址為 disp.jp-osa-1.linodeobjects.com
[圖]
 
[圖]
 

點進建立的 Bucket 後,可在這邊建立資料夾與上傳檔案
[圖]
 

點擊檔案會顯示可供連結的網址,把權限改成「Public Read」可以供所有人讀取
[圖]
 

在這邊建立一組 Access Key 和 Secret,用來供其他程式存取選擇的 Bucket
[圖]
 
[圖]
 


# 使用 Cyberduck

參考: https://www.linode.com/docs/products/storage/object-storage/guides/cyberduck/

官網下載: https://cyberduck.io/download/
下載安裝 Cyberduck for Windows 8.7.1

在「編輯」/「偏好設定」,點「Profiles」,搜尋「Linode」
勾選要使用的 Data Center,例如 Linode Object Storage (Osaka, JP)
[圖]
 

點「新增連線」,設定檔選「Linode Object Storage (Osaka, JP)」
輸入 Access key 與 Secret 後按「連線」
[圖]
 
[圖]
 

選取檔案後點「簡介」,可以取得網址
[圖]
 


# 自訂連結網址

參考
https://www.linode.com/docs/products/storage/object-storage/guides/custom-domain/

要使用自訂連結的話,Bucket Label 要使用自訂連結的網址,才能使用 SSL 憑證
例如想要用 https://s3.disp.cc/test/knuckles.png 這樣的網址來讀取檔案的話,Bucket Lable 要設定為「s3.disp.cc」,但要注意這樣 s3.disp.cc.jp-osa-1.linodeobjects.com 的網址就不能使用 https 連線。

修改 DNS 設定,加上 CNAME 記錄,例如使用 Linode Domains 的話,「Hostname」輸入「s3」,「Alias to」輸入「s3.disp.cc.jp-osa-1.linodeobjects.com」
[圖]
 

等待 DNS 更新後,就可以用非加密的 http://s3.disp.cc/test/knuckles.png 讀取檔案了

如果要使用 https 加密連線的話,要申請 SSL 憑證,例如使用 certbot 申請 Let's Encrypt 憑證,執行
$ sudo certbot certonly --manual
依顯示的步驟手動完成 HTTP-01 Challenge,要自己將驗證檔上傳到 Bucket,讓 Let's Encrypt 主機驗證所有權,然後將產生的憑證貼在 Bucket 的「SSL/TLS」
「Certificate」輸入 /etc/letsencrypt/live/s3.disp.cc/fullchain.pem 的內容
「Private Key」輸入 /etc/letsencrypt/live/s3.disp.cc/privkey.pem 的內容
[圖]
 
但這樣之後不能自動更新憑證


# 自動更新憑證

參考這篇 [Linode] NodeBalancer 使用 Let's Encrypt SSL憑證 - KnucklesNote板 - Disp BBS
使用 DNS-01 Challenge 申請 *.disp.cc 萬用字元憑證(Wildcard Certificate)

在 Linode 產生一個 API Token,Label 取個名稱,Expiry 選 Never,點一下 Select All 的 None,然後點 Account 的 Read Only,點 Object Storage 的 Read/Write,其他權限視需要再增加
[圖]
 

複製 Personal Access Token
[圖]
 

使用 pip3 安裝 linode-cli
$ sudo yum install python3 python3-pip
$ sudo pip3 install linode-cli --upgrade
$ sudo ln -s /usr/local/bin/linode-cli /usr/bin/linode-cli

設定 linode-cli
$ linode-cli configure
依提示輸入剛剛產生的 Personal Access Token
已輸入過的話也可以編輯 ~/.config/linode-cli 檔就好

將萬用字元憑證使用 linode-cli 上傳至 Object Storage
$ sudo vim /root/update_linode.sh
#!/bin/bash

region=jp-osa-1
# 輸入每個要更新憑證的 bucket,以空格分隔
Buckets="s3.disp.cc img.disp.cc"
cert=$(</etc/letsencrypt/live/disp.cc/fullchain.pem)
key=$(</etc/letsencrypt/live/disp.cc/privkey.pem)

for bucket in ${Buckets}; do
    linode-cli object-storage ssl-delete $region $bucket
    linode-cli object-storage ssl-upload $region $bucket \
      --certificate "$cert" --private_key "$key"
done

設定 crontab 定期更新,例如每週5的3:45執行一次
$ vim /etc/crontab
45 3 * * 5   root /root/update_linode.sh

參考
https://www.linode.com/docs/products/tools/cli/guides/object-storage/
https://www.linode.com/docs/api/object-storage/#object-storage-tlsssl-cert-upload

錯誤解決記錄:
新增 SSL/TLS 的時候出現
Certificate is not valid for the bucket name. Verify the bucket name is covered by the SANs and/or CN.
→ Bucket Label 要與 SSL 憑證的網址相同才行


# 使用 Linode CLI 存取檔案

Linode CLI 只有一些簡單的操作,可以使用下一節的 s3cmd 就好

依前一節的說明用 pip3 安裝 linode-cli

安裝 boto 函式庫,就可以使用 obj 擴充功能
$ sudo pip3 install boto boto3

執行看看
$ linode-cli obj
第一次執行會詢問預設的區域,選 jp-osa-1

obj 可用的指令:
mb
	
建立一個新的 bucket
rb
	
刪除一個 bucket
du
	
顯示每個 bucket 占用的空間與檔案數,以及總占用的空間
la
	
列出所有 buckets 上的所有檔案
ls
	
列出 buckets 或 bucket 上的檔案
put
	
上傳一個檔案到 bucket
get
	
下載一個 bucket 上的檔案
del
	
刪除 bucket 上的一個檔案
rm
	
刪除 bucket 上的一個檔案
setacl
	
設定檔案的存取限制

指令加 - h 可顯示說明,例如顯示 ls 的說明
$ linode-cli obj ls -h

列出目前已建立的 buckets
$ linode-cli obj ls

列出 my-bucket 的 test 資料夾中的檔案
$ linode-cli obj ls my-bucket/test/

上傳檔案 test.txt 到 my-bucket 的 test 資料夾
$ linode-cli obj put --acl-public test.txt my-bucket/test/
加上 --acl-public 代表設定為任何人都可以讀取

下載 my-bucket 上的檔案 test/test.txt
$ linode-cli obj test my-bucket test/test.txt

刪除 my-bucket 上的檔案 test/test.txt
$ linode-cli obj rm my-bucket test/test.txt

參考
https://www.linode.com/docs/products/storage/object-storage/guides/linode-cli/


# 使用 s3cmd 存取檔案

s3cmd 是 Amazon S3 用來操作檔案存取的工具,與 S3 相容的服務也可以使用,比 Linode CLI 有更多的功能可以使用。

使用 python 安裝 s3cmd
$ sudo pip3 install s3cmd
$ sudo ln -s /usr/local/bin/s3cmd /usr/bin/s3cmd

輸入 s3cmd 設定值
$ s3cmd --configure

Access Key: 輸入之前產生的 Access Key
Secret Key: 輸入之前產生的 Secret
Default Region: US 使用預設值就好,不要更改
S3 Endpoint (cluster URL): 輸入 jp-osa-1.linodeobjects.com
DNS-style bucket+hostname: 輸入 %(bucket)s.jp-osa-1.linodeobjects.com
Encryption password: 不用填
Path to GPG program: 不用填
Use HTTPS protocol: Yes
HTTP Proxy server name: 不用填
HTTP Proxy server port: 不用填
Test access: 目前使用測試會失敗,先按 n 跳過
Save settings? 按 y 儲存設定

設定值會儲存在 ~/.s3cfg

列出、建立、刪除 Bucket
$ s3cmd ls
$ s3cmd mb s3://my-bucket
$ s3cmd rb s3://my-bucket

如果 bucket 中有檔案的話,加上 -r (--recursive) 與 -f (--force) 可強制刪除
$ s3cmd rb -r -f s3://my-bucket

列出 my-bucket 中 test 資料夾的檔案
$ s3cmd ls s3://my-bucket/test/

上傳檔案 test.txt 到 my-bucket 的 test 資料夾
$ s3cmd put -P test.txt s3://my-bucket/test/
加上 -P (--acl-public) 代表設定檔案權限為公開

下載、刪除 my-bucket 上的檔案 test/test.txt
$ s3cmd get s3://my-bucket/test/test.txt
$ s3cmd rm s3://my-bucket/test/test.txt

刪除 my-bucket 上的 test/ 資料夾與裡面的所有檔案
$ s3cmd rm -r s3://my-bucket/test/
加 -r (--recursive) 代表資料夾中的所有檔案

複製、移動 my-bucket 的 test/test.txt 到 my-bucket2 的 test2/
$ s3cmd cp s3://my-bucket/test/test.txt s3://my-bucket2/test2/
$ s3cmd mv s3://my-bucket/test/test.txt s3://my-bucket2/test2/

設定 my-bucket 的 test/ 資料夾中的檔案權限為公開
$ s3cmd setacl -P -r s3://my-bucket/test/

同步資料夾 test/ 中的檔案到 my-bucket 的 test/ 資料夾
$ s3cmd sync -P test/ s3://my-bucket/test/
或是
$ s3cmd sync -P test s3://my-bucket/
使用 sync 只會上傳有更新或新增的檔案
加 -P (--acl-public) 代表設定權限為公開

參考
https://www.linode.com/docs/products/storage/object-storage/guides/s3cmd/


使用 PHP 讀寫檔案,參考下一篇
[Linode] Object Storage 使用 AWS SDK for PHP - KnucklesNote板 - Disp BBS

--
※ 作者: Knuckles 時間: 2024-01-09 03:22:31 (台灣)
※ 編輯: Knuckles 時間: 2024-01-09 04:12:49 (台灣)
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 48 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇