...

AWS S3 CLI ๋ช ๋ น์ด
์ง๊ธ๊น์ง S3์ ๋ฒํท์ ์์ฑํ๊ณ ํ์ผ์ ์ ์ฅํ๋ ค๋ฉด ์น๋ธ๋ผ์ฐ์ ์ฝ์ ํ๋ฉด์ ๊ฐ์ ์ผ์ผํ ํ๋ฉด์ ๋๋ฌ ์ ์ฉํด์ผ ํ๋ค.
๊ธฐ๋ฅ์์๋ ๋ฌธ์ ๋ ์์ง๋ง ์น์๋น์ค ์์ฒด๊ฐ ์กฐ๊ธ ๋๋ฆฌ๋ค๋ ์ ์ด ์ฌ์ฉ์ ๋ถํธํจ์ ๋๋ผ๊ฒ ๋๋ค. ๊ฑฐ๊ธฐ๋ค ๋ธ๋ผ์ฐ์ ํ ํ์ด์ง์ ํ์๋๋ ํ์ผ ๊ฐฏ์ ์ญ์ ํ๊ณ๊ฐ ์๋ค.
ํ์ง๋ง AWS CLI๋ฅผ ์ด์ฉํ๋ฉด ๊ฐํธํ๊ฒ S3 ๋ฒํท์ ์ ์ดํ๊ณ S3 ์ค๋ธ์ ํธ์ ์ ๊ทผํ ์ ์์ด ํ์ฉ์ฑ์ด ๋์์ง๋ค.
์๋ฅผ๋ค์ด 10๋ง ๋จ์์ ํ์ผ์ ํ ๋ฒ์ ์ด๋ํ๊ฑฐ๋ ์ญ์ ํ๊ณ ์ถ์ ๋ ์ปค๋งจ๋๋ฅผ ์ด์ฉํด ํจํด์ ์ด์ฉํด ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
AWS CLI ๋?
AWS Command Line Interface(AWS CLI)๋ ๋ช ๋ น์ค ์ ธ์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ AWS ์๋น์ค์ ์ํธ ์์ฉํ ์ ์๋ ์คํ ์์ค ๋๊ตฌ. ์ต์ํ์ ๊ตฌ์ฑ์ผ๋ก AWS CLI๋ฅผ ์ฌ์ฉํ๋ฉด ํฐ๋ฏธ๋ ํ๋ก๊ทธ๋จ์ ์๋ ๋ช ๋ น ํ๋กฌํํธ์์ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ AWS Management Console์์ ์ ๊ณตํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ช ๋ น์ ์คํํ ์ ์๋ค.
[AWS] ๐ AWS CLI ์ค์น & ๋ฑ๋ก ๋ฐฉ๋ฒ - ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ค๋ช
AWS CLI (Command Line) AWS Command Line Interface๋ ์ ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ์ฌ AWS ์๋น์ค์ ์ํธ ์์ฉํ ์ ์๋ ๋๊ตฌ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ๋ธ๋ผ์ฐ์ ๋ก ์๋ง์กด ์น ์๋น์ค ํํ์ด์ง(์ฝ์ ํ)์ ๊ฐ์ ์๋น์ค๋ฅผ ์ด์ฉํ ๊ฒ
inpa.tistory.com
S3 ๋ฒํท ์ปค๋งจ๋
๋ฒํท ์์ฑ (mb)
$ aws s3 mb s3://๋ฒํท๋ช
$ aws s3 mb s3://test-bucket-inpa
make_bucket: test-bucket-inpa

