해당 글은 Mac 기준으로 되어 있다.
사용 AWS 서비스
- Elastic Beanstalk > 배포 도구
- Lightsail > DB > MariaDB
- S3 > 파일 스토리지
- EC2 > 서버
1. DB 생성
1) 가장 먼저 AWS 계정이 없으면 가입하자.
2) Lightsail 생성하기
RDS는 생각보다 비싸기 때문에 저렴한 Lightsail을 이용해서 DB 서버를 만든다
1. Lightsail로 이동
2. create instance
3. Operating System (OS) only
4. 우분투 24.04 LTS
ssh 접속을 위해 본인 키를 넣거나 계정/비밀번호를 기억하는건 기본
3) DB 설치
이 글에서는 Maria DB를 설치한다. 다른걸 설치해도 무방
3-1) SSH로 Lightsail에 접속
3-2) MariaDB 설치 전에 시스템을 최신 상태로 업데이트
sudo apt update && sudo apt upgrade -y
3-3) MariaDB 패키지 설치
sudo apt install mariadb-server mariadb-client -y
3-4) MariaDB 서비스 상태 확인
MariaDB 설치가 완료되면 서비스를 활성화하고 실행 상태를 확인
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo systemctl status mariadb
active (running) 상태여야 정상적으로 실행되고 있는 것
4) 초기 보안 설정
MariaDB 설치 후 초기 보안 설정을 실행해야 합니다.
sudo mysql_secure_installation
해당 명령어를 입력하면 아래와 같은 질문이 나온다
Enter current password for root (enter for none): 초기 비밀번호 입력 > 없으니 엔터
Switch to unix_socket authentication [Y/n] : 루트 패스워드 접속을 위해 N 을 입력
Change the root password? [Y/n] : 루트 패스워드를 바꿀 것인가? > Y > 새 비번 입력
Remove anonymous users? [Y/n] : 익명 유저를 삭제할 것인가 > Y
Disallow root login remotely? [Y/n] : 외부 접속을 허용할 것인가 > Y , 외부 접속이 필요 없으면 N
Remove test database and access to it? [Y/n] : 테스트 디비를 삭제할 것인가 > Y , 본인 취향에 맞김
Reload privilege tables now? [Y/n] : 지금 바로 적용할 것인가 > Y
5) 디비에 접속 후 기본 셋팅
본인이 사용할 DB를 생성하고 사용자를 추가한다.
mysql -uroot -p [본인이 위에서 적은 비밀번호]
create database [my database name] character set utf8mb4 collate utf8mb4_general_ci;
use mysql;
create user '[user name]'@'%' identified by '[password]';
grant all privileges on [my database name].* to [user name]@'%';
flush privileges;
6) 방화벽 설정
외부에서 접속하려면 방화벽을 설정해야함
sudo ufw allow 3306
sudo ufw reload
7) 원격 접속 허용
7-1) MariaDB 설정 파일(/etc/mysql/mariadb.conf.d/50-server.cnf)을 열어 원격 접속을 허용해야함
sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
7-2) 다음 설정을 찾아 수정
# 기존: bind-address = 127.0.0.1
bind-address = 0.0.0.0
bind-address를 0.0.0.0으로 변경하면 모든 IP 주소에서 접속을 허용,
자신의 IP를 적어도 됨
8) MariaDB를 재시작
sudo systemctl restart mariadb
2. S3 생성
모든 퍼블릭 액세스 차단 을 비활성화 하고 만든다.
S3의 보안은 매우 복잡하므로 본인의 상황을 보고 설정한다. 여기서는 모두 비활성
3. EB 셋팅
1. IAM 사용자 생성 및 권한 부여
AWS의 보안을 강화하기 위해 IAM 사용자를 생성하고 필요한 권한을 부여
1-1) IAM 사용자 생성
a. AWS Management Console에 로그인
b. 상단 메뉴에서 '서비스'를 클릭한 후 'IAM'을 선택
c. 왼쪽 메뉴에서 '사용자'를 선택하고 '사용자 추가'를 클릭
d. 사용자 이름을 입력하고, '프로그래밍 방식 액세스'를 선택
e. '다음: 권한'을 클릭
1-2) 권한 부여
1. '기존 정책 직접 연결'을 선택
2. 검색창에 'AWSElasticBeanstalkFullAccess'를 입력하고 해당 정책을 선택
3. '다음: 태그'를 클릭
4. 태그는 필요에 따라 추가하고, '다음: 검토'를 클릭
5. 설정을 확인한 후 '사용자 만들기'를 클릭
1-3) 액세스 키 저장
1. 생성된 사용자의 '액세스 키 ID'와 '비밀 액세스 키'를 안전한 곳에 저장
2. 이 정보는 추후 AWS CLI 설정 시 필요
2. AWS CLI 설치 및 구성
AWS CLI를 통해 AWS 서비스를 명령줄에서 관리할 수 있음
본인의 맥 > 장고 프로젝트로 이동
2-1) AWS CLI 설치
brew install awscli
aws --version
2-2 AWS CLI 구성
aws configure
프롬프트에 따라 앞서 저장한 '액세스 키 ID'와 '비밀 액세스 키'를 입력
기본 리전은 'ap-northeast-2'를 입력하여 서울 리전을 선택
출력 형식은 'json'을 입력
3. AWS Elastic Beanstalk CLI(EB CLI) 설치
EB CLI는 AWS EB를 명령줄에서 관리할 수 있도록 도와줌
brew install awsebcli
eb --version
4. 프로젝트 준비
1) requirements.txt 파일을 생성한다
pip freeze > requirements.txt
2) 환경설정
- 파이썬 3.11
- MariaDB 사용
- 장고 5.0.4
24년 11월 20일 현재 eb의 파이썬 최신 버전은 3.11이다. 맨탈 나가기 싫으면 프로젝트 파이썬 버전을 3.11로 개발하는 것을 추천한다. 만일 eb가 업데이트 되어서 버전이 변경되면 버전을 일치하는 것을 추천한다.
3) 설정 파일
장고 프로젝트의 설정파일을 잘못 셋팅하면 개고생을 한다. 본인은 테스트, 상용 서버 두개를 운영하기 위해서 설정파일을 두개로 나눠서 진행 했다.
project
- config
---settings
------test.py
------prod.py
보통의 경우 project/config/settings.py 파일이 있다.
설정파일을 분리하면 뭐가 문제가 되냐면 정적 파일을 만들때 경로가 한단계 더 아래로 들어간다는 것에 있다.
project/config/settings.py의 경우 project/staticfiles 이렇게 정적 파일 위치가 생기지만
본인과 같이 셋팅 파일을 분리해서 사용할 경우 project/config/staticfiles 이 되면서 nginx가 찾지 못하는 문제가 생긴다.
이 문제를 해결하기 위해서 설정 파일의 BASE_DIR을 아래와 같이 수정해야 한다
BASE_DIR = Path(__file__).resolve().parent.parent
>>>>>>>>
BASE_DIR = Path(__file__).resolve().parent.parent.parent
맨 뒤에 parent 를 3개를 해줘야 원래 경로인 project/staticfile에 정적 파일이 생성된다.
만일 eb deploy 후 정적 파일을 찾지 못하면 eb ssh 로 직접 접근해서 정적 파일 위치를 확인하자.
다음으로 정적 파일 위치 지정한다
STATIC_URL = "static/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
4) eb 환경 파일 생성
project/.ebextensions/django.config 파일을 생성한다
container_commands:
01_migrate:
command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate"
leader_only: true
02_collectstatic:
command: "source /var/app/venv/*/bin/activate && python3 manage.py collectstatic --settings=$DJANGO_SETTINGS_MODULE --noinput"
leader_only: true
option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: config.wsgi:application
aws:elasticbeanstalk:environment:proxy:staticfiles:
/static: staticfiles
여기서 또 중요한 것이 option_settings > WSGIPath 부분이다. 이 부분은 프로젝트의 wsgi.py 파일의 경로이다. 아래 경로 참조
project
- config
--- settings
--- urls.py
--- wsgi.py
- manager.py
5) git commit
AWS EB는 git과 밀접한 관련이 있다. 현재 commit을 기준을 배포하니 위 사항을 완료 후 꼭 commit을 해줘야 한다.
6) EB create
이제 EB 환경을 만들 순서다. EB는 아래와 같이 구성되어 있다.
애플리케이션
- 환경1
- 환경2
- 환경3
애플리케이션은 환경을 여러개 포함하고 있다.
애플리케이션이 "쿠팡 웹 서비스"라면,
환경은 "테스트 서버, 스테이징 서버, 프로덕션 서버" 이렇게 구성된다고 할 수 있다.
쿠팡 웹 애플리케이션
- 테스트 환경
- 스테이징 환경
- 프로덕션 환경
애플리케이션 아래 여러가지 환경이 올 수 있다.이해가 안가면 지피티에게 물어보자.
6-1) 먼저 애플리케이션을 초기화
만일 애플리케이션이 있다면 선택해 주면된다. 없으면 새로 만들자.
나는 꼭 interactive 옵션을 사용하는데 자동으로 생성하다가 엄한 리전에 eb이 잔뜩 생성되는 경우가 있었다. 나중에 울지말고 귀찮지만 해당 옵션으로 하나씩 생성하자.
eb init --interactive
해당 명령을 입력하면 몇가지 질의 문답을 하게 된다.
생성하고자 하는 리전과 애플리케이션 이름 등등, 적절하게 입력한다.
이렇게 애플리케이션을 생성하고 나면 이제 환경을 생성하자.
6-2) 환경 생성
eb create [환경 이름] --envvars DJANGO_SETTINGS_MODULE='config.settings.test',ALLOWED_HOSTS='*'
여기서 뒤에 --envvars는 환경 변수이다. DJANGO_SETTINGS_MODULE 환경 변수는 .ebextensions/django.config파일에 사용되었고 ALLOWED_HOSTS는 settings.py 파일에서 사용된다. 이렇게 환경을 생성 시에 생성하던가, 나중에 AWS 콘솔에서 설정할 수도 있다.
본인이 사용하고자 하는 환경 변수가 있으면 여기서 지정한다
여기서 환경변수를 사용하지 않고 .env 파일을 생성한다던지 AWS의 SSM Parameter Store같은 서비스를 사용할 수도 있다. 본인의 취향에 맞는 것을 선택하자
7) 오류 수정
2024년 11월 20일 기준으로 이렇게해서 eb deploy를 하면 오류가 발생할 것이다.
해당 이슈는 db클라이언트 설치시에 발생하는 오류로 직접 EC2에 접속해서 해결하는 것이 가장 간단하다.
eb ssh
sudo wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
sudo dnf install mysql80-community-release-el9-1.noarch.rpm -y
sudo dnf update -y
sudo chown -R ec2-user:ec2-user /var/app/venv/staging-LQM1lest
source /var/app/venv/staging-LQM1lest/bin/activate
pip install --upgrade pip
sudo dnf install mysql-devel -y
pip install -r /var/app/staging/requirements.txt
순서대로 진행해야 한다. 이렇게 해서 마지막 requirements.txt 리스트가 모두 설치되면 성공이다.
5. 배포하기
여기까지 왔다면 배포는 매우 간단하다
eb deploy
문제가 없으면 배포가 될 것이고, 문제가 있으면 오류가 날 것이다. 오류 메세지를 보는 방법은 아래와 같다.
eb logs
'개발관련' 카테고리의 다른 글
Ubuntu 서버에 nginx 설치하기 (0) | 2023.08.12 |
---|---|
우분투에 Mariadb 설치 및 셋팅 (0) | 2023.03.30 |
git pull 후 특정 작업하기 (0) | 2023.02.07 |
Nginx post가 get으로 바뀌는 경우 (0) | 2023.02.03 |
Ubuntu + Nginx + Cafe24 SSL 적용(Django, Vue) (0) | 2023.02.03 |