๐Ÿ”ฅTIL#11. AWS์— Service ๋ฐฐํฌ

๋ฐฑ์Šน์ง„ยท2020๋…„ 11์›” 28์ผ
0

wecode Django ์‹ค์Šต

๋ชฉ๋ก ๋ณด๊ธฐ
13/16

Today I learned

  1. AWS
    1-1. AWS EC2
    1-2. AWS RDS
    1-3. OurPlays WAS ๊ตฌ๋™์„ ์œ„ํ•œ ์ค€๋น„

1. AWS

AWS(Amazon Web Service)๋Š” ๊ฐœ๋ฐœํ•œ Service์˜ ํ™˜๊ฒฝ(application, Database...)์„ WEB ์ƒ์— publish ํ•ด์ฃผ๋Š” Service๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•œ 1์ฐจ project ๊ฒฐ๊ณผ๋ฌผ(OurPlays WAS)์„ WEB์ƒ์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด AWS์˜ EC2(Elastic Compute Cloud), RDS(Relational Database Service)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ ์ด๋‹ค.

1-1. AWS EC2

EC2๋Š” ์ผ์ข…์˜ ๊ฐ€์ƒ ์ปดํ“จํ„ฐ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ์ž„๋Œ€๋ฐ›์•„ ์ž์‹ ์˜ application์ด๋‚˜ service๋ฅผ ์‹คํ–‰ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” Service์ด๋‹ค. ์ด ๊ฐ€์ƒ์ปดํ“จํ„ฐ์—์„œ OurPlays WAS๊ฐ€ ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค.
AWS์— ๊ณ„์ •์ด ์žˆ๋‹ค๋ฉด AWS์—์„œ EC2 Instance ์ƒ์„ฑ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

AWS์— ์ ‘์†ํ•˜์—ฌ EC2 ์„œ๋น„์Šค ํ™”๋ฉด์— ๋“ค์–ด๊ฐ€๋ฉด ์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ™”๋ฉด ์ค‘์•™์— '์ธ์Šคํ„ด์Šค ์‹œ์ž‘' ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒ˜์Œ์—๋Š” project ํ™˜๊ฒฝ์„ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค. ๋‚˜๋Š” ubuntu ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ–ˆ์œผ๋ฏ€๋กœ ์ƒ์„ฑํ•  instance๋„ ubuntu๋กœ ์„ ํƒํ•œ๋‹ค.

AMI ์„ ํƒ์„ ํ•˜๋ฉด ์œ„ ์ฒ˜๋Ÿผ '์œ ํ˜• ์„ ํƒ'ํ™”๋ฉด์ด ๋‚˜์˜ค๋Š”๋ฐ ๊ฐœ๋ฐœ ํ…Œ์ŠคํŠธ์šฉ์ด๋ฏ€๋กœ ํ”„๋ฆฌํ‹ฐ์–ด ์˜ต์…˜์ธ ํ•ญ๋ชฉ์„ ์„ ํƒ.

์—ฌ๊ธฐ์„  '์„œ๋ธŒ๋„ท' ๋ถ€๋ถ„์„ open, ์ฒซ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ์„ ํƒํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  '์šฐ๋ฐœ์ ์ธ ์ข…๋ฃŒ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ'๋ฅผ check ํ•˜๊ณ  ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€์ž(์ถ”๊ฐ€์š”๊ธˆ ๋ฐœ์ƒ๋˜๋Š” ์˜ต์…˜์€ ๋น„ํ™œ์„ฑํ™”)

์ €์žฅ๊ณต๊ฐ„ ์„ค์ •๋‹จ๊ณ„์ธ๋ฐ ํ…Œ์ŠคํŠธ์šฉ Instance ์ด๋ฏ€๋กœ default๋กœ ํ•˜๊ณ  ๋„˜์–ด๊ฐ„๋‹ค.
๋‹ค์Œ ๋‹จ๊ณ„๋Š” Tag ์„ค์ •์ธ๋ฐ ์ด๋Š” ๋น„์šฉ ๊ด€๋ฆฌ, AMI ์ •์ฑ…๊ถŒํ•œ ์ง€์ • ๋“ฑ์— ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ Instance ์— ์›ํ•˜๋Š” key์™€ value๊ฐ’์„ ์ž…๋ ฅ ํ›„ ๋„˜์–ด๊ฐ€์ž.

