Aws-cli: AWS S3 ๋™๊ธฐํ™” ๋ฌธ์ œ

์— ๋งŒ๋“  2014๋…„ 01์›” 17์ผ  ยท  41์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: aws/aws-cli

sync ๋ช…๋ น๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ S3( s3 -> local )์—์„œ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒฝ์šฐ์— ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ๋ฌธ์ œ์™€ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์„ ์š”์•ฝํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

๋™๊ธฐํ™” ๋™์ž‘ ๊ฐœ์š”

๋™๊ธฐํ™” ๋™์ž‘์€ ํšจ์œจ์ ์ธ cp . ์›๋ณธ์—์„œ ๋‹ค๋ฅธ ๋Œ€์ƒ์œผ๋กœ ํŒŒ์ผ๋งŒ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด s3/local์— ์žˆ๋Š” ํŒŒ์ผ์ด ๋‹ค๋ฅธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ํฌ๊ธฐ( stat ์—์„œ ๋กœ์ปฌ๋กœ ํŒŒ์ผ ๋ฐ ListObjects ์‘๋‹ต์˜ Size ํ‚ค์—์„œ)
  • ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„(๋กœ์ปฌ ํŒŒ์ผ์˜ mtime ๋ฐ ListObjects ์‘๋‹ต์˜ LastModified ํ‚ค)

์ œ์ณ๋‘๊ณ , ์šฐ๋ฆฌ๋Š” ๋‹จ์ผ ํ˜ธ์ถœ์—์„œ ์ตœ๋Œ€ 1000๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ListObjects ์ž‘์—…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ListObjects ์‘๋‹ต์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ์ •๋ณด๊ฐ€ LastModified, ETag, StorageClass, Key, Owner, Size ์ •๋ณด๋กœ ์ œํ•œ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์›๊ฒฉ ๋ฐ ๋กœ์ปฌ ํŒŒ์ผ ํŒŒ์ผ ํฌ๊ธฐ์™€ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„์ด ์ฃผ์–ด์ง€๋ฉด ํŒŒ์ผ์ด ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ๋Š” ์‰ฝ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋ฉด ํŒŒ์ผ์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ํŒŒ์ผ์„ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„์ด ๋” ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ํŒŒ์ผ์˜ mtime์— ์ง„์ •ํ•œ์— mtime๋Š” ๋™์•ˆ LastModified ์—์„œ ์‹œ๊ฐ„ ListObjects ๊ฐœ์ฒด๊ฐ€ ์—…๋กœ๋“œ๋˜์—ˆ์„ ๋•Œ ์ •๋ง์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

aws s3 sync local/ s3://bucket/
sleep 10
aws s3 sync s3://bucket local/

์ฒซ ๋ฒˆ์งธ ๋™๊ธฐํ™” ๋ช…๋ น( local->s3 ) ํ›„์— ๋กœ์ปฌ ํŒŒ์ผ์˜ mtime์€ 0์ด๊ณ  s3์˜ ๋‚ด์šฉ์€ LastModified ์‹œ๊ฐ„์ด 10์ด ๋ฉ๋‹ˆ๋‹ค(์ƒ๋Œ€ ์˜คํ”„์…‹ ์‚ฌ์šฉ). s3์—์„œ ๋กœ์ปฌ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” ๋‘ ๋ฒˆ์งธ aws s3 sync ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ๋จผ์ € ํŒŒ์ผ ํฌ๊ธฐ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์ •๋œ ์‹œ๊ฐ„ ๊ฒ€์‚ฌ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์„œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค(๋กœ์ปฌ == 0, s3 == 10). ์—„๊ฒฉํ•œ ๋™๋“ฑ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ์„ s3์—์„œ ๋กœ์ปฌ๋กœ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋™๊ธฐํ™”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋™์ผํ•˜๊ณ  s3์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„์ด ๋กœ์ปฌ ํŒŒ์ผ๋ณด๋‹ค ํฌ๋ฉด(์ตœ์‹ ) ๋™๊ธฐํ™”๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ˜„์žฌ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์›๊ฒฉ ํŒŒ์ผ์ด ๋Œ€์—ญ ์™ธ(์ฝ˜์†” ๋˜๋Š” ์ผ๋ถ€ ๋‹ค๋ฅธ SDK๋ฅผ ํ†ตํ•ด) ์—…๋ฐ์ดํŠธ๋˜๊ณ  ํฌ๊ธฐ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. aws s3 sync s3://bucket local/ ์‹คํ–‰ํ•˜๋ฉด ์›๊ฒฉ ํŒŒ์ผ์„ ๋™๊ธฐํ™”ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋”๋ผ๋„ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž ์žฌ์  ์†”๋ฃจ์…˜