๋ง์ผ Amazon S3์ ๋ฒํท๋ช ์ด ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ ๊ฑฐ๋ถ๋ฅผ ๋นํ ์ ์๋ค.
๋ฒํท ๋ชฉ๋ก ์กฐํ (ls)
$ aws s3 ls
2022-06-20 20:23:06 inpa-s3-cli
2022-06-23 13:54:49 test-bucket-inpa
๋ฒํท ์ ๊ฑฐ (rb)
$ aws s3 rb s3://๋ฒํท๋ช
๋ง์ผ S3 ๋ฒํท ์์ ๋ด์ฉ๋ฌผ์ด ๋น์ด ์์ง ์์ ๊ฒฝ์ฐ ๋ฒํท ์ ๊ฑฐ๊ฐ ๋์ง ์๋๋ค.
์ด๋ด ๊ฒฝ์ฐ --force ์ต์
์ ์ฃผ๋ฉด, S3 ๋ฒํท ๋ด์ ๋ชจ๋ ํ์ผ์ ๊ฐ์ ๋ก ์ญ์ ํ๊ณ ๊ทธ ๋ค์ S3 ๋ฒํท์ ์ ๊ฑฐํ๊ฒ ๋๋ค.
$ aws s3 rb s3://my-fruits --force
delete: s3://my-fruits/apple.txt
delete: s3://my-fruits/cherry.txt
delete: s3://my-fruits/favorites/melon.txt
remove_bucket: my-fruits
S3 ํ์ผ ์ปค๋งจ๋
ํ์ผ ๋ชฉ๋ก ์กฐํ (ls)
aws s3 ls ์ปค๋งจ๋์ ๋ฒํท๋ช
์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ฉด ๋ฒํท ๋ด์ ํ์ผ ๋ชฉ๋ก์ ๋ง์น ๋ก์ปฌ ํ์ผ ์์คํ
์ฒ๋ผ ์กฐํํ ์ ์๋ค.
$ aws s3 ls s3://my-fruits
2018-06-02 10:51:55 6 apple.txt
2018-06-02 10:57:19 7 banana.txt
ํ์ผ ์ด๋ (mv)
$ aws s3 mv test.tar s3://test-bucket-inpa
move: ./test.tar to s3://test-bucket-inpa/test.tar
$ aws s3 ls test-bucket-inpa
2022-06-23 14:08:05 20480 test.tar
ํ์ผ ์ญ์ (rm)
๋ฒํท๋ช /ํค๋ช ์ ๋ช ์ํ์ฌ ์ญ์ ํ ์ ์๋ค.
$ aws s3 rm s3://my-fruits/banana.txt
delete: s3://my-fruits/banana.txt
๋ก์ปฌ โ S3 ํ์ผ ๋ณต์ฌ (cp)
๋ก์ปฌ ํ์ผ์ S3 ๋ฒํท์ ๋ณต์ฌํ๋ ๊ฒ์ ๊ณง S3์ ์ ๋ก๋ ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
# ๋ฒํท์ ๊ทธ๋ฅ ํ์ผ ์
๋ก๋
$ aws s3 cp bar.txt s3://test-bucket-inpa
upload: ./bar.txt to s3://test-bucket-inpa/bar.txt
# ๋ฒํท์ ํ์ผ๋ช
์ ๋ณ๊ฒฝํ๊ณ ์
๋ก๋
$ aws s3 cp bar.txt s3://test-bucket-inpa/change_name_file.txt
upload: ./bar.txt to s3://test-bucket-inpa/change_name_file.txt
# ๋ฒํท์ folder1ํด๋ ์์ ํ์ผ ์
๋ก๋
$ aws s3 cp bar.txt s3://test-bucket-inpa/folder1/
upload: ./bar.txt to s3://test-bucket-inpa/folder1/bar.txt