'๋ณด์•ˆ๊ทธ๋ฃน์„ค์ •' ๋‹จ๊ณ„์—์„  http/https ์ ‘์† ํ—ˆ์šฉ์„ ์œ„ํ•ด ๋ณด์•ˆ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์œ„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ '์‚ฌ์šฉ์ž ์ง€์ • TCP'๋ฅผ ์ถ”๊ฐ€, [ํฌํŠธ๋ฒ”์œ„]๋Š” 8000, [์†Œ์Šค]๋Š” '์œ„์น˜ ๋ฌด๊ด€'์œผ๋กœ ํ•˜๋ฉด ์–ด๋Š๊ณณ์—์„œ๋“  http/https ์ ‘์†์„ ํ—ˆ์šฉํ•œ๋‹ค.

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋กœ ์ง€๊ธˆ๊นŒ์ง€ ์„ค์ •ํ•œ ๋‚ด์šฉ์ด ๋งž๋Š”์ง€ ํ™•์ธ ํ›„ ์ƒ์„ฑ์ ˆ์ฐจ๋ฅผ ๋Œ์ž…ํ•œ๋‹ค.
'์‹œ์ž‘ํ•˜๊ธฐ'๋ฅผ ๋ˆ„๋ฅด๋ฉด key-pair ๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Š” EC2 ์ ‘์†์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์ด๋ฏ€๋กœ ์ž˜ ๊ด€๋ฆฌํ•˜์ž. ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ์ด ํ›„ AWS EC2 ํ™”๋ฉด์—์„œ ์ด Instance์˜ ์ƒํƒœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ Terminal์—์„œ EC2 instance๋กœ ์ ‘์†ํ•ด๋ณด์ž. ์ ‘์† ์ „ ๋จผ์ € downloadํ•œ pem ํŒŒ์ผ์˜ ๊ถŒํ•œ์„ ๋ฐ”๊ฟ”์ค˜์•ผ ssh ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ํ•ด๋‹น ํŒŒ์ผ ๊ถŒํ•œ์„ ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ๋ฐ”๊พธ์ž.

chmod 400 xxxx.pem

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์ฒ˜๋Ÿผ ssh ๋กœ ์ ‘์†์„ ์‹œ๋„.

ssh -i {๋ฐœ๊ธ‰๋ฐ›์€ pem ํŒŒ์ผ} ubuntu@{์ธ์Šคํ„ด์Šค public IP or DNS}

# ubuntu ์œ„์น˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  AMI ์ด๋ฆ„์ด๋‹ค.


์ •์ƒ์ ์œผ๋กœ ์ ‘์†๋˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ Terminal ์ž…๋ ฅ๋ถ€๋ถ„ ์ •๋ณด๊ฐ€ ๋ฐ”๋€๋‹ค.

1-2. AWS RDS

RDS(Relational Database Service)๋Š” RDB ํ™˜๊ฒฝ์„ AWS์— ๊ตฌ์ถ•ํ•˜๊ณ  ์ ‘๊ทผ ์„ค์ •๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” Service์ด๋‹ค. OurPlays WAS๋Š” mysql์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ RDS๋กœ ๋“ค์–ด๊ฐ€ Database๋ฅผ ์ƒ์„ฑ, ์„ฑ์„ฑ๋œ Database์˜ EndPoint(์ ‘์†์ฃผ์†Œ)๋ฅผ EC2์˜ OurPlays WAS ์„ค์ •์ •๋ณด์— ๋„ฃ์–ด EC2์™€ RDS ์—ฐ๋™์ด ๋˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค. ์šฐ์„  AWS RDS ํŽ˜์ด์ง€๋กœ ๋“ค์–ด๊ฐ€์ž.

์œ„ ํ™”๋ฉด์—์„  ๋‚ด๊ฐ€ ์ด๋ฏธ ๋งŒ๋“ค์–ด ๋†“์€ Database๊ฐ€ ์žˆ๋‹ค. ์šฐ์ธก ์ƒ๋‹จ์˜ '๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ'๋ฒ„ํŠผ์œผ๋กœ ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•œ๋‹ค.

๋‚˜๋Š” MySQL ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•˜์˜€์œผ๋ฏ€๋กœ MySQL์„ ์„ ํƒํ•œ๋‹ค.

Version๊ณผ ํ…œํ”Œ๋ฆฟ, ์‹๋ณ„์ž, ๋กœ๊ทธ์ธํ•  ID/Password๋ฅผ ์ž…๋ ฅํ•˜์ž. ID๋Š” root์œผ๋กœ ํ•˜๊ณ  Password๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด ๋ณต์žกํ•œ ํŒจํ„ด์„ ์ถ”์ฒœํ•œ๋‹ค.
Database๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉด ์ ‘์†ํ•ด๋ณด์ž. Terminal์—์„œ ์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค.

mysql -h {RDS endpoint} -u root -p

Password๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ž…๋ ฅํ–ˆ๋‹ค๋ฉด RDS์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ
Database ์ƒ์„ฑ์‹œ 'ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน'์— ๋Œ€ํ•œ ์„ค์ •์„ ์žŠ์ง€ ๋ง์ž.
characterset* ๊ฐ’์œผ๋กœ utf8mb4 ๋กœ ์„ค์ •๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์จ์•ผ ํ•œ๊ธ€ ๊นจ์ง ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ๋ณธ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ๊ธ€์ด ๊นจ์ง„๋‹ค