๋‹ค์Œ์€ ์ž ์žฌ์ ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

  1. ์‹œ๊ฐ„ ๊ฒ€์‚ฌ๋ฅผ ์—„๊ฒฉํ•œ ๋™๋“ฑ ๋น„๊ต๋กœ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค. ์‹œ๊ฐ„์ด ๋‹ค๋ฅด๋ฉด ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. aws s3 sync local s3://bucket && aws s3 s3://bucket local ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํŒŒ์ผ์„ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•  ๋•Œ ํŒŒ์ผ์˜ mtime์„ LastModified ์‹œ๊ฐ„๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฏ€๋กœ aws s3 sync s3://bucket local _again_ ์‹คํ–‰ํ•˜๋ฉด ํŒŒ์ผ์ด ๋™๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ์ด ์—…๋กœ๋“œ๋  ๋•Œ ๋กœ์ปฌ mtimes๋ฅผ S3์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํŒŒ์ผ ์‹œ๊ฐ„ ๊ฒ€์‚ฌ๋ฅผ ์—„๊ฒฉํ•œ ๊ฐ™์Œ/๊ฐ™์ง€ ์•Š์€ ๊ฒ€์‚ฌ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์œ ์ผํ•œ ๋‹จ์ ์€ ์‚ฌ๋žŒ๋“ค์ด ์šฐ๋ฆฌ๊ฐ€ ํŒŒ์ผ์˜ mtime์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค(์ €๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).
  3. ๊ฐ ๊ฐœ์ฒด์— ์‚ฌ์šฉ์ž ์ง€์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž ์žฌ์ ์œผ๋กœ ๋กœ์ปฌ mtime, md5์˜ ์กฐํ•ฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์›ํ•˜๋Š” ๊ฒฝ์šฐ md5 ์ฒดํฌ์„ฌ์„ ๋น„๊ตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•ด ListObjects์—์„œ HeadObject๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด 1000๋ฐฐ ๋” ๋งŽ์€ API ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜๊ณ  ๋งŽ์€ ์ž‘์€ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ๋™๊ธฐํ™” ์†๋„๊ฐ€ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค. ์ •์ƒ ์ƒํƒœ์˜ ๊ฒฝ์šฐ HeadObjects๋ฅผ ๋” ๋นจ๋ฆฌ ๋‹ค์šด๋กœ๋“œ/์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋‹จ์ ์€ ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„ ๋‹ค๋ฅธ ๋„๊ตฌ์™€์˜ ์ƒํ˜ธ ์šด์šฉ์ด ๋” ์–ด๋ ค์›Œ์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ฐ์ฒด์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋™๊ธฐํ™”ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ).
  4. ๋กœ์ปฌ ETag ์บ์‹œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์„ ํŒŒ์ผ์˜ ETag/local mtime/๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„/md5์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ์Šค ์ธก๋ฉด์—์„œ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ListObjects๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•œ ๋ฒˆ์— 1000๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋‹จ์ ์€ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์บ์‹œ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌํ˜„ ์ธก๋ฉด์—์„œ ๊ฐ€์žฅ ๋ณต์žกํ•œ ์†”๋ฃจ์…˜์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋นผ๋จน์€ ๋‹ค๋ฅธ ์ž ์žฌ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

automation-exempt feature-request s3 s3md5 s3sync

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ๋ฐฑ์—…์„ ๋ฒ”ํ”„!

๋ชจ๋“  41 ๋Œ“๊ธ€

์„œ๋ฒ„ ์ œ๊ณต ETag์˜ ์บ์‹œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋Œ€์‹  ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ETag๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด md5 ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฐ™์ง€๋งŒ ListObjects ์‘๋‹ต์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ETag ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์„œ๋ฒ„ ์ธก ์ƒํƒœ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ํ•œโ€ฆ

์ฐพ์œผ์…จ์Šต๋‹ˆ๋‹ค :-)

-- ์„ธ๋ธŒ

2014๋…„ 1์›” 17์ผ 16:26์— Jeff Waugh < [email protected] [email protected] >์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์•„: https://forums.aws.amazon.com/thread.jspa?messageID=203510&state=hashArgs%23203510

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ Gi tHubhttps://github.com/aws/aws-cli/issues/599#issuecomment -32668382์—์„œ ํ™•์ธํ•˜์„ธ์š”.

Amazon EU Societe a responsabilite limitee, 5 Rue Plaetis, L - 2338 Luxembourg, RCS Luxembourg n B 101818, Capital social: EUR 37.500. Autorisation d establissement en qualite de commercante n 104408.

