aws-cli v2.x 에서 aws s3 sync
명령어의 동작 원리와 주요 옵션에 대해 설명합니다.
이름은 sync
지만 완전히 똑같은 상태를 만드는 것이 아니라 source 에서 target 으로 필요한 것만 PUT 하는 것이 원칙이다.
sync-test/
├── a.txt
└── b.txt
# first sync
$ aws s3 sync sync-test s3://milkcoke-logs/sync-test
upload: sync-test/b.txt to s3://milkcoke-logs/sync-test/b.txt
최초 파일 생성시 a.txt, b.txt 파일 모두 S3 Object key 경로에 디렉토리명을 포함하여 파일이 업로드 된다.
# second sync
$ aws s3 sync sync-test s3://milkcoke-logs/sync-test
2번째 명령어 입력에선 아무런 API 호출이 없었다.
# third sync
$ echo 'aaa' > sync-test/a.txt # a 파일 수정
$ aws s3 sync sync-test s3://milkcoke-logs/sync-test
upload: sync-test/a.txt to s3://milkcoke-logs/sync-test/a.txt
a.txt 파일 수정하고 sync
했더니 a.txt 파일만 업로드 한다.
aws s3 sync
는 자동으로 변경을 감지하여 변경한 파일만 동기한다.
‘변경 발생’ 여부를 어떻게 파악할까?
파일 크기를 검사한다.
파일 크기가 다른 경우 sync 대상이 된다.
파일이 마지막으로 변경된 timestamp 를 검사한다.
파일 크기가 같더라도 변경된 시각이 다르면 sync 대상이 된다.
💡 git 같은 시스템으로 파일 변경을 Rollback 했다 하더라도
로컬 파일의 마지막 수정 일자가 업데이트 되므로 이럴 땐 sync 대상이 된다.
실제 파일 변경이 없더라도 마지막 수정일자가 업데이트되면 sync 대상이기 때문에
파일 크기가 큰 경우 중복 업로드 API 호출이 발생할 수 있다.
완벽하진 않지만 --size-only
사용시 파일 크기만을 변경 감지 기준으로 설정할 수 있다.