1-3. OurPlays WAS ๊ตฌ๋™์„ ์œ„ํ•œ ์ค€๋น„

EC2์™€ RDS ์ค€๋น„๊ฐ€ ๋๋‚ฌ์œผ๋‹ˆ ๋‚จ์€ ๊ฑด ๊ฐœ๋ฐœํ•œ OurPlays WAS source๋ฅผ EC2์˜ Instance๋กœ ๊ฐ€์ ธ์™€ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์ด ์ง„ํ–‰๋˜์—ˆ๋‹ค.

  1. miniconda ์„ค์น˜ ๋ฐ ๊ฐ€์ƒํ™˜๊ฒฝ ๋งŒ๋“ค๊ธฐ.
  2. 'git clone' ๋ช…๋ น์œผ๋กœ source ๊ฐ€์ ธ์˜ค๊ธฐ
  3. requirement.txt์˜ package ์„ค์น˜
  4. OurPlays WAS ์‹คํ–‰

์œ„ ๊ณผ์ •์—์„œ .gitignore ๋Œ€์ƒ์ธ ํŒŒ์ผ(my_settings.py, db_uploader.py) ๋ฐ ํด๋”(data/)๋Š” ๋‚ด local pc์— ์žˆ๋Š” ๊ฒƒ์„ EC2 Instance๋กœ ๋„ฃ์–ด์•ผ ํ–ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด EC2 Instance๋กœ ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ upload ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋˜ ์ค‘ ubuntu์—์„œ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” 'scp' ๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

# scp ๋ช…๋ น์–ด ๊ตฌ์กฐ
scp -i {๋ฐœ๊ธ‰๋ฐ›์€ pem ํŒŒ์ผ} -r {local path} ubuntu@{์ธ์Šคํ„ด์Šค public IP or DNS}:{remote path}

# ๋‚ด ์ž‘์—… ๊ธฐ์ค€
scp -i jinybear.pem -r ~/ourplays/14-folder/data/ ubuntu@xxx.xxx.xxx.xxx:~/14-folder/

์œ„๋Š” ํด๋”์˜ ๊ฒฝ์šฐ์ด๋ฉฐ ํŒŒ์ผ์€ '-r' ์˜ต์…˜์„ ๋นผ๋ฉด ๋œ๋‹ค. ๋งŒ์•ฝ EC2 Instance๋กœ๋ถ€ํ„ฐ download๋ฅผ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ง„ํ–‰.

scp -i {๋ฐœ๊ธ‰๋ฐ›์€ pem ํŒŒ์ผ} -r ubuntu@{์ธ์Šคํ„ด์Šค public IP or DNS}:{remote path} {local path}

OurPlays WAS๋ฅผ ์‹คํ–‰ํ•œ ํ›„ postman์œผ๋กœ request test ๊ฒฐ๊ณผ ์ •์ƒ ๋™์ž‘ํ•จ์„ ํ™•์ธํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์•„์ง ํ•œ ๊ฐ€์ง€๊ฐ€ ๋” ๋‚จ์•˜๋‹ค. ๊ทธ๊ฒƒ์€ shell์„ close ํ•˜๊ฑฐ๋‚˜ ํ„ฐ๋ฏธ๋„ ์„ธ์…˜์„ ๋‹ซ์•„๋„ WAS๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.
(์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด shell ๋˜๋Š” Terminal์„ ๋‹ซ์„ ๋•Œ ๊ฐ™์ด ์ข…๋ฃŒํ•˜๊ฒŒ ๋œ๋‹ค)

background๋กœ ์‹คํ–‰๋˜๋„๋ก ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์ฐพ๋˜ ์ค‘ 'nohup' ๋ช…๋ น์„ ๋ฐœ๊ฒฌ, ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ํ•˜์˜€๋‹ค.

nohup python manage.py runserver 0:8000 &

# nohup {WAS ์‹คํ–‰ ๋ช…๋ น} &

๋งˆ์นจ ๋‚˜์™€ ํ˜‘์—…ํ–ˆ๋˜ Frontend ๊ฐœ๋ฐœ์ž๋กœ๋ถ€ํ„ฐ Frontend์ธก ๊ฐœ์„ ์ž‘์—…์„ ์œ„ํ•ด OurPlays WAS์™€ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฐ๋ฝ์ด ์™”๋‹ค. ๋‚˜๋Š” EC2 Instance์˜ 'public ip'๋ฅผ ์•Œ๋ ค์ฃผ์—ˆ์œผ๋ฉฐ ์šฐ๋ฆฌ ๋‘˜์€ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ^^

profile
12๋…„ .NET ๊ฐœ๋ฐœ ๊ฒฝ๋ ฅ์„ ๊ฐ€์ง„ ์›น ์ดˆ์งœ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค :)

0๊ฐœ์˜ ๋Œ“๊ธ€