์˜ˆ, ๋ฉ€ํ‹ฐํŒŒํŠธ ์—…๋กœ๋“œ์— ๋Œ€ํ•œ ETag๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ๋™์ž‘์— ๋Œ€ํ•ด ์ƒˆ ํ”Œ๋ž˜๊ทธ(๋˜๋Š” 2๊ฐœ)๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ต์…˜ 1์˜ ๊ฒฝ์šฐ --check-timestamps , ์˜ต์…˜ 2์˜ ๊ฒฝ์šฐ --update-local-timestamps ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ง€์ •ํ•˜๊ณ  ๋™์‹œ์— ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์˜ต์…˜ 1๊ณผ 2์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ(์ง€์ •๋œ ์˜ต์…˜ ์—†์Œ) ๋™์ž‘์— sync ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋กœ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ์ ์ธ ์ ˆ์ถฉ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@jamesls ์ƒ์„ฑ๋œ ์ •์  ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด sync ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ„์ „์—์„œ๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ์žฌ์ƒ์„ฑ๋˜์ง€ ์•Š๋”๋ผ๋„ ์‚ฌ์ดํŠธ๊ฐ€ ์žฌ์ƒ์„ฑ๋  ๋•Œ mtime์ด ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐํ™”ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ํŒŒ์ผ์„ ๋‹ค์‹œ ์—…๋กœ๋“œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ชฉ์ ์„ ์œ„ํ•ด(๊ทธ๋ฆฌ๊ณ  ์ด ๋ฉ‹์ง„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์  ์‚ฌ์ดํŠธ๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๊ฑด๊ฐ•ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) #575์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ ETag๋ฅผ ํ†ตํ•ด ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ต์…˜.

๊ทธ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ •์  ์‚ฌ์ดํŠธ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด ๊ธธ์ด ๊ฒ€์‚ฌ(์•ฝ๊ฐ„ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Œ)๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ๋ฉ€ํ‹ฐํŒŒํŠธ ์—…๋กœ๋“œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  #575๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰์‹œ ์—„์ฒญ๋‚œ ์ ˆ์•ฝ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฐ˜๋Œ€์˜ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๋™์ผํ•œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ S3์—์„œ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ ์ตœ์‹  ํƒ€์ž„์Šคํƒฌํ”„์™€ s3 ๋™๊ธฐํ™”๊ฐ€ ํŒŒ์ผ์„ ํ’€๋‹ค์šดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

AWS s3 ๋™๊ธฐํ™” s3://bucket/path/ ๋””๋ ‰ํ† ๋ฆฌ

S3์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‹ˆ... ์‹œ๊ฐ„๋Œ€ ๋ฌธ์ œ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์•„์š”.
์†์„ฑ์€ ๋‹ค์Œ ์‹œ๊ฐ„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์ˆ˜์ • ๋‚ ์งœ: 2014๋…„ 2์›” 21์ผ ์˜ค์ „ 10:50:33

๊ทธ๋Ÿฌ๋‚˜ HTTP ํ—ค๋”๋Š”

์ตœ์ข… ์ˆ˜์ •์ผ: 2014๋…„ 2์›” 21์ผ ๊ธˆ์š”์ผ 15:50:33 GMT

Last Modified ์†์„ฑ์—๋Š” ์‹œ๊ฐ„๋Œ€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‚ด s3 sync ๋ช…๋ น์ด ํŒŒ์ผ์„ ๋„ฃ์€ ์œ„์น˜์™€ ๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€์˜ ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ์ด ๊ณผ๊ฑฐ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋„๋ก s3 cp๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ --size-only ์ธ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์ง€๋งŒ ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฒฝ์šฐ ์ด๋Š” ๋„์›€์ด ๋  ๊ฒƒ์ด๋ฉฐ ํŠนํžˆ s3์— ๋™๊ธฐํ™”๋˜๋Š” ์ •์  ์‚ฌ์ดํŠธ์™€ ํ•จ๊ป˜ ์œ„์—์„œ ์ฐธ์กฐํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ดํ•ด/์„ค๋ช…ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋™๊ธฐํ™”ํ•  ํŒŒ์ผ์ด ๋Œ€์ƒ๋ณด๋‹ค ์ตœ์‹ ์ธ ๊ฒฝ์šฐ ๋™๊ธฐํ™”์—๋Š” ํ•ญ์ƒ ํŒŒ์ผ์„ ๋™๊ธฐํ™”ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ A์—์„œ S3๋กœ, ๊ทธ ํ›„์— S3์—์„œ ์‹œ์Šคํ…œ B๋กœ ํŒŒ์ผ์„ ๋™๊ธฐํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด(ํ•˜์ง€๋งŒ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝ๋จ) ์ด ํŒŒ์ผ์€ ์‹œ์Šคํ…œ B์— ๋„๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ํŒŒ์ผ๊ณผ ๋™๊ธฐํ™”ํ•ด๋„ ์ƒ๊ด€์—†์ง€๋งŒ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์€ ์ ˆ๋Œ€ ๋น ์ง€๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋‚ด ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์— ๋”ฐ๋ฅด๋ฉด "์ตœ์‹ "์€ ์‹œ๊ฐ„๋Œ€๋„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ํ•œ ์‹œ๊ฐ„๋Œ€์—์„œ S3๋กœ ํŒŒ์ผ์„ ํ‘ธ์‹œํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€์—์„œ ๋™๊ธฐํ™”ํ•˜๋ฉด ํŒŒ์ผ์ด ์ตœ์‹ ์ธ์ง€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