S3 โ ๋ก์ปฌ ํ์ผ ๋ณต์ฌ (cp)
์์์ ๋ก์ปฌ์์ ๋ฒํท์ผ๋ก ํ์ผ์ ๋ณต์ฌํ๋ฉด, ๊ณง S3์ ์ ๋ก๋ ๋์์ด ๋์๋ค.
์ด๋ฒ์ ๋ฒํท์์ ๋ก์ปฌ๋ก ํ์ผ์ ๋ณต์ฌํ๋ฉด, ๊ณง S3์ ํ์ผ์ ๋ค์ด ๋ฐ๋ ๋์์ด ๋๋ค.
$ aws s3 cp s3://๋ฒํท๋ช
/๊ฐ์ฒด๋ช
<์ ์ฅํ ๊ฒฝ๋ก>
# ๋ฒํท์ bar.txt๋ฅผ ๋ก์ปฌ์ ํ์ฌ dir์ ๋ค์ด
$ aws s3 cp s3://test-bucket-inpa/bar.txt ./
download: s3://test-bucket-inpa/bar.txt to ./bar.txt
# ๋ฒํท์ bar.txt๋ฅผ ๋ก์ปฌ์ bar2.txt๋ก ํ์ผ๋ช
๋ณ๊ฒฝํ๊ณ ๋ค์ด
$ aws s3 cp s3://test-bucket-inpa/bar.txt ./bar2.txt
download: s3://test-bucket-inpa/bar.txt to ./bar2.txt
S3 โ S3 ํ์ผ ๋ณต์ฌ (cp)
# ๋ฒํท์ 123123.pdf ํ์ผ์ folder1/ ์ ๋ณต์ฌ
$ aws s3 cp s3://test-bucket-inpa/123123.pdf s3://test-bucket-inpa/folder1/
copy: s3://test-bucket-inpa/123123.pdf to s3://test-bucket-inpa/folder1/123123.pdf
๋๋ ํฐ๋ฆฌ ๋๊ธฐํ (sync)
๋ง์ผ ๋๋ ํ ๋ฆฌ์ ์๋ ํ์ผ ์ ๋ถ๋ฅผ S3์ ์ฎ๊ธฐ๊ณ ์ถ์ ๋ ์ด๋ป๊ฒ ํ ๊น?
ํ์ผ์ ์ผ์ผํ ์ปค๋งจ๋๋ฅผ ์ฎ๊ฒจ์ฃผ๋ ๊ฒ๋ณด๋ค ๋๊ธฐํ ๊ธฐ๋ฅ์ ์ด์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ์ฎ๊ธธ์ ์๋ค.
์ฌ๊ธฐ์ ๋๊ธฐํ๋, ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ์ํ์ ์๋๋ฐฉ์ด ๊ฐ์ง๊ณ ์๋ ์ํ๋ฅผ ์ผ์น์ํจ๋ค๋ ๊ฐ๋ ์ผ๋ก ์ดํดํ๋ฉด ๋๋ค.
aws s3 sync ์ปค๋งจ๋๋ฅผ ์ด์ฉํ์ฌ ๋ก์ปฌ ๋๋ ํฐ๋ฆฌ์ S3 ๋ฒํท์ ๋๊ธฐํ ์ํฌ ์ ์๋ค.
$ aws s3 sync <๋๊ธฐํ ์ฃผ์ฒด> <๋๊ธฐํ ๋์>
# ๋ฒํท์ ๋ด์ฉ๋ฌผ์ ๋ก์ปฌ ๋๋ ํ ๋ฆฌ์ ๋๊ธฐํ โ ๋ก์ปฌ๋ก ๋ค์ด๋ก๋
aws s3 sync s3://bucket-name/ ./
# ๋ก์ปฌ ๋๋ ํ ๋ฆฌ ๋ด์ฉ๋ฌผ์ ๋ฒํท์ ๋๊ธฐํ โ S3์ ์
๋ก๋
aws s3 sync ./ s3://bucket-name/
๋ค๋ง ๋๊ธฐํ๋ ํ์ผ์ ์ ๋ก๋/๋ค์ด๋ก๋ ํ ๋ ๋์๋๊ณ , ํ์ผ ์ญ์ ๋์์ ํ์ง์๋๋ค. (๋น ๋ฒํท๊ณผ ๋๊ธฐํ๋๋ ๋ด ๋ก์ปฌ ํ์ผ๋ค์ด ์ญ์ ๋์ง ์๋๋ค)
S3 ์ปค๋งจ๋ ์ต์
์์ฃผ ์ฌ์ฉํ๋ cli ๋ช ๋ น์ด ์ต์ ์ --force ๊ฐ์ , --exclude ์ ์ธ, --include ํฌํจ ๋ฑ์ด ์๋ค.
ํ์ ๋๋ ํ ๋ฆฌ ํฌํจ (--recursive)
--recursive ์ต์ ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ปค๋งจ๋ ์ ์ฉ ๋ฒ์๊ฐ ํ์ ๋๋ ํฐ๋ฆฌ๊น์ง ์ ์ฉ๋๋ค.
์๋ฅผ ๋ค์ด aws s3 rm ์ปค๋งจ๋๋ฅผ --recursive ์ต์ ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ํ์ ๋๋ ํฐ๋ฆฌ๊น์ง ์ ์ฉ๋์ ๋ชจ๋ ํ์ผ๊ณผ ๋๋ ํ ๋ฆฌ๊ฐ ์ญ์ ๋๋ค.
๋ฐ๋๋ก aws s3 cp ์ปค๋งจ๋๋ฅผ --recursive ์ต์ ๊ณผ ํจ๊ผ ์ฌ์ฉํ๋ฉด Bucket์ ์๋ ๋ชจ๋ ํ์ผ์ด ๋ณต์ฌ๋๋ค.
$ aws s3 cp . s3://my-fruits --recursive
upload: ./cherry.txt to s3://my-fruits/cherry.txt
upload: ./apple.txt to s3://my-fruits/apple.txt
upload: favorites/melon.txt to s3://my-fruits/favorites/melon.txt # favoritesํด๋ ์์์๋ ํ์ผ ๊น์ง ๋ณต์ฌ
$ aws s3 rm s3://my-fruits/ --recursive
delete: s3://my-fruits/apple.txt
delete: s3://my-fruits/cherry.txt
delete: s3://my-fruits/favorites/melon.txt # ํ์ ๋๋ ํ ๋ฆฌ ํ์ผ๊น์ง ๋ชจ๋ ์ญ์
์ฐธ๊ณ ๋ก ์์์ ๋ฐฐ์ด aws s3 sync ์ปค๋งจ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ ๋๋ ํฐ๋ฆฌ๊น์ง ๋ชจ๋ ๋๊ธฐํํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ณ๋๋ก --recursive ์ต์ ์ด ์๋จนํ๋ค.
ํ์ผ ์ ์ธ (--exclude)
--exclude ์ต์ ์ ๋ช ๋ น์์ ๊ฐ์ฒด๋ง ์ ์ธํ๋๋ก ๊ท์น์ ์ค์ ํ๊ณ ์ต์ ์ ์ง์ ๋ ์์๋๋ก ์ ์ฉ๋๋ค.
# ๋ชจ๋ .txt ํ์ผ์ ์ ์ธํ๊ณ ๋๋จธ์ง ํ์ผ์ copy
$ aws s3 cp . s3://my-bucket/path --exclude "*.txt"
# MyFile1.txt, MyFile2.rtf, MyFile88.txt ๋ฑ์ ์ ์ธํ๊ณ copy
$ aws s3 cp . s3://my-bucket/path --exclude "*.txt" --include "MyFile*.txt"
# ๋๋ ํฐ๋ฆฌ ๋ด ํ์ผ์ ์ญ์ ํ๋ .sh๋ก ๋๋๋ ํ์ผ์ ๋จ๊ฒจ๋๊ธฐ ์ํด, --exclude ์ต์
์ผ๋ก *.sh ํจํด์ ์ง์ .
$ aws s3 rm --recursive --exclude "*.sh" s3://test/rm_test/
S3 ์์ผ๋์นด๋ ํจํด
์์ผ๋์นด๋(wildcard character)๋ ์ปดํจํฐ์์ ํน์ ๋ช ๋ น์ด๋ก ๋ช ๋ น์ ๋ด๋ฆด ๋, ์ฌ๋ฌ ํ์ผ์ ํ๊บผ๋ฒ์ ์ง์ ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ธฐํธ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ฃผ๋ก ํน์ ํ ํจํด์ด ์๋ ๋ฌธ์์ด ํน์ ํ์ผ์ ์ฐพ๊ฑฐ๋, ๊ธด ์ด๋ฆ์ ์๋ตํ ๋ ์ฐ์ธ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก aws cli๋ ์์ผ๋์นด๋ ํจํด์ ์ง์ํ์ง ์๋๋ค.
์๋ก,aws s3 rm abc*์ปค๋งจ๋๋ฅผ ์คํํ๋ฉด abc1, abc2, abc3, ... ํ์ผ์ด ์ง์์ง์ง ์๋๊ฒ ์๋๋ผ abc* ๋ผ๋ ํ์ผ์ด ์ง์์ง๊ฒ ๋๋ค.
๋ค๋ง, --include์ --exclude ์ต์ ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์์ผ๋์นด๋ ํจํด์ ์ง์ํ๋ค.
์ --exclude ์ต์ ์ ํ ๋นํ ๋ฌธ์์ด์ ๋ณด๋ฉด, "*.txt" ์ ๊ฐ์ด ์์ผ๋์นด๋ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๊ฑธ ๋ณผ ์ ์๋ค.
ํ์ผ ํฌํจ (--include)
--include ์ต์ ์ ๋ช ๋ น์ ์ง์ ๋ ๊ฐ์ฒด๋ง ํฌํจํ๋๋ก ๊ท์น์ ์ค์ ํ๋ฉฐ ์ต์ ์ ์ง์ ๋ ์์๋๋ก ์ ์ฉ๋๋ค
// ๋ชจ๋ .txt ํ์์ ํ์ผ์ ํฌํจํ์ฌ copy
$ aws s3 cp . s3://my-bucket/path --include "*.txt"
# ๋ชจ๋ .txt ํ์์ ํ์ผ์ ํฌํจ, ๊ทธ๋ฌ๋ MyFile๋ก ์์ํ๋ ํ์ผ๋ช
์ ์ ์ธ, ๊ทธ๋ฐ๋ฐ MyFile1.txt๋ง์ ์ ์ธํ์ง์๊ณ ํฌํจํด์ copy
$ aws s3 cp . s3://my-bucket/path --include "*.txt" --exclude "MyFile*.txt" --include "MyFile1.txt"
# .log ํ์ผ๋ง ์ ์ธํ ๋ชจ๋ ํ์ผ๊ณผ ํ์ ๋๋ ํ ๋ฆฌ ํ์ผ์ด ๋ก์ปฌ์ ๋ณต์ฌ
$ aws s3 cp s3://BucketName/ ./ --recursive --exclude "*.log" --include "*"
# ํน์ ๋ ์ง์ nginx ๋ก๊ทธ๋ฅผ ๋ค์ด๋ก๋
$ aws s3 cp s3://BucketName/nginx/ . --recursive --exclude "*" --include "access*2016-10-23*"
# 'imgae-์ซ์' ๋ก ์์๋๋ ๋ณต์ ํ์ผ๋ง ์
๋ก๋
$ aws s3 cp /Images s3://test-s3/cp-test/ --recursive --exclude "*" --include "image-*"
upload: ./image-1.jpg to s3://test-s3-squirrel/cp-test/image-1.jpg
upload: ./image-4.jpg to s3://test-s3-squirrel/cp-test/image-4.jpg
upload: ./image-2.jpg to s3://test-s3-squirrel/cp-test/image-2.jpg
upload: ./image-3.png to s3://test-s3-squirrel/cp-test/image-3.png
์ปค๋งจ๋ ํ ์คํธ (--dryrun)
๋ช ๋ น์ด ์กฐํฉ์ด ์ ๋งค๋ชจํธ ํ์ฌ, ์ค์ ๋ก ์ํ๊ฒฐ๊ณผ๋ ์ป์ง๋ง๊ณ ๋์๋ง ๋ณด๊ณ ์ถ๋ค๋ฉด, --dryrun ์ต์ ์ ์ด์ฉํด ๋์ ์ํ๋ง ํ๊ณ ์ค์ ๋ก ์ ์ฉ์ด ๋์ง ์๊ฒ ํ ์ ์๋ค.
์ค์๋ก ํ์ผ์ ์ญ์ ํด ๋๊ฐํด์ง๋ ์ผ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ช ๋ น์ ์ฌ์ ์ ํ ์คํธํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
# ๊ฒฐ๊ณผ ์ถ๋ ฅ ์, dryrun์์ ํ์ํ์ฌ ์ค์ ๋ก ์ํ๋์ง ์์์์ ์๋ ค์ค๋ค.
$ aws s3 rm s3://test-bucket-inpa/folder1/ --dryrun
(dryrun) delete: s3://test-bucket-inpa/folder1/
S3 ๊ถํ ์ปค๋งจ๋
ํ์ผ์ ๊ถํ ์ฃผ๊ธฐ (--acl)
์ฝ์ ๋ธ๋ผ์ฐ์ ์์ ์ผ์ผํ ๊ฐ์ฒด๋ฅผ ํด๋ฆญํ์ฌ ๊ถํ์ ์ค์ ํ์ง๋ง๊ณ ๋ช ๋ น์ด๋ก ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํด๋ณด์.
Amazon S3๋ ๋ฏธ๋ฆฌ ์ค๋น๋ ACL์ด๋ผ๊ณ ํ๋ ๋ฏธ๋ฆฌ ์ ์๋ ๊ถํ ๋ถ์ฌ ์ธํธ๋ฅผ ์ง์ํ๋ค.
์ด๋ฅผ ์ด์ฉํด ๊ฐ์ฒด์ ๊ถํ์ ์ค์ ํด๋ณด์.
$ aws s3 sync [์ด์ s3๋ฒํท ์ฃผ์] [์ด์ ํ s3 ๋ฒํท ์ฃผ์] --acl public-read
ACL ์ต์ | ์ค๋ช |
private | ์๋ฌด๋ ์ก์ธ์ค ํ ์ ์์ (default) |
public-read | READ ์ก์ธ์ค |
public-read-write | READ, WRITE ์ก์ธ์ค |
$ aws s3 cp pass.copy s3://test-bucket-inpa --acl public-read
upload: ./pass.copy to s3://test-bucket-inpa/pass.copy
์ด๋ ๊ฒ ๋ช ๋ น์ด๋ฅผ ์น ๊ฒฝ์ฐ ์ด์ ์ฃผ์์์ ์ดํ ์ฃผ์๋ก ๋ณต์ฌ๋ฅผ ํ๊ฒ๋๊ณ public-read ๊ถํ์ ์ฃผ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด URL๋ก ์ ์ํด๋ณด๋ฉด ๊ถํ ๊ฒฝ๊ณ ์์ด ๋ฐ๋ก ์ ์๋จ์ ํ์ธ ํ ์ ์๋ค.
ํ์ผ์ ๊ถํ ์ฃผ๊ธฐ (--grants)
๊ฐ์ฒด์ ๋ํ ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ --grants ์ต์ ๋ ์กด์ฌํ๋ค.
--grants Permission=Grantee_Type=Grantee_ID
- Permission : ๊ถํ ์ง์ (read, readacl, writeacl, full)
- Grantee_Type : ํผ๋ถ์ฌ์๋ฅผ ์๋ณํ๋ ๋ฐฉ๋ฒ์ ์ง์ (uri, emailaddress, id)
- Grantee_ID : Grantee_Type์ ๋ฐ๋ผ ํผ๋ถ์ฌ์๋ฅผ ์ง์ (uri, emailaddress, id)
# ๋ชจ๋ ์ฌ๋์ด ์ฝ์์ ์๊ฒ ๊ถํ์ ๋ถ์ฌํ๊ณ ์
๋ก๋
aws s3 cp filename s3://bucket/folder/filename --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers

