ํ ์ด ํ๋ก์ ํธ ๋ฐฐํฌ๋ฅผ ์ด๋ป๊ฒ ํ ๊น ๊ณ ๋ฏผํ๋ ์ค์ AWS ํ๋ฆฌ ํฐ์ด๋ฅผ ๋ง์๊ป ํ์ฉํด๋ณด์! ์๊ฐํด์ ElasticBeanstalk์ผ๋ก ๋ฐฐํฌ๋ฅผ ํด๋ณด๊ธฐ๋ก ํ๋ค.
์ฌํ๊น์ง๋ ์ค๊ณง EC2๋ก๋ง ๋ฐฐํฌ๋ฅผ ํด์์๋๋ฐ ElasticBeanstalk์ ์ด์ฉํ๋ฉด ํจ์ฌ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๋ฐฐํฌ๋ฅผ ํ ์ ์๋ค๊ณ ๋ค์๋ค.
ํ์ง๋ง ์ง์ ํด๋ณด๊ธฐ ์ ๊น์ง๋ ๊ทธ ํธ์์ฑ์ ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋์ ํด๋ณด๊ธฐ๋ก ํ๋ค.
ElasticBeanstalk๋ฅผ ์ฌ์ฉํ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ์ธํ๋ผ์ ๋ํ ์ผ๋ ค ์์ด AWS ํด๋ผ์ฐ๋์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๊ฒ ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ ํ ๋๋ ์ ์ด์ ๋ํ ์ ์ฝ ์์ด Elastic Beanstalk์ ๊ด๋ฆฌ ๋ณต์ก์ฑ์ด ์ค์ด๋ญ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ก๋ํ๊ธฐ๋ง ํ๋ฉด Elastic Beanstalk์์ ์ฉ๋ ํ๋ก๋น์ ๋, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์กฐ์ , ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋ชจ๋ํฐ๋ง์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
์ฌ์ค EC2์ ์น ์๋ฒ(nginX ๋ฑ)๋ฅผ ์ฐ๊ฒฐํ๊ณ ๋ฐฐํฌํ๋ ๊ณผ์ ์ด ๊ฒฐ์ฝ ์ฝ์ง๋ง์ ์์๋ค. (๋ด ๊ธฐ์ค)
ํ์ํ ํจํค์ง ์ค์น๋ถํฐ ์์ํด์ requirements.txt
์ค์นํ๊ณ .. uwsgi
์ค์ ํ๊ณ ..
ํ์ง๋ง ElasticBeanstalk์ ์ฌ์ฉํ๋ฉด ๊ทธ๋ฌํ ๊ณผ์ ๊ณผ ์๊ฐ๋ค์ด ์์ฒญ๋๊ฒ ์์ถ๋๋ค๋ ์ฌ์ค! ๋น -๋ฐค
์์์ EC2๋ ์์ฑํด์ฃผ๊ณ .config
ํ์ผ๋ก ๋ฐฐํฌ ์ค์ ๊น์ง ์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ค๋ค.
ํ์๋ mac์ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก macOS์ฉ ์ค์น ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
pip
๋ฅผ ์ด์ฉํด ์ค์นํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ํ์๋ brew
๋ก ์ค์นํ๋ค.
(๋ค๋ฅธ OS ํ๊ฒฝ์์ ์ค์นํ์ค ๋ถ๋ค์ AWS docs๋ฅผ ์ฐธ๊ณ ํ์.)
$ brew update
$ brew install awsebcli
$ eb --version
EB CLI 3.16.0 (Python 3.6.5)
๋ฐฐํฌํ ํ๋ก์ ํธ์ ๋ฃจํธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
์๋ฒ์ ๋ฆฌ์ ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ณ ์ํฐ๋ฅผ ๋๋ฅธ๋ค.
$ eb init
Select a default region
1) us-east-1 : ๋ฏธ๊ตญ ๋๋ถ(๋ฒ์ง๋์ ๋ถ๋ถ)
2) us-west-1 : ๋ฏธ๊ตญ ์๋ถ(์บ๋ฆฌํฌ๋์ ๋ถ๋ถ ์ง์ญ)
3) us-west-2 : ๋ฏธ๊ตญ ์๋ถ(์ค๋ ๊ณค)
4) eu-west-1 : ์ ๋ฝ(์์ผ๋๋)
5) eu-central-1 : ์ ๋ฝ(ํ๋ํฌํธ๋ฅดํธ)
6) ap-south-1 : ์์์ ํํ์(๋ญ๋ฐ์ด)
7) ap-southeast-1 : ์์์ ํํ์(์ฑ๊ฐํฌ๋ฅด)
8) ap-southeast-2 : ์์์ ํํ์(์๋๋)
9) ap-northeast-1 : ์์์ ํํ์(๋์ฟ)
10) ap-northeast-2 : ์์์ ํํ์(์์ธ)
...
(default is 3): 3
AWS access id
์ secret key
๋ฅผ ์
๋ ฅํ๋ค.
(์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด AWS docs๋ฅผ ํ์ธํ์.)
You have not yet set up your credentials or your credentials are incorrect.
You must provide your credentials.
(aws-access-id): aws-access-id
(aws-secret-key): aws-secret-key
์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ ๊ฒ์ด๋ฏ๋ก 1
์ ์
๋ ฅํ๋ค.
Select an application to use
1) [ Create new Application ]
(default is 1): 1
์์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฆ์ ์ ๋ ฅํ๋ค.
๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ์ eb init
์ ์คํํ๋ ์์น์ ํด๋ ์ด๋ฆ์ด๋ค.
Enter Application Name
(default is "project_name"): project_name
Application eb has been created.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ํ๋ ์์ํฌ์ ์ธ์ด๋ฅผ ์ ํํ๋ค.
ํ์์ ํ๋ก์ ํธ๋ Python๊ณผ Django๋ก ๊ตฌ์ฑํ์ผ๋ฏ๋ก 3
์ ์
๋ ฅํ๋ค.
Select a platform.
1) Node.js
2) PHP
3) Python
4) Ruby
5) Tomcat
6) IIS
7) Docker
8) Multi-container Docker
9) GlassFish
10) Go
11) Java
(default is 1): 3
EB ํ๊ฒฝ์ SSH ํค ํ์ด๋ฅผ ํ ๋นํ๋ ค๋ฉด y๋ฅผ ์ ๋ ฅํ๋ค.
์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด AWS docs๋ฅผ ํ์ธํ์.
Do you want to set up SSH for your instances?
(y/n): y
๊ธฐ์กด ํค ํ์ด๋ฅผ ์ ํํ๊ฑฐ๋ ์๋ก ๋ง๋ ๋ค.
Select a keypair.
1) [ Create new KeyPair ]
2) ugaemi
(default is 1): 2
์ด์ ์ค์ ํ์ผ์ ๋ง๋ค์ด ๋ณด์.
.ebextensions
ํด๋๋ฅผ ๋ง๋ค๊ณ ํ์์ .config
ํ์ฅ์ ํ์ผ์ ์์ฑํ๋ค.
ํ์ผ์ ๋ฒํธ ์์๋ก ์คํ ๋๋ฏ๋ก 01_init.config
, 02_package.config
์ ๊ฐ์ด ์ ๋ฆฌํ๋ค.
option_settings:
"aws:elasticbeanstalk:container:python":
WSGIPath: config/wsgi.py
"aws:elasticbeanstalk:container:python:staticfiles":
/static/: "www/static/"
"aws:elasticbeanstalk:application:environment":
DJANGO_SETTINGS_MODULE: config.settings
์ค์ ํ์ผ ์์
์ด ๋๋ฌ๋ค๋ฉด ๋ค์ ํฐ๋ฏธ๋๋ก ๊ฐ์ eb create
๋ฅผ ๋
๋๋ ค ์ฃผ์.
$ eb create
Enter Environment Name
(default is EBDjangoProject-dev): project_name-dev
DNS CNAME์ ์ ๋ ฅํด์ค๋ค.
Enter DNS CNAME prefix
(default is EBDjangoProject-dev): project_name-dev
๋ก๋ ๋ฐธ๋ฐ์ ํ์ ์ ์ ํ ํด์ค๋ค.
Select a load balancer type
1) classic
2) application
3) network
(default is 1): 2
ํ๋ก์ ํธ์ .elasticbeanstalk/config.yml
ํ์ผ์ด ์์ฑ๋์์ ๊ฒ์ด๋ค.
branch-defaults:
master:
environment: project_name
group_suffix: null
global:
application_name: project_name
branch: null
default_ec2_keyname: ugaemi
default_platform: Python 3.6
default_region: ap-northeast-2
include_git_submodules: true
instance_profile: null
platform_name: null
platform_version: null
profile: eb-cli
repository: null
sc: git
workspace_type: Application
์ ์์ ์ผ๋ก ๋ฐฐํฌ๊ฐ ์๋ฃ ๋์๋ค๋ฉด eb open
์ ์
๋ ฅํด ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ด์ด ๋ณด์!
profile
์ด๋ฆ์ ๊ฐ eb ์ ํ๋ฆฌ์ผ์ด์
๋ง๋ค ๋ค๋ฅด๊ฒ ์ค์ ํด ์ฃผ์ด์ผ ํ๋ค.
mac ์ฌ์ฉ์์ ๊ฒฝ์ฐ ~/.aws/config
ํ์ผ์ ์ด์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ํ๋กํ์ ๋ํ ์ค์ ๊ฐ์ด ๋์จ๋ค.
์ฌ๊ธฐ ์์ฑ ๋์ด์๋ profile
์ด๋ฆ๊ณผ .elasticbeanstalk/config.yml
์ profile
์ด๋ฆ์ ๊ฐ์์ผ ํ๋ค.
[profile eb-cli]
aws_access_key_id = access_key_id
aws_secret_access_key = secret_access_key
ํ์๋ RDS PostgreSQL์ ์ฌ์ฉํ๋๋ฐ, DB ์ค์ ์์ ์กฐ๊ธ ํค๋งธ๋ค.
ํนํ PostgreSQL์ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ํ ํจํค์ง๋ฅผ ์ค์นํด์ผ ํ๋ ๋ถ๋ถ์ ๊ฐ๊ณผํด์ ๋ง์ด ๋์๊ฐ๋ค.
packages:
yum:
postgresql96-devel: []
๋ฐ๋ก ์ด ๋ถ๋ถ ์ด์๋๋ฐ, ๊ฐ์ ์ฌ์ฉํ๋ ๋ฒ์ ์ ์ ํ์ธํ๊ณ ๊ทธ์ ๋ง๋ ํจํค์ง๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค :)
์ปจํ ์ด๋์์ ์คํํ ๋ช ๋ น์ด๋ฅผ ์ง์ ์์ฑํ ์ ์๋ค.
ํ์๋ DB migrate์ collectstatic ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์์ฑํด ์ฃผ์๋ค.
container_commands:
01_migrate:
command: "source /opt/python/run/venv/bin/activate && python manage.py makemigrations && python manage.py migrate"
leader_only: true
02_collectstatic:
command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"
์ด๋ฒ ํฌ์คํ ์ ์ด์ฏค์์ ๋ง์น์ง๋ง, ์์ฑํ ๋ถ๋ถ ์ด์ธ์ ์น ์ฝ์๊ณผ CLI์์ ํ์ธํ๊ณ ์ค์ ํ ์ ์๋ ๊ฒ๋ค์ด ์ ๋ง ๋ง๋ค.
๊ทธ์ ๋ํ ๋ถ๋ถ์ ๊ณต์ ๋ฌธ์๋ฅผ ํตํด ๋ณด๋ฉด์ ๊ณต๋ถํด ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค!
ํ์คํ ๋ช ์ค ์๋๋ ๋ช ๋ น์ด๋ก ๊ทธ๊ฐ EC2๋ก ๋ฐฐํฌํ๋ฉฐ ๊ณ ์ํ๋ ์ ํ ๋ค์ ์์ฝ๊ฒ ํ ์ ์์ด ๋๋ผ์ ๋ค.
๋ awsebcli
๋ก ํฐ๋ฏธ๋ ํ๊ฒฝ์์ ๊ฐ๋จํ๊ฒ ๋ฐฐํฌํ ์ ์๋ค๋ ์ ๋ ์ข์๋ค.
.ebextensions
๋ฅผ ์ค์ ํ๋ ๋ถ๋ถ์ ์ข ๋ ๊ณต๋ถํด ๋ด์ผ๊ฒ ์ง๋ง, ์๋ฌดํผ ๋ฐฐํฌ๊ฐ ์ ๋ง ์์ํด ์ง ๊ฒ์ ์ฌ์ค์ด๋ค..