@jamesls --size-only ์ธ์ˆ˜์— ๋”ํ•˜์—ฌ --name-only ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŒŒ์ผ ํฌ๊ธฐ๋‚˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„์„ ํ™•์ธํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์†Œ์Šค์—๋Š” ์žˆ์ง€๋งŒ ๋Œ€์ƒ์—๋Š” ์—†๋Š” ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” s3์—์„œ ๋กœ์ปฌ๋กœ ๋™๊ธฐํ™”ํ•˜๊ณ  ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„์—๋Š” s3์—์„œ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์œผ๋กœ ์ธํ•ด ๋กœ์ปฌ(nfs) ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ž‘์—…์ด ์ค„์–ด๋“ค๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jamesls --size-only et al์„ 1.3.6์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์‚ฌ๋ก€ 186692581์— ๋Œ€ํ•œ ์ œ AWS ์ง€์› ๋‹ด๋‹น์ž๊ฐ€ ์ œ ์ œ์•ˆ์„ ๊ท€ํ•˜์—๊ฒŒ ์ „๋‹ฌํ–ˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.
์–ด์จŒ๋“  ์˜๊ฒฌ์„ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์ด fuzz factor๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ์ปฌ -> S3 ๋ณต์‚ฌ์— 5๋ถ„ ์ด์ƒ ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋ฉด,
๊ทธ๋Ÿฐ ๋‹ค์Œ ํ›„์† ์‹œ๊ฐ„ ๋น„๊ต์—์„œ 10๋ถ„ ํผ์ง€ ๊ณ„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
10๋ถ„ ์ด๋‚ด์˜ ์ƒ๋Œ€ ์‹œ๊ฐ„์„ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค.
S3 ์‹œ๊ฐ„์ด 10๋ถ„ ์ด์ƒ ์ง€๋‚œ ๊ฒฝ์šฐ S3 -> ๋กœ์ปฌ์—์„œ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
์˜ต์…˜์œผ๋กœ "--fuzz=10m"์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jamesls @adamsb6
https://github.com/aws/aws-cli/pull/575 ์ ์–ด๋„ ๋‹จ์ผ ๋ถ€๋ถ„ ์—…๋กœ๋“œ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ข‹์€ ์˜ต์…˜์ด ์•„๋‹Œ๊ฐ€์š”?