S3 ์ปค๋งจ๋ ์์ฉํ๊ธฐ
S3 ํน์ ํ์ผ์ ์ป์ด์ ๋ค์ด๋ฐ๊ธฐ (๋ฃจํ๋ฌธ)
# ๋ฒํท ๋ชฉ๋ก์ ๊ฐ์ ธ์์ ๋ ์ง๋ณ๋ก sortํ๊ณ
# awk ๋ช
๋ น์ด๋ก, ์ฒซ๋ฒ์งธ ํ๋($1)๊ฐ 2021-01-20 ๋ ์ง ์ด์์ผ๊ฒฝ์ฐ and ๋ค๋ฒ์งธ ํ๋($4)๊ฐ ๊ณต๋ฐฑ์ด ์๋๊ฒฝ์ฐ,
# $4๋ง ์ถ๋ ฅ (ํ์ผ๋ช
์ถ๋ ค)
for f in $(aws s3 ls s3://bucket-name/ | sort | awk '$1 > "2021-01-20" && $4 > "" {print $4}'); do
aws s3 cp s3://bucat-name/"$f" ./ # ๊ทธ๋ฆฌ๊ณ ๊ทธ ํ์ผ๋ช
์ผ๋ก ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๋ค์ด
done;


AWS S3 CLI ๊ณ ๊ธ ๋ช ๋ น์ด
aws s3 vs aws s3api
์์์ aws s3 ์ปค๋งจ๋๋ฅผ ํตํด Amazon S3๋ฅผ ํ์ผ ์์คํ
์ฒ๋ผ ์ ๊ทผํ ์ ์์๋ค.
๋ฐ๋ฉด์ aws s3api ์ปค๋งจ๋๋ฅผ ํตํด์๋ ์ข ๋ Restful API ์ฒ๋ผ ๋ฒํท์ ์ ๊ทผํ ์ ์๋ค.
์ฆ, aws s3์ s3api ๋ช ๋ น์ด์ ์ฐจ์ด๋ s3์ ๋ช ๋ น์ด๋ฅผ ์ข ๋ ์ถ์ํํ์ฌ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ๋ ๋ง๋ ๊ฒ ์ ๋๋ก ์์๋๋ฉด ๋๋ค.
# aws s3 ๋ช
๋ น์ด
$ aws s3 ls s3://test-bucket/css/
2018-06-09 20:08:24 121200 bootstrap.min.css
2018-06-09 20:08:24 542194 bootstrap.min.css.map
# aws s3api ๋ช
๋ น์ด
$ aws s3api list-objects-v2 --bucket test-bucket --prefix css
{
"Contents": [
{
"Key": "css/bootstrap.min.css",
"LastModified": "2018-06-10T03:08:24.000Z",
"ETag": "\"ec3bb52a00e176a7181d454dffaea219\"",
"Size": 121200,
"StorageClass": "STANDARD",
"Owner": {
"DisplayName": "dale.seo",
"ID": "51dbe4e62e5471da8ee52476412bc9ad187d2a1c196ec9f937b3da7be3a18c70"
}
},
{
"Key": "css/bootstrap.min.css.map",
"LastModified": "2018-06-10T03:08:24.000Z",
"ETag": "\"35b79ebe0b7805c1c84524ad920faa33\"",
"Size": 542194,
"StorageClass": "STANDARD",
"Owner": {
"DisplayName": "dale.seo",
"ID": "51dbe4e62e5471da8ee52476412bc9ad187d2a1c196ec9f937b3da7be3a18c70"
}
}
]
}
s3api ์ปค๋งจ๋
# ๋ฒํท ์์ฑํ๊ธฐ
aws s3api create-bucket \
--bucket cloudaffaire-s3-select-demo \
--region ap-south-1 \
--create-bucket-configuration LocationConstraint=ap-south-1
# ๋ฒํท์ Region ํ์ธ
$ aws s3api get-bucket-location --bucket [๋ฒํท๋ช
]
# ๋ฒํท์ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ json์ผ๋ก ์กฐํ
$ aws s3api list-objects-v2 --bucket [๋ฒํท๋ช
]
# ๊ฐ์ฒด์ ๋ฉํ๋ฐ์ดํฐ ํ์ธ
$ aws s3api head-object --bucket [๋ฒํท๋ช
] -key [fileName]
# ๊ฐ์ฒด์ ํ๊ทธ ์กฐํ
$ aws s3api get-object-tagging --bucket [๋ฒํท๋ช
] --key [fileName]
# ํด๋น ๋ฒํท์ด ๋ฒ์ ๋์ ์ฌ์ฉํ๋์ง ์ฒดํฌ
$ aws s3api get-bucket-versioning --bucket [๋ฒํท๋ช
]
# ๋ฒํท์ ๋ฒ์ ๋๋ ๊ฐ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅ
$ aws s3api list-object-versions --bucket [๋ฒํท๋ช
]
# ํน์ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋
# [version id] : ์์ list-object-versions ๋ช
๋ น์ด๋ฅผ ํตํด ๊ฐ์ ธ์จ id
# [outfileName] : ๋ฐ์ ๊ฐ์ฒด๋ฅผ ์ด๋ค ์ด๋ฆ์ผ๋ก ์ ์ฅํ ์ง
$ aws s3api get-object --bucket [๋ฒํท๋ช
] --key [fileName] --version-id [version id] [outfileName]
S3 SELECT ์ปค๋งจ๋
S3 Select๋ SQL ๋ฌธ์ ๊ธฐ๋ฐ์ผ๋ก S3 ๊ฐ์ฒด์ ์ฝํ ์ธ ๋ฅผ ํํฐ๋งํ๋ ์ปค๋งจ๋์ด๋ค.
ํ๋ง๋๋ก S3์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ SQL๋ฌธ์ผ๋ก ์กฐํํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
์ด S3 Select ์์ฒญ์๋ ๋ฐ๊ธฐ ์ํ๋ ๋ฐ์ดํฐ ํฌ๋งท(JSON, CSV, or Apache Parquet)์ ์ง์ ํด์ผ ํ๋ค.
S3 SELECT VS AWS Athena
S3 Select๋ ์ค๊ณ๋ S3 ๊ธฐ๋ฅ์ค ํ๋์ด๋ค.
์ ์ฒด ๊ฐ์ฒด ๋์ (๋จ์ SQL ์์ ์ฌ์ฉํ์ฌ) ๊ฐ์ฒด์ ๋ฐ์ดํฐ ํ์ ์งํฉ์ ๊ฒ์ํ์ฌ ์๋ํ๋ค.
s3 select๋ s3 ๋ฒํท์์ ํ ๋ฒ์ ๋จ์ผ ๊ฐ์ฒด์ ๋ํด ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค.
๋ฐ๋ฉด Amazon Athena๋ ํ์ค SQL์ ์ฌ์ฉํ์ฌ S3์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋ถ์ํ ์ ์๋ ์๋ง์กด์ ์ฟผ๋ฆฌ ์๋น์ค ์ด๋ค.
Athena๋ ์๋ฒ๋ฆฌ์ค์ด๋ฏ๋ก ์ค์ ํ๊ฑฐ๋ ๊ด๋ฆฌํ ์ธํ๋ผ๊ฐ ์์ผ๋ฉฐ ์ฟผ๋ฆฌ์ ๋ํด์๋ง ๋น์ฉ์ ์ง๋ถํ๋ ์์ด๋ค.
์ฟผ๋ฆฌ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ๋ฏ๋ก ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ์ ๋ณต์กํ ์ฟผ๋ฆฌ์์๋ ๋ ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
## Select CSV data using S3 select
$ aws s3api select-object-content \
--bucket cloudaffaire-s3-select-demo \
--key employees.csv \
--expression "select * from s3object limit 2" \
--expression-type 'SQL' \
--input-serialization '{"CSV": {}, "CompressionType": "NONE"}' \
--output-serialization '{"CSV": {}}' "csv_output.csv"
## Check the output
$ cat csv_output.csv
## You can also output CSV data in JSON format
$ aws s3api select-object-content \
--bucket cloudaffaire-s3-select-demo \
--key employees.csv \
--expression "select * from s3object limit 2" \
--expression-type 'SQL' \
--input-serialization '{"CSV": {}, "CompressionType": "NONE"}' \
--output-serialization '{"JSON": {}}' "csv_output.json"
## Check the output
$ cat csv_output.json
## Select JOSN data using S3 select
aws s3api select-object-content \
--bucket cloudaffaire-s3-select-demo \
--key employees.json \
--expression "select * from s3object limit 2" \
--expression-type 'SQL' \
--input-serialization '{"JSON": {"Type": "DOCUMENT"}, "CompressionType": "NONE"}' \
--output-serialization '{"JSON": {}}' "json_output.json"
## Check the output
$ cat json_output.json
๋ฒํท์ ์๋ช ์ฃผ๊ธฐ ์ค์
Amazon S3์ ์ ์ฅ๋์ด ์๋ ํ์ผ๋ค์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ๋ฅผ ์ํด์ ๊ด๋ จ AWS CLI ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
S3 Life Cycle์ ๋ํด์๋ ๋ค์ ํฌ์คํ ์ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
[AWS] ๐ S3 ํฐ์ด(์คํ ๋ฆฌ์ง ํด๋์ค) & ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌํ๊ธฐ
S3 ํฐ์ด (์คํ ๋ฆฌ์ง ํด๋์ค) S3 ์คํ ๋ฆฌ์ง๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ค ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋์ง์ ๋ฐ๋ผ์ ๊ทธ๋ฆฌ๊ณ ์ผ๋ง๋ ์์ฃผ ๊ทธ ๋ฐ์ดํฐ์ ์ ๊ทผํด์ผ ํ๋์ง์ ๋ฐ๋ผ์ ๋ถ๋ฅ๊ฐ ๋๋ค. ์๋ฅผ๋ค์ด ์์ฃผ ์์ธ
inpa.tistory.com
๋ฒํท ์๋ช ์ฃผ๊ธฐ ๋ฑ๋ก
$ aws s3api put-bucket-lifecycle --bucket <๋ฒํท๋ช
> --lifecycle-configuration \\
'{ "Rules": [ { "Expiration": { "Days": 30 }, "ID": "Retention", "Filter": { "Prefix": "" }, "Status": "Enabled" } ] }'
๋ฒํท ์๋ช ์ฃผ๊ธฐ ํ์ธ
$ aws s3api get-bucket-lifecycle --bucket <๋ฒํท๋ช
>
๋ฒํท ์๋ช ์ฃผ๊ธฐ ์ญ์
$ aws s3api delete-bucket-lifecycle --bucket <๋ฒํท๋ช
>
๊ฐ์ฒด Presigned-URL ์์ฑ
[AWS] ๐ S3 Pre-signed URL ๊ณต์ ํ๊ธฐ
S3 Pre-signed URL ๊ณต์ ๋ง์ผ ์ด์ฉ์๋ค์ด S3 ๋ฒํท์ public์์ ์ ๊ทผํด์ object๋ฅผ ๋ค์ด๋ฐ๊ฑฐ๋ ์ ๋ก๋ ํ๊ฒ ์ค์ ํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ณดํต ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. 1. ๋ชจ๋ ํ์ผ์ ํผ๋ธ๋ฆญ์ผ๋ก ๋ง๋ค๊ธฐ ์ฅ์ : ๋ณ๋
inpa.tistory.com
# ํน์ ๊ฐ์ฒด์ ๋ํ Presigned URL์ ์์ฑ
$ aws s3 presign s3://<bucket>/<fileName> --expires-in <์ํ๋ ์๊ฐ ms>
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.