AWS S3 syncコマンドの説明

# はじめに

S3バケットとローカルの間、ファイルをdownload・uploadする場合、aws s3 cpコマンドがよく利用されると思います。実は、aws s3 syncコマンドを利用してもよいのです。機能面を見ると、この２つのコマンドは、すごく似ている感じですね。そもそも、どんな違いがあるのでしょうか。

# 違い所

* **cpコマンド** 

対象ファイルの存在と変更に関わらず、単純に条件に合致した対象ファイルをコピーすること。（無駄なコピー操作が発生するかもしれない）

* **syncコマンド**

同期化だから、対象ファイルをコピーする前に、S3バケットとローカルの間、ファイルの差分を行います。コピー先に存在する、かつ、変更がないファイルに対して、skipして、コピーしないです。コピー操作を最小限に抑えるため、コスト削減ができます。

# 使い方のお勧め
一回目のファイルコピー（コピー先に何のファイルも存在していない）は、cpコマンドを利用する（syncコマンドは、余計な同期化チェックにコストがかかるため、避けたいと思います。）

二回目以降は、syncコマンドを利用する。（同期化だから、スピードとコストの両方ともお得ですね。）

# Example
syncコマンドは、デフォルトで、全てのファイル（.bashrcファイルも含む）をs3バケットにuploadします。回避したい場合、--exclude ".*"を追加してよい。

```
[cloudshell-user@ip-10-132-89-169 ~]$ pwd
/home/cloudshell-user
[cloudshell-user@ip-10-132-89-169 ~]$ echo "test" > test.txt
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ ls -l
total 4
-rw-r--r--. 1 cloudshell-user cloudshell-user 5 Jul 18 02:49 test.txt
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 ls yunfan-front-backup
2021-03-07 11:42:13    2167775 yunfan.zip
2021-03-13 07:12:19   10998345 yunfan20210313.zip
2021-03-16 14:41:00   11012289 yunfan20210316.zip
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 sync . s3://yunfan-front-backup
upload: ./.bash_logout to s3://yunfan-front-backup/.bash_logout                     
upload: ./.zshrc to s3://yunfan-front-backup/.zshrc                                 
upload: ./.bash_profile to s3://yunfan-front-backup/.bash_profile
upload: ./.bashrc to s3://yunfan-front-backup/.bashrc           
upload: .config/powershell/Microsoft.PowerShell_profile.ps1 to s3://yunfan-front-backup/.config/powershell/Microsoft.PowerShell_profile.ps1
upload: ./test.txt to s3://yunfan-front-backup/test.txt        
upload: ./.zprofile to s3://yunfan-front-backup/.zprofile      
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 sync . s3://yunfan-front-backup
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 sync . s3://yunfan-front-backup
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ echo "test001" > test.txt 
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 sync . s3://yunfan-front-backup
upload: ./test.txt to s3://yunfan-front-backup/test.txt         
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 ls yunfan-front-backup
                           PRE .config/
2024-07-18 02:52:32         18 .bash_logout
2024-07-18 02:52:32        141 .bash_profile
2024-07-18 02:52:32        539 .bashrc
2024-07-18 02:52:32        299 .zprofile
2024-07-18 02:52:32        777 .zshrc
2024-07-18 02:53:22          8 test.txt
2021-03-07 11:42:13    2167775 yunfan.zip
2021-03-13 07:12:19   10998345 yunfan20210313.zip
2021-03-16 14:41:00   11012289 yunfan20210316.zip
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ 
##コンソール画面から、.bashrcファイルなどを手動で削除しておく##
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 ls yunfan-front-backup
2024-07-18 02:53:22          8 test.txt
2021-03-07 11:42:13    2167775 yunfan.zip
2021-03-13 07:12:19   10998345 yunfan20210313.zip
2021-03-16 14:41:00   11012289 yunfan20210316.zip
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 sync . s3://yunfan-front-backup --exclude ".*"                                                                                        
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 ls yunfan-front-backup                                                                                                                
2024-07-18 02:53:22          8 test.txt
2021-03-07 11:42:13    2167775 yunfan.zip
2021-03-13 07:12:19   10998345 yunfan20210313.zip
2021-03-16 14:41:00   11012289 yunfan20210316.zip
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ echo "xxxx" > test.txt 
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 sync . s3://yunfan-front-backup --exclude ".*"
upload: ./test.txt to s3://yunfan-front-backup/test.txt         
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 sync . s3://yunfan-front-backup --exclude ".*"
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ 
[cloudshell-user@ip-10-132-89-169 ~]$ aws s3 ls yunfan-front-backup                                                                                                                
2024-07-18 03:01:08          5 test.txt
2021-03-07 11:42:13    2167775 yunfan.zip
2021-03-13 07:12:19   10998345 yunfan20210313.zip
2021-03-16 14:41:00   11012289 yunfan20210316.zip
[cloudshell-user@ip-10-132-89-169 ~]$ 
```

# 終わりです。