S3์—์„œ ํŒŒ์ผ์˜ ETAG ํ˜•์‹์„ ํ™•์ธํ•˜๋ฉด ํŒŒ์ผ์ด ๋‹จ์ผ("ETAG = "MD5 Hash") ๋˜๋Š” ๋‹ค์ค‘ ํŒŒํŠธ(ETAG = "MD5 Hash" - "Number of Parts")๋กœ ์—…๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒ์ผ ๋กœ์ปฌ MD5๋ฅผ ETAG์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํŒŒ์ผ์ด ๋ฉ€ํ‹ฐํŒŒํŠธ๋กœ ์—…๋กœ๋“œ๋œ ๊ฒฝ์šฐ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  AWS ๋ฆฌ์ „์˜ ec2 ์ธ์Šคํ„ด์Šค์™€ ๋™๊ธฐํ™”๋˜๋Š” S3 ๋ฒ„ํ‚ท์˜ ํŠน์ • ํด๋”์— ๋งŽ์€ ๋น„๋””์˜ค ํด๋ฆฝ์ด ์žˆ๋Š” ๊ณ ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒ์ผ์€ ๋‹จ์ผ ๋ถ€๋ถ„์œผ๋กœ ์—…๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ s3cmd๋กœ ์ธํ•ด ์ผ๋ถ€ ํŒŒ์ผ์ด ์†์ƒ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋™๊ธฐํ™”๋ฅผ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๋ฉด 14TB์˜ ํŠธ๋ž˜ํ”ฝ์ด ์ฒญ๊ตฌ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๋ฌธ์ œ: ์†์ƒ๋œ ํŒŒ์ผ์€ s3์˜ ์›๋ณธ ํŒŒ์ผ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ s3cmd๋ฅผ ํ†ตํ•œ ์ž˜๋ชป๋œ ํƒ€์ž„์Šคํƒฌํ”„๋กœ ์ธํ•ด ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ --compare-on-etag ๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ๋‹ค์‹œ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

aws s3 sync๋Š” ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋งŒ ๋™๊ธฐํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ๋™๊ธฐํ™”์˜ ๊ฒฝ์šฐ์—๋„ ๋‹จ์ผ ๋ถ€๋ถ„ ์—…๋กœ๋“œ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ --compare-on-etag ์˜ต์…˜์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” sync ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๊ถŒํ•œ์„ ์ฐพ๊ธฐ ์œ„ํ•ด 3์‹œ๊ฐ„ ๋™์•ˆ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ป์€ ์˜ค๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
A client error (AccessDenied) occurred when calling the ListObjects operation: Access Denied

์‹ค์ œ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ:
A client error (AccessDenied) occurred when calling the ListBucket operation: Access Denied

๊ฐ ๋ช…๋ น์— ๋Œ€ํ•œ ์ตœ์†Œ ๊ถŒํ•œ์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ๋ณด์—ฌ์ฃผ๋Š” ๋„์›€๋ง ํ•ญ๋ชฉ์€ _๋งค์šฐ_ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

404๋Š” _์ •๋ง ์ข‹์€ ์ƒ๊ฐ_์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „๊นŒ์ง€ ๋™๊ธฐํ™”๊ฐ€ ์ด๋ฏธ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด "aws s3 sync"์— rsync์™€ ๊ฐ™์€ ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ๋ณด๊ณ ๋œ ๊ทธ ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ์ดํ•ดํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ตœ์‹  AWS-CLI-bundle.zip์—๋Š” ์œ„์—์„œ ๊ตฌํ˜„ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— git clone์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. "customizations"๋ผ๋Š” ํด๋”์—์„œ ์ƒˆ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ aws-cli ๋ช…๋ น์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. make-bundle์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋„ค. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์„œ๋ฒ„(Ubuntu)์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

git clone https://github.com/andrew512/aws-cli.git
cd aws-cli
pip install -r requirements.txt
sudo python setup.py install

์ข‹์•„์š”.
๋ฒ„์ „ 1.3.18์—์„œ ์ˆ˜์ •๋œ ์ฝ”๋“œ๋ฅผ ๋ด…๋‹ˆ๋‹ค.
๋‚ด --exact-timestamps ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด์ „์— ์„ค์น˜ํ•œ ์ตœ์‹  ๋‹ค์šด๋กœ๋“œ ๋ฒˆ๋“ค์ด 1.3.21์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ •์ ์ธ ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ๊ณต์‹ AWS ๋ฆด๋ฆฌ์Šค์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” 1.3.18์—์„œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ถ„๊ธฐํ•˜์—ฌ ๋ณด๊ณ ํ•  ๋ฒ„์ „์ด์ง€๋งŒ ์ด๋ฏธ ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ž˜๋œ ๋ฒ„์ „์ด๋ฉฐ 1.3.22๊ฐ€ ํ˜„์žฌ ๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. AWS๊ฐ€ ํ’€ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ณ  ํ–ฅํ›„ ๊ณต์‹ ๋ฆด๋ฆฌ์Šค์— ์ด ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉฐ ๊ฝค ์˜์‹ฌ์Šค๋Ÿฌ์šด ๊ธฐ๋ณธ ๋™์ž‘์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

@andrew512 ๋Šฆ์–ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋‚ด์ฃผ์‹  PR์€ ์ข‹์€ ์ƒ๊ฐ์ด๋ฉฐ aws s3 sync ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ณ ๊ฐ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๋Š” ๊ฒƒ์ด ์ •๋ง ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์—... ํ—ค๋” ์š”์ฒญ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” MD5์— ๋Œ€ํ•œ ๋น„๊ต๊ฐ€ ์˜ต์…˜์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” (๋‘ ๋ฒˆ์งธ๋กœ) --compare-on-etag์— ํˆฌํ‘œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•œ ์„œ๋ฒ„์—์„œ S3์œผ๋กœ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋กœ์ปฌ MD5 ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ์ €์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹คํžˆ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ๋‚ด ๋กœ์ปฌ ์ €์žฅ์†Œ์™€ S3 ์ €์žฅ์†Œ๊ฐ€ ๋™์ผํ•œ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด์™€ ๊ฐ™์€ ์ƒํƒœ์— ์žˆ์Šต๋‹ˆ๊นŒ?

@์žฅ๊ณ ๋ธ” +1

์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ด๋Ÿฌํ•œ ํŒŒ์ผ์ด git repo์— ์žˆ๊ณ  ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋ฏ€๋กœ ์ˆ˜์ •๋œ ๋‚ ์งœ๋‚˜ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ ์˜ํ–ฅ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ md5 ์˜ต์…˜์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

git repo๋ฅผ ์ฒดํฌ์•„์›ƒํ•  ๋•Œ ํŒŒ์ผ ์ˆ˜์ • ๋‚ ์งœ๋Š” ํŒŒ์ผ์ด ์ž‘์„ฑ๋œ ๋‚ ์งœ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํŒŒ์ผ ๋ณ€๊ฒฝ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

foo="bar"

์—๊ฒŒ

foo="baz"

๋”ฐ๋ผ์„œ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@jamesls ๋ฉ€ํ‹ฐํŒŒํŠธ ์—…๋กœ๋“œ์— ๋Œ€ํ•œ md5๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ ์—์„œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ,
๋˜ํ•œ foo="bar"/foo="baz"๋กœ ์ž˜ ์„ค๋ช…๋œ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ์— S3 ๋ฒ„ํ‚ท์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ S3์—์„œ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ๋กœ ์ธํ•ด ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ํŒŒ์ผ์—์„œ ์—ฐ์‚ฐ์ž >=์˜ ๋ฌธ์ œ๊ฐ€ <=๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ๊ฐ€ ๋ช‡ ๋ฒˆ ์žˆ์—ˆ๊ณ  ์ด ๋ฒ„๊ทธ๋กœ ์ธํ•ด ๋™๊ธฐํ™” ๋ช…๋ น์ด ๊ทธ๋‹ค์ง€ ์•ˆ์ •์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ๋Š” ๊ฐ™์ง€๋งŒ ๋‚ด์šฉ์ด ๋‹ค๋ฅด๋ฏ€๋กœ ํŒŒ์ผ์„ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ์กฐ์–ธ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹จ์ง€ ๋‚ด ์œ ์Šค ์ผ€์ด์Šค๋ฅผ ๊ณต๊ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :)

