# 使用S3 儲存的幾個方式
# 1. Mount S3 as Network Drive
## 用 Goofys 掛載 S3 儲存
### 安裝
```
# 下載最新版的 goofys 二進位執行檔
wget https://github.com/kahing/goofys/releases/latest/download/goofys
# 設定執行權限
chmod +x goofys
mv goofys ~/bin
```
### 認證
```
# 建立 ~/.aws 目錄
mkdir ~/.aws
# 建立 ~/.aws/credentials 設定檔
touch ~/.aws/credentials
```
在 ~/.aws/credentials 設定檔中填入 S3 的 access key 與 secret key,若有多組金鑰則可放在不同的 profile 設定區塊之中。
```
[default]
aws_access_key_id = xxxxxxxxxxxxxxxx
aws_secret_access_key = asdsdffghfhgjghkyujkjlkj;kl;t6ytgfhfgbqwev
[profile-1]
aws_access_key_id = yyyyyyyyyyyyyyyyy
aws_secret_access_key = 123dtyuk,hxcbtrasdxcvghtyusadfyvhortiopnv
[profile-2]
aws_access_key_id = zzzzzzzzzzzzzzzzzzzzzz
aws_secret_access_key = piudvogfjrtynzxbchzxgftyqwerfoffubjvdfohbuir
```
金鑰與節點可以到TWCC查看
登入TWCC主頁=>雲端物件儲存=>第三方軟體下載
點選眼睛圖示後複製
![](https://cos.twcc.ai/SYS-MANUAL/uploads/upload_73f7e9ced6b191d3d659aa0e61d27c86.png)
### 掛載
`~/bin/goofys --profile=profile-1 --endpoint=https://s3.twcc.ai <S3_bucket_name> <local_folder_name>`
### 卸載
`fusermount -u <local_folder_name>`
[](https://i.imgur.com/R81AsFr.png)
# 2. Use Amazon S3 User Interface Tools
## aws cli v2
### 安裝
[安裝或更新最新版本的AWS CLI](https://docs.aws.amazon.com/zh_tw/cli/latest/userguide/getting-started-install.html)
### 組態與認證
[組態與憑證檔案設定](https://docs.aws.amazon.com/zh_tw/cli/latest/userguide/cli-configure-files.html)
使用`aws configure`進行設定,預設路徑存放於主目錄下的`.aws`資料夾。
Unix 系統中是使用 $HOME 或 ~ (波狀符號) 來參考,Windows 中是使用環境變數 %UserProfile% 來參考。
不敏感的資訊放在config檔案,敏感的資訊放在credentials檔案。
~/.aws/config
```
[default]
region=
output=json
[profile1]
region=
output=json
[profile2]
region=
output=json
```
~/.aws/credentials
```
[default]
aws_access_key_id=xxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[profile1]
aws_access_key_id=xxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[profile2]
aws_access_key_id=xxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
也可將`AWS_CONFIG_FILE`環境變數設為其他本機路徑,以指定 config 檔案的非預設位置。
### 使用高階 (s3) 命令
[aws s3](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/index.html)
#### 建立儲存貯體(在TWCC未成功)
`aws s3 mb s3://bucket-name`
#### 刪除儲存貯體(在TWCC未成功)
移除 s3://bucket-name 儲存貯體
`aws s3 rb s3://bucket-name`
若要移除不是空的儲存貯體,您需要包含 --force 選項。
`aws s3 rb s3://bucket-name --force`
#### 列出儲存貯體和物件
列出所有 Amazon S3 儲存貯體。
`aws s3 ls`
列出儲存貯體中的所有物件
`aws s3 ls s3://bucket-name`
#### 刪除物件
`aws s3 rm s3://bucket-name/example/filename.txt`
#### 複製物件
s3://bucket-name/example 的物件複製到 s3://my-bucket/
`aws s3 cp s3://bucket-name/example s3://my-bucket/`
將本機檔案從目前的工作目錄複製至 Amazon S3 儲存貯體。
`aws s3 cp filename.txt s3://bucket-name`
從 Amazon S3 儲存貯體複製至目前的工作目錄
`aws s3 cp s3://bucket-name/filename.txt ./`
#### 移動物件
物件從 s3://bucket-name/example 移動至 s3://my-bucket/
`aws s3 mv s3://bucket-name/example s3://my-bucket/`
將本機檔案從目前的工作目錄移動至 Amazon S3 儲存貯體。
`aws s3 mv filename.txt s3://bucket-name`
從 Amazon S3 儲存貯體移動至目前的工作目錄
`aws s3 mv s3://bucket-name/filename.txt ./`
#### 同步物件
將名為 my-bucket 的儲存貯體中名為 path 的 Amazon S3 前綴內容與目前的工作目錄進行同步。
`aws s3 sync . s3://my-bucket/path`
### 使用 API 層級 (s3api) 命令
[aws s3api](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/index.html)
#### 建立儲存貯體
The following create-bucket example creates a bucket named my-bucket
```
aws s3api create-bucket --bucket my-bucket
```
#### 刪除儲存貯體
The following command deletes a bucket named my-bucket:
```
aws s3api delete-bucket --bucket my-bucket
```
## winscp
開啟後跳出站台設定,點選新增站台,在檔案協定選擇Amazon S3。
主機名稱
存取金鑰
保密存取金鑰
可以參考[TWCC-雲端物件連線資訊](https://man.twcc.ai/@preview-twccdocs/doc-cos-main-zh/https%3A%2F%2Fman.twcc.ai%2F%40preview-twccdocs%2Fguide-cos-connect-info-zh)取得
![](https://cos.twcc.ai/SYS-MANUAL/uploads/upload_b5e8373aed3a71e267267db866ac4ecd.png)
若有設定aws cli credentials的話,可以勾選"從AWS CLI組態讀取認證資訊"
登入後就跟平常使用winscp一樣
![](https://cos.twcc.ai/SYS-MANUAL/uploads/upload_d92df8c4705031016fec3945a88abaac.png)
## S3 Browser
可參考[TWCC-使用第三方軟體管理檔案-S3 Browser](https://man.twcc.ai/@preview-twccdocs/doc-cos-main-zh/%2F%40preview-twccdocs%2Fguide-cos-s3browser-zh)
# 3. Use AWS SDK for Python (Boto3)
## Boto
Boto 是一種 Python AWS SDK 套件,提供連接 AWS 的介面 (包含 Amazon S3)
[Boto3](https://aws.amazon.com/tw/sdk-for-python/)
### 安裝
`pip install boto3`
### 認證
和aws cli共用認證
### download files(text mode)
把遠端bucket內的檔案下載到本地的檔案系統(以text mode開啟)
```
s3 = boto3.client('s3')
with open('FILE_NAME', 'w') as f:
s3.download_file('BUCKET_NAME', 'OBJECT_NAME', f)
```
考慮到Taiwania3上都有`/scratch`資料夾,在計算過程中,將檔案下載到`/scratch`是一個好選擇。
```
with open('/scratch/local_file.txt', 'w') as f:
s3.download_file('my_BUCKET', 'local_file', f)
```
### download files(binary mode)
把遠端bucket內的檔案下載到本地的檔案系統(以binary mode開啟)
```
s3 = boto3.client('s3')
with open('FILE_NAME', 'wb') as f:
s3.download_fileobj('BUCKET_NAME', 'OBJECT_NAME', f)
```
## 應用情境
利用aws cli v2 將HFS資料搬移到S3
```
02:19:32 p00acy00@lgn303:nerf$ aws --profile=GOV110172-public --endpoint-url=https://s3.twcc.ai s3 sync old_data/ s3://olddata/
```
再用gooyfs掛載 S3 儲存
```
02:19:32 p00acy00@lgn303:nerf$ ~/bin/goofys --profile=GOV110172-public --endpoint=https://s3.twcc.ai olddata ~/s3_folder/
02:20:05 p00acy00@lgn303:nerf$ ls ~/s3_folder/
...
```
使用diff比對HFS資料以及S3資料
```
02:23:06 p00acy00@lgn303:p00acy00$ diff -qr nerf/old_data/ ~/s3_folder/ | sort
```
比對無誤後使用fusermount卸載 S3 儲存
```
04:15:12 p00acy00@lgn303:p00acy00$ fusermount -u ~/s3_folder/
08:30:55 p00acy00@lgn303:p00acy00$ ls
```
刪除HFS儲存
```
08:31:38 p00acy00@lgn303:nerf$ rm -rf old_data/
```
## 參考資料
[Linux 使用 diff 指令比較兩個目錄的檔案差異教學與範例](https://officeguide.cc/linux-diff-files-in-two-different-directories-tutorial-examples/)
[Linux 使用 Goofys 掛載 S3 儲存空間教學與範例](https://officeguide.cc/linux-goofys-mount-s3-bucket-filey-system-tutorial-examples/)
[Connecting to Amazon S3 service](https://winscp.net/eng/docs/guide_amazon_s3)
[Connecting to an S3 Bucket using WinSCP](https://infra.engineer/aws/18-connecting-to-an-s3-bucket-using-winscp)
sudo rsync -avzh --progress -e 'ssh -i .ssh/kp1570410003932.pem' /home ubuntu@103.124.75.59:/media/203.145.222.147/home