本篇介紹如何使用 AWS CLI 命令列界面,存取自己的 S3 設備,上傳、下載、管理檔案。

安裝 AWS 命令列界面

AWS Command Line Interface 是 AWS 官方提供的指令工具,可用來操作各種 AWS 服務,當然也可以用來操控 S3。

若在 Debian/Ubuntu Linux 中,可用 apt 直接安裝 AWS 命令列界面套件:

# 安裝 AWS 命令列界面
sudo apt install awscli

若在 CentOS Linux 中,也可以用 yum 安裝:

sudo yum install awscli

另外亦可用 pip 來安裝:

pip3 install awscli

基本設定

將 S3 認證用的金鑰存放在 ~/.aws/credentials 這個設定檔中(若此檔案不存在則自己新增),此檔案可以存放多個 S3 帳號的金鑰,其內容格式如下:

[default]
aws_access_key_id=ASFHDGN345JGS436FG53
aws_secret_access_key=45G54d4cbGDF56bnFsfdgh489dfGHDdfgDFGHs4e

[mys3]
aws_access_key_id=HJN456GUGZ45XF94FG87
aws_secret_access_key=FGadsgf543DFGjtgy45DSzgtSdfGH67NHzxdpqZ3

為了後續執行指令方便,我們把共通的 aws 指令參數放在 ARGS 變數中:

# 指令參數設定
ARGS="--profile=mys3 --endpoint-url=https://s3.example.com"

這裡的 --profile 是指定要使用的金鑰(若不設定則會使用 default),而 --endpoint-url 則是用來指定 S3 的主機。

若在測試階段,自己的 S3 伺服器 SSL 憑證不是有效憑證的話,可以加上 --no-verify-ssl 取消驗證憑證。

這裡的設定方式主要是針對私有的 S3 設備,若為一般性的使用者,可以使用 aws configure 指令以互動式的方式,產生所需要的設定檔。

關於 AWS CLI 的各種通用參數,可以參考 AWS CLI 官方文件

建立 Bucket

接著就可以使用 aws 指令開始操作 S3,首先使用 s3 mb 指令建立一個 bucket:

# 建立 bucket
aws ${ARGS} s3 mb s3://gtwang
make_bucket: gtwang

s3 ls 指令可用來列出 bucket 或是檔案:

# 列出所有 bucket
aws ${ARGS} s3 ls
2019-10-24 02:04:36 gtwang

複製檔案

若要複製檔案,可用 s3 cp 指令,例如上傳檔案:

# 複製檔案(上傳)
aws ${ARGS} s3 cp test.txt s3://gtwang/
upload: ./test.txt to s3://gtwang/test.txt

若要查看 bucket 中的檔案列表,可以使用 s3 ls 指令:

# 列出檔案
aws ${ARGS} s3 ls s3://gtwang
2019-10-24 02:31:52         44 test.txt

s3 cp 指令亦可用來下載檔案:

# 複製檔案(下載)
aws ${ARGS} s3 cp s3://gtwang/test.txt .
download: s3://gtwang/test.txt to ./test.txt

若要上傳(或下載)整個目錄,可以加上 --recursive 參數:

# 上傳目錄
aws ${ARGS} s3 cp myfolder s3://gtwang/myfolder --recursive
upload: myfolder/test.php to s3://gtwang/myfolder/test.php
upload: myfolder/test2.txt to s3://gtwang/myfolder/test2.txt
upload: myfolder/test.tmp to s3://gtwang/myfolder/test.tmp

同步檔案

s3 sync 指令就類似 Linux 的 rsync,可用來同步檔案或目錄,並且可以指定排除規則:

# 同步檔案或目錄(上傳)
aws ${ARGS} s3 sync myfolder s3://gtwang/myfolder --exclude *.tmp
upload: myfolder/test.php to s3://gtwang/myfolder/test.php
upload: myfolder/test2.txt to s3://gtwang/myfolder/test2.txt

也可用來下載:

# 同步檔案或目錄(下載)
aws ${ARGS} s3 sync s3://gtwang/myfolder myfolder

透過 HTTPS/HTTP 分享檔案

若要讓別人可以透過網頁瀏覽器直接下載 S3 上面的檔案,可以使用 s3 presign 指令針對特定檔案產生一個下載專用網址,只要知道這個網址的人就可以直接下載檔案(不需要帳號或密碼):

# 產生下載專用網址
aws ${ARGS} s3 presign s3://gtwang/test.txt
https://s3.example.com/gtwang/test.txt?AWSAccessKeyId=HJN456GUGZ45XF94FG87&Signature=QnAqHel7Qpvun7jQJnGSQET98MQ%3D&Expires=1571964188

這個下載網址預設的有效期間是一小時,若要自訂有效期間,可以用 --expires-in 參數指定時間(單位為秒):

# 產生下載專用網址(有效期間為一週)
aws ${ARGS} s3 presign s3://gtwang/test.txt --expires-in 604800

重新命名(搬移)檔案

若要將 S3 上面的檔案重新命名,或是搬到新的位置,可以使用 s3 mv 指令

# 重新命名(搬移)檔案
aws ${ARGS} s3 mv s3://gtwang/test.txt s3://gtwang/new_name.txt
move: s3://gtwang/test.txt to s3://gtwang/new_name.txt

刪除檔案(或目錄)

若要刪除 S3 上面的檔案或目錄,可以使用 s3 rm 指令

# 刪除檔案(或目錄)
aws ${ARGS} s3 rm s3://gtwang/myfolder
delete: s3://gtwang/myfolder

刪除 Bucket

若要刪除空的 bucket,可以使用 s3 rb 指令

# 刪除空的 bucket
aws ${ARGS} s3 rb s3://gtwang

參考資料:AWS CLI s3 指令文件