๋…ธ๋“œ-ftpsync๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. AWS์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ์†”๋ฃจ์…˜์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ท€์ฐฎ์ง€๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. mtime.equals ๋น„๊ต๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ๋”๋Ÿฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์™€ ์›๊ฒฉ ํ˜ธ์ŠคํŠธ ์‚ฌ์ด์˜ ํด๋Ÿญ ์‹œ๊ฐ„์€ ๋น„๊ตํ•˜๊ธฐ ์ „์— ์ •๊ทœํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@ngbranitsky๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ' ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. node.js์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ์ผ์ด์ง€๋งŒ ํŒŒ์ด์ฌ์—์„œ๋Š” ๋น„ํŠธ AND๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆ์ง€๋ง‰ ๋ช‡ ๋น„ํŠธ๋ฅผ ์ž๋ฅด๋Š” ๊ฒƒ๋งŒํผ ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ถ€์ž‘์šฉ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ MDTM(์˜ˆ: FTP mtime) ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋„๋ก ๋กœ์ปฌ mtime์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด ์˜ต์…˜๋„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ FTP ์„œ๋ฒ„ ๊ตฌํ˜„์€ RFC์™€ ๊ฑฐ์˜ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฉฐ MDTM์„ ํฌํ•จํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด FTP๋ฅผ ํ†ตํ•œ ํŒŒ์ผ ๋™๊ธฐํ™”๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ชจ๋‘ ์™„์ „ํ•˜๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

AWS์—๋Š” ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์—์„œ mtime์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹๋„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋™๊ธฐํ™”์—์„œ mtime ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ํ•ด๋‹น ํŒŒ์ผ์„ ๋ณด๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋Œ€๋Ÿ‰ ์—…๋ฐ์ดํŠธ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ํŒŒ์ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”ํŠธ๋ฆญ์œผ๋กœ mtime์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

  1. ๋น„์šฉ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ตœ๊ณ ์˜ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ API ํ˜ธ์ถœ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น„์šฉ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค(์˜ˆ: ๊ธˆ์ „์  ๋น„์šฉ). MD5๋Š” ํŒŒ์ผ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์—๋งŒ ํ•„์š”ํ•˜์ง€๋งŒ ์ž‘์€ ํŒŒ์ผ ๋ฐ/๋˜๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ํŒŒ์ผ์„ ๋งŽ์ด ์ €์žฅํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ์—ฐ์ฝ” ์ตœ๊ณ ์˜ ์„ ํƒ์ด์ง€๋งŒ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์žˆ์–ด ๊ฐ€์žฅ ํฐ ์–ด๋ ค์›€์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ ํƒ์  ๋™์ž‘์„ ๋ณด๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ ์•„๋‹ˆ์˜ค์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. OP์˜ 4๋Š” ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. etag์˜ ๋กœ์ปฌ ์บ์‹œ๋Š” ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์œ ์ง€๋˜๋ฉฐ ์„ ํƒ์ ์œผ๋กœ ๋ฒ„ํ‚ท์˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋Œ€์—ญ ์™ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋กœ์ปฌ->์„œ๋ฒ„๋ฅผ ๋™๊ธฐํ™”ํ•  ๋•Œ ์บ์‹œ DB์— ๋Œ€ํ•œ mtime/size ๋น„๊ต๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํŒจ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ํŒŒ์ผ์˜ ์ž ์žฌ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. (์ด๋Š” fstat์— ๋น„ํ•ด ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” md5๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.)
  3. ์ž ์žฌ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋œ ์„ธํŠธ์˜ ๊ฒฝ์šฐ md5->etag๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์—…๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์บ์‹œ DB๋Š” ๋กœ์ปฌ ํŒŒ์ผ์—์„œ md5๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์›น ๋งต ํƒ€์ผ์„ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํƒ€์ผ์˜ 1% ๋ฏธ๋งŒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์ผ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋Š” ์†Œ์Šค ๋ฐ์ดํ„ฐ์—์„œ ์‚ญ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํƒ€์ผ์˜ ๊ณต๊ฐ„ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ „์ฒด ๋งต ํƒ€์ผ ์„ธํŠธ๋ฅผ ์žฌ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๊ด€๋ จ๋œ ์—„์ฒญ๋‚œ ์–‘์ž…๋‹ˆ๋‹ค. ํฐ ๋ฉ€ํ‹ฐํŒŒํŠธ ์—…๋กœ๋“œ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋งŽ์€ ๊ฐœ๋ณ„ ์ž‘์€ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜? ํ˜„์žฌ ์•ฝ 2m๊ฐ€ ์žˆ์ง€๋งŒ ํ›จ์”ฌ ๋” ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ™•๋Œ€/์ถ•์†Œ ์ˆ˜์ค€ 16์—์„œ ์„ธ๊ณ„์—๋Š” 1 << 16 x 1 << 16 ๋˜๋Š” 65536 x 65536 ํƒ€์ผ ๋˜๋Š” ~4b๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ผ๋ฐ˜์ ์œผ๋กœ aws-cli์™€ ๋™๊ธฐํ™”ํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    1. ์ „์ฒด์ ์œผ๋กœ ๊ฐ€์žฅ ๋น ๋ฆ…๋‹ˆ๋‹ค.

    2. ์•„์•„, ๋งŽ์€ ๋ถˆํ•„์š”ํ•œ ์—…๋กœ๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  2. mtimes ๋Œ€์‹  md5(etag)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” s3cmd์™€ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„:

    1. ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๋กœ์ปฌ ํŒŒ์ผ์— ๋Œ€ํ•ด ํ•ญ์ƒ md5๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ, ์ด๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  IOPS๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

    2. ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์šด๋“œ์ด๋ฉฐ ํ•ญ์ƒ ๋Š๋ฆฌ์ง€๋งŒ ๋งŽ์€ ๊ฐœ๋ณ„ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค๋ฅธ S3 ์ง€์—ญ์— ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ธด ๊ฒฝ์šฐ์— ํŠนํžˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ๊ฑท๊ณ , ๋กœ์ปฌ sqlite3 ์บ์‹œ DB๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ์ž ์žฌ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋œ ์„ค์ •/์—…๋กœ๋“œ ๋Œ€๊ธฐ์—ด์„ ๊ตฌ์ถ•ํ•˜๋Š” C ์ฝ”๋“œ๋ฅผ ํฐ ์–ด๋ ค์›€ ์—†์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„, ์ €๋Š” ํŒŒ์ด์ฌ ๊ฒฝํ—˜์ด ์—†์œผ๋ฉฐ ์ด๊ฒƒ์„ ์„ ํƒ์  ๋™๊ธฐํ™” ๋™์ž‘์— ๋Œ€ํ•œ ํ’€ ์š”์ฒญ์œผ๋กœ ์ œ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

