View
이번 블로깅에서는 우리가 참으로 많이 이용하고 있는
AWS에 대해 살펴 보려고 합니다.
AWS 서비스가 없을 때에는 server를 구축하는데 까지
시간이 오래걸리고 서버를 설치할 공간의 확보와
필요 이상으로 지출되는 기회비용이 있었습니다.
하지만 AWS의 등장으로 인해 우리는
우리가 원하는 때에 서버를 구축하고,
서비스를 사용한 만큼의 비용만을 지불하면 되게 되었습니다.
AWS와 같은 서비스를 Cloud Computing이라고 하며,
이는 소프트웨어 개발에 있어서 엄청난 혁명을 일으키게 되었습니다.
Traditional IT방식의 문제점
1. Datacenter 렌트 비용을 지불해야 한다.(보통 monthly/yearly contract)
2. Power supply, cooling, maintenance 비용을 지불해야한다.
3. 새로운 하드웨어(서버)를 추가하거나 교체할 때 시간이 많이 소모된다.
Cloud Computing
1. IT 리소스를 인터넷을 통해 on-demand로 제공해주는 서비스를 말한다.
2. Cloud서비스를 이용하면 사용한만큼만 지불하면 되는 pay-as-you-go pricing이 적용된다.
3. 정확하게 필요한 타입과 크기의 리소스를 지정하여 사용할 수 있다.
4. 필요한만큼의 리소스를 바로 사용가능하다.
5. 기존보다 간편하게 서버, 스토리지, 데이터베이스 등에 접근가능한 솔루션을 제공한다.
클라우드가 해결해주는 문제들
1. Flexibility : 유동적으로 원하는 리소스의 타입과 사이즈를 쉬게 변경가능하다.
2. Cost-Effectiveness : pay-as-you-go (내가 사용한만큼만 금액을 지불한다.)
3. Scalability : 쉽게 새로운 리소스를 추가할 수 있으므로 확장하는데 용이하다.
4. High-availability and fault-tolerance : 글로벌하게 확장되어있는 인프라.
5. Agility : 빠르게 개발하고, 테스트하여 사용할 수 있는 소프트웨어 어플리케이션.
1. AWS(Amazon Web Service)란?
AWS란?
AWS는 Amazon Web Service의 줄임말 입니다. AWS는 소위 클라우드 서비스라고도 합니다. 클라우드 서비스는 서버 등의 인프라스트럭쳐를 필요한대로 on demand로 사용할 수 있는 서비스 입니다.
즉, 유저가 직접 서버를 구입하고 설치할 필요 없이 AWS상에서 클릭 몇번으로 서버를 구축하고 사용할 수 있습니다.
Why AWS?
1. Cloud Computing의 장점을 그대로 혹은 그 이상!
2. 간단한 기업 프로세스
3. Amazon의 Brand Value.
4. Stability - 엄청난 규모를 자랑하지만 굉장히 안정적이다.
5. 다양하게 제공되는 서비스들
- Enterprise IT, Backup & Storage Big Data Analytics
- Web Hosting, Mobile & Social Apps
- Gaming
웹서비스 배포를 위한 AWS 필수 개념
AWS가 제공하는 기능들은 굉장히 방대하고 다양합니다. 그 중 일반적으로 많이 사용되는 개념과 기능들은 다음과 같습니다. EC2
, Security Group
, RDS
, Load Balancer (ALB)
, Route 53
, S3
EC2 : 몇 분안에 구동 가능한 가상서버
- Elastic Compute Cloud
- AWS 상에서 사용하는 Server. EC2 서버에 API를 배포하게 된다.
- EC2는 다양한 사양 옵션을 제공한다.
t2.nano
(CPU 1, 0.5 GB memory) 부터x1.32xlarge
(CPI 128, 1952 GB) 까지 다양하게 제공함으로 필요한 사양의 EC2 인스턴스(instnace)를 선택해서 사용하면 된다 (물론 사양이 좋을 수록 비싸다).
Secuirty Group
- EC2 인스턴스에 대한 네트워크 트래픽을 제어하는 가상 방화벽 역활을 한다.
- 즉 security group 설정을 해줘야 EC2 인스턴스에 HTTP와 SSH 접속이 가능하다.
RDS (Relational Database Service) : 클라우드에서 데이터베이스 관리
- AWS의 database 서비스
- RDS를 사용하면 사용자가 직접 서버를 생성해서 데이터 베이스를 설치하고 설정하고 관리 하지 않아도 된다.
- 그러면서 동시에 비용도 더 저렴하다. 사용자가 직접 데이터 베이스를 설치하고 운영하는 것보다 RDS를 사용하는것이 더 저렴함. 즉, RDS를 사용 하지 않을 이유가 거의 없다.
⭐️ ELB (Elastic Load Balancer)
- 로드발란서는 HTTP 요청들을 여러 서버에 분산할때 사용된다.
- HTTP 요청이 많을때는 서버 하나만으로 모두 처리 하기 힘들기 때문에 서버 수를 늘리는것이 일반적이다. 그럼으로 여러 서버를 실행하고 로드발런서가 HTTP 요청들을 서버들에 분산 해주는 형태로 시스템이 구성된다.
Route 53
- AWS의 DNS 서비스.
- API 시스템을 실제 도메인과 연결 시키주는 기능을 제공한다.
AWS S3 : 파일 업로드 및 공유
- AWS S3(Simple Storage Service)는 이름 그대로 파일을 쉽게 저장할 수 있는 공간을 제공하는 서비스.
- 파일을 저장 할 수 있을 뿐만이 아니라 파일마다 고유 주소를 부여해주기 때문에 S3에 저장한 파일을 웹상에서 쉽게 읽어들일수 있다.
- 주로 사이트상의 이미지들을 저장하고 사이트에서 읽어들여 렌더링 해주는데 사용한다.
Virtual Private Cloud(VPC) : AWS네트워크 망안의 사용자 전용의 사설 네트워크 망
- 사용자의 AWS 계정 전용 가상 네트워크
- 일반적으로 보안을위해 AWS 리소스간 허용을 최소화하고 그룹별로 손쉽게 네트워크를 구성하기위해 많이사용한다.
2. AWS RDS
MySQL
AWS RDS는 여러 데이터베이스를 제공합니다. 그중 저희는 MySQL 사용법을 알아보도록 하겠습니다 (다른 데이터베이스들도 많이 틀리지는 않습니다).
1. RDS 서비스를 선택한다.
2. 먼저 MySQL 설정 파일을 만들어야 한다. 직접 안만들어도 default 설정 파일이 있지만 utf-8 인코딩 설정을 해줘야 한국어가 저장 가능하다. 먼저 "Parameters groups" 페이지로 가자.
3. "Create parameter group" 옵션을 선택하자.
4. "Parameter group" 설정 파일을 생성하자. Group name과 Description은 자유롭게 정하면 된다. "Paramter group family"는 생성하는 데이터 베이스와 버전에 맞게 지정해야 한다. 우리의 경우 mysql5.7 데이터베이스를 생성할 예정이니 "mysql5.7"로 하자.
5. 방금 생성한 설정 파일을 수정 하자.
6. 우리가 설정할 parameters는 다음과 같다.
chracter_set_client
utf8mb4
로 변경chracter_set_connection
utf8mb4
로 변경chracter_set_database
utf8mb4
로 변경chracter_set_results
utf8mb4
로 변경chracter_set_server
utf8mb4
로 변경collation_connection
utf8mb4_general_ci
로 변경collation_server
utf8mb4_unicode_ci
로 변경
위의 파라미터를 다 설정 하였으면 "Preview changes"를 눌러서 수정사항 리뷰를 하자. 아래와 같이 나와야 한다.
모든게 정확하면 "Save Changes" 버튼을 클릭한다.
7. 이제 MySQL 데이터 베이스를 새로 생성하자
8. MySQL을엔진으로 선택하자. "Only enable iptions eligible for RDS Free Usage Tier" option을 체크해서 무료로 사용할 수 있는 사양이 자동으로 선택되도록 하자.
9. DB 세부사항 설정을 하자. 거의 대부분 default 값 그대로 두면 된다. 맨 아래 settings 섹션에서 master username과 비밀번호 그리고 데이테베이스 이름만 설정하면 된다.
10. 고급설정 페이지로 넘어가자. 먼저 Publc accessability 옵션을 yes로 설장하자. 그리고 Database options 세션에 "DB parameter group"을 방금 생성한 파라미터 설정 파일로 변경해주자. 나머지는 default 값 그대로 하면 된다. 끝나면 "Create database" 버튼을 눌루면 마무리 된다.
11. 이제 "Instances" 페이지에 가서 방금 생성한 데이터 베이스 대쉬보드 페이지로 가자. 참고로 데이터 베이스가 사용 준비되기 까지 몇분 이상 소요 될 수 있다.
12. 먼저 Endpoint를 확인하자. 이 주소로 database에 접속 할 수 있다. 그리고 Security groups링크를 클릭하자.
13. Security group 설정을 변경하여 어디서든 접속이 가능하게 하자. 원래는 데이터베이스를 이렇게 어디서든 접속 가능하게 열어놓으면 안된다. 해킹의 위험이 있다.
14. 생성된 데이터베이스에 접속한후 데이터베이스와 테이블들을 생성하자.
mysql -h test.cj5v1k6zfree.ap-northeast-2.rds.amazonaws.com -u root -p
💎 실습 💎
👉 AWS 인스턴스 생성 후 EC2 연결
[pem파일을 저장한 디렉토리에서 파일의 소유자만 파일을 읽을 수 있도록 권한 설정]
chmod 400 파일이름.pem
[SSH 접속]
ssh -i 파일이름.pem ubuntu@EC2서버의 공인아이피주소
*공인아이피 주소는 EC2 퍼블릭 IPv4에서 확인 가능
아래와 같은 질문이 나오면 yes를 입력한다.
The authenticity of host 'x.xx.xxx.60 (x.xx.xxx.60)' can't be established.
ECDSA key fingerprint is SHA256:ECNFuipT//stJfBMjCCyMbSgzOKJReItx2DkJRadH4c.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
다음과 같은 메시지가 나오는 것이 정상이며, 우분투 EC2서버와 연결됨.
Warning: Permanently added 'x.xx.xxx.60' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-1045-aws x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Wed Sep 29 06:31:49 UTC 2021
System load: 0.0 Processes: 92
Usage of /: 4.0% of 29.02GB Users logged in: 0
Memory usage: 22% IP address for eth0: xxx.xx.xx.xxx
Swap usage: 0%
* Canonical Livepatch is available for installation.
- Reduce system reboots and improve kernel security. Activate at:
https://ubuntu.com/livepatch
0 packages can be updated.
0 of these updates are security updates.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
👉 RDS - EC2 연결하기
[로컬 msql 접속하여 dump파일 생성]
mysqldump -u root -p DB이름 > sql파일이름.sql
[RDS 엔드포인트 사용하여 msql 접속하여 database생성]
mysql -h RDS엔드포인트 -u root -p
[생성한 mysql dump파일을 RDS의 database에 집어 넣기]
mysql -h RDS엔드포인트 -u root -p DB이름 < sql파일이름.sql
[pem 으로 우분투 실행 하여 다음순서대로 miniconda 가상환경 설치]
wget https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-x86_64.sh
👇
chmod +x Miniconda3-py37_4.10.3-Linux-x86_64.sh
👇
./Miniconda3-py37_4.10.3-Linux-x86_64.sh
👇
Miniconda3 will now be installed into this location:
/home/ubuntu/miniconda3
- Press ENTER to confirm the location
- Press CTRL-C to abort the installation
- Or specify a different location below
[/home/ubuntu/miniconda3] >>>
Preparing transaction: done
Executing transaction: done
installation finished.
Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
[no] >>> ㅛyes
./Miniconda3-py37_4.10.3-Linux-x86_64.sh: 472: ./Miniconda3-py37_4.10.3-Linux-x86_64.sh: [[: not found
no change /home/ubuntu/miniconda3/condabin/conda
no change /home/ubuntu/miniconda3/bin/conda
no change /home/ubuntu/miniconda3/bin/conda-env
no change /home/ubuntu/miniconda3/bin/activate
no change /home/ubuntu/miniconda3/bin/deactivate
no change /home/ubuntu/miniconda3/etc/profile.d/conda.sh
no change /home/ubuntu/miniconda3/etc/fish/conf.d/conda.fish
no change /home/ubuntu/miniconda3/shell/condabin/Conda.psm1
no change /home/ubuntu/miniconda3/shell/condabin/conda-hook.ps1
no change /home/ubuntu/miniconda3/lib/python3.7/site-packages/xontrib/conda.xsh
no change /home/ubuntu/miniconda3/etc/profile.d/conda.csh
modified /home/ubuntu/.bashrc
==> For changes to take effect, close and re-open your current shell. <==
If you'd prefer that conda's base environment not be activated on startup,
set the auto_activate_base parameter to false:
conda config --set auto_activate_base false
Thank you for installing Miniconda3!
가상환경 설치 완료!!!
[가상환경 시작]
source .bashrc
(base) ubuntu@ip-172-31-36-174:~$
[가상환경 세팅 하기]
sudo apt-get update
👇
sudo apt-get upgrade
👇
sudo apt-get install gcc
👇
sudo apt-get install libmysqlclient-dev
[가상환경 만들기]
conda create -n 가상환경이름 python=3.7
[깃 클론]
git clone https://github.com/클론받을 주소
cat requirements.txt
[requirements 설치]
pip install -r requirements.txt
[설치 확인]
pip freeze
[settings에 퍼블릭 아이피주소 추가]
vim settings.py
ALLOWED_HOSTS = ['*', 'x.xx.xxx.60', 'x.xx.xxx.60:8000']
[my_settings.py 만들고 host 부분에 DB 엔드포인트 적어주기]
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DB이름',
'USER': 'root',
'PASSWORD': '비밀번호',
'HOST': 'RDS 엔드포인트',
'PORT': '3306',
}
}
[ 파이썬 패키지 툴인 pip 설치]
sudo apt-get install python-pip
[WAS 배포위해 guicorn 설치]
pip install gunicorn
* WAS(Web Application Server) : 인터넷 상에서 HTTP를 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해 주는 미들웨어(소프트웨어엔진).
< 기본기능 >
1) 프로그램 실행 환경과 데이터베이스 접속 기능을 제공
2) 여러개의 트랜잭션을 관리
3) 업무를 처리하는 비즈니스 로직을 수행
4) Web Service 플랫폼으로서의 역할.
[서버시작(Back-ground)]
gunicorn --bind=0.0.0.0:8000 --daemon flip.wsgi
[서버시작(Fore-ground)]
gunicorn --bind=0.0.0.0:8000 flip.wsgi
(Flip) ubuntu@ip-172-31-36-174:~/24-2nd-FLIP-backend$ nohup gunicorn --bind=0.0.0.:8000 flip.wsgi &
[2] 7634
[1] Exit 127 nohup gunicoron --bind=0.0.0.:8000 flip.wsgi
[설치확인]
ps -ef | grep python
(Flip) ubuntu@ip-172-31-36-174:~/24-2nd-FLIP-backend$ ps -ef | grep python
root 834 1 0 05:26 ? 00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root 876 1 0 05:26 ? 00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
ubuntu 7640 5632 0 23:47 pts/0 00:00:00 grep --color=auto python
[2]+ Exit 1 nohup gunicorn --bind=0.0.0.:8000 flip.wsgi
[서버 죽이기]
kill + -9 + [pid]
[서버 상태 조회]
ps aux | grep gunicorn