"๋งŽ์€ ์ž‘์€ ํŒŒ์ผ, ๋Œ€์—ญ ์™ธ ๋ณ€๊ฒฝ ์—†์Œ ๋ณด์žฅ, ๋กœ์ปฌ-> ์„œ๋ฒ„ ์ „์šฉ" ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ผ๋ฐ˜์ ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์†Œ์Šค์˜ ์ตœ์‹  ํŒŒ์ผ์ด ๋Œ€์ƒ์˜ ์ด์ „ ํŒŒ์ผ์„ ๋Œ€์ฒดํ•˜๋”๋ผ๋„ ๋™๊ธฐํ™”๊ฐ€ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„์˜ ์ฐจ์ด ๋ฅผ ์—…๋ฐ์ดํŠธ์˜ ์ด์œ ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์ง๊ด€์ ์ด์ง€ ์•Š๊ณ  ์œ„ํ—˜ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ด ์ด์ƒํ•œ ๋™์ž‘์€ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ #404์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ๊ฐ€ํ•˜๋Š” ๋น„ ์ž์ฒด ๋ฌธ์„œํ™” ์˜ต์…˜ ๋Œ€์‹  ๋‹จ์ผ ์ž์ฒด ๋ฌธ์„œํ™” --sync-if ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? (์˜ˆ: --size-only , --exact-timestamps . ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๋™์‹œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌธ์„œ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๊ณ /์ด๊ฒƒ์„ ์•Œ์•„๋‚ด๋ ค๊ณ  ์‹œ๋„ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?).

--sync-if ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ต์…˜ ๋ชฉ๋ก์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

--sync-if newer-timestamp,different-md5,different-timestamp,different-size,deleted,...

์‚ฌ์šฉ์ž๋Š” ํ•˜๋‚˜ ์ด์ƒ(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก)์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํŒŒ์ผ์ด ๊ธฐ์ค€ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ถฉ์กฑํ•˜๋ฉด ๋Œ€์ƒ์—์„œ ์—…๋ฐ์ดํŠธ(์—…๋กœ๋“œ/์‚ญ์ œ)๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠนํžˆ ๋ฌธ์„œ์—์„œ ๊ธฐ๋ณธ ๋™์ž‘์ด --sync-if different-timestamp,different-size ๋ผ๊ณ  ์–ธ๊ธ‰ํ•œ ๊ฒฝ์šฐ ๋™์ž‘์„ ํฌ๊ฒŒ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ฝ์–ด๋ณด๋ฉด ์ด ๋™๊ธฐํ™” ๋™์ž‘์ด ์•„์ง ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ ๋นŒ๋“œ๋ฅผ ์„œ๋ฒ„์˜ ๋นŒ๋“œ์™€ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด rsync -avz ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” aws s3 sync ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ํฐ ํŒŒ์ผ(๋™์˜์ƒ์ธ ๋„์›€๋ง ํŒŒ์ผ)์ด ํ•˜๋‚˜ ์žˆ๊ณ  ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ์ƒˆ ํŒŒ์ผ์—์„œ ๋ชจ๋“  ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค๋ฒˆ ๋ชจ๋“  ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ  ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋Š๋ ค์กŒ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด --size-only ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„, ์ด๊ฒƒ์€ ์ตœ๊ทผ์— ์ €๋ฅผ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ–ˆ์œผ๋ฉฐ ๋นŒ๋“œ ๋‹จ๊ณ„์—๋Š” service-worker.js ํŒŒ์ผ์— ํŒŒ์ผ ๋ชฉ๋ก์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ sw๊ฐ€ ์บ์‹œํ•  ํ•ญ๋ชฉ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ƒˆ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์ด์ „ ํŒŒ์ผ ์ด๋ฆ„์˜ ๊ธธ์ด๊ฐ€ ๋™์ผํ•˜์—ฌ service-worker.js ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ณ  ์ด์ „ ํŒŒ์ผ ์ด๋ฆ„์— ๊ณ„์† 404๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๋ฐ ๊ฝค ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ(์˜ˆ: rsync)์—์„œ ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, tbh, ๋‚˜๋Š” ์•„๋งˆ๋„ S3์—์„œ ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‹ค์†Œ ๋ฌด์ง€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ตœ๊ทผ์— ์ด๊ฒƒ์— ์กฐ๊ธˆ ์˜์•„ํ•ดํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์žˆ์ง€๋งŒ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฑ„ํƒํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์—†๋Š” ์ข…์†์„ฑ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

etag ๋™๊ธฐํ™” ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹คํŒจํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ €์—๊ฒŒ๋Š” ๋งค์šฐ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”!

AWS CLI์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์œ„ํ•ด UserVoice ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ณผ์ •์˜ ์ผํ™˜์œผ๋กœ GitHub์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋กœ ๋Œ€ํ™”๋ฅผ ํฌ์„ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ€์žฅ ๊ด€์‹ฌ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋” ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ง€์›์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ UserVoice ์ž…๋ฌธ์„œ(์•„์ง ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ): ์•„์ด๋””์–ด๊ฐ€ ๊ฒŒ์‹œ๋œ ํ›„ ์‚ฌ๋žŒ๋“ค์€ ์•„์ด๋””์–ด์— ํˆฌํ‘œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ œํ’ˆ ํŒ€์€ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์ œ์•ˆ์— ์ง์ ‘ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

GitHub์—์„œ ๊ธฐ์กด ๊ธฐ๋Šฅ ์š”์ฒญ์„ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”!

๊ทธ๋ฆฌ๊ณ  ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด ๋ฌธ์ œ๋Š” ํ›„๋Œ€๋ฅผ ์œ„ํ•ด GitHub์— ๊ณ„์† ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์„ UserVoice๋กœ ํ…์ŠคํŠธ ์ „์šฉ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— GitHub ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์˜๊ฒฌ๊ณผ ํ† ๋ก ์„ ๊ณ„์† ์—ผ๋‘์— ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

GitHub๋Š” ๋ฒ„๊ทธ ๋ณด๊ณ  ์ฑ„๋„๋กœ ๋‚จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ํ•œ ๋ฒˆ, ์ด ๋ฌธ์ œ๋Š” ์ด์ œ https://aws.uservoice.com/forums/598381-aws-command-line-interface ์—์„œ ์ œ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-AWS SDK ๋ฐ ๋„๊ตฌ ํŒ€

์ด ํ•ญ๋ชฉ์€ ํŠนํžˆ UserVoice( https://aws.uservoice.com/forums/598381-aws-command-line-interface/suggestions/33168808-aws-s3-sync-issues) ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

github ๋ฌธ์ œ์—์„œ ๋ฒ—์–ด๋‚˜๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ? ๊ทธ๊ฑด ์‹ค์ˆ˜์ธ๋“ฏ...

๋™์˜. Microsoft๊ฐ€ ๋ฌธ์ œ์˜ ์ค‘์š”์„ฑ/์˜ํ–ฅ์„ ํŒ๋‹จํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ์ƒ๋‹นํžˆ ์งœ์ฆ๋‚ฉ๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ GitHub ๋ฌธ์ œ์— ๊ธฐ๋Šฅ ์š”์ฒญ์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฐฑ์—…์„ ๋ฒ”ํ”„!

์ •์ƒ์œผ๋กœ!

md5์˜ ๋น„๊ต๋Š” ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์—…๋กœ๋“œ ๋˜๋Š” ๋‹ค์šด๋กœ๋“œ ์‹œ md5๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ง๋ถ™์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ ์ž์‹ ์˜ db์— ์ €์žฅ๋  ์ˆ˜ ์žˆ๊ณ  ์š”์ฒญ์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•ด ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jamesls ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์˜๊ฒฌ์„ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
https://github.com/aws/aws-cli/issues/4460

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