AMI
구성 요소
AMI는 AWS에서 인스턴스를 시작하기 위한 기본 템플릿이다. AMI는 다음과 같은 것들을 포함한다.
- 운영 체제
- 설치된 소프트웨어
- 파일 및 설정 정보
장점
동일한 환경 유지: 같은 설정을 가진 인스턴스를 여러 대를 생성하여 일관된 환경을 제공
배포 시간 단축: 설정 및 애플리케이션이 미리 포함된 이미지를 사용하여, 인스턴스 생성 시간을 단축
백업 및 복구: 현재 설정된 인스턴스 상태를 AMI로 지정하여 필요할 때 쉽게 복구
AMI 생성
인스턴스를 활용하여 AMI를 만들 수 있는데, 인스턴스가 있으면 아래의 내용 순서대로 진행하면 되고 그렇지 않으면 인스턴스를 먼저 만들어 주면 된다.
1. EC2 대시보드로 이동
2. AMI로 만들 인스턴스 선택
3. 상단의 Actions 메뉴를 클릭, Image and templates -> Create image 선택
4. 이미지 이름과 설명 입력, 볼륨의 크기 선택 (실습에서는 볼륨의 크기는 기본값으로 설정)
인스턴스 생성
인스턴스가 존재한다면 건너뛰고 진행했을 내용이다.
중요한 설정은 SSH접속을 할 수 있도록 Public IP 할당을 활성화하고 Public Subnet을 설정하고 보안 그룹을 퍼블릭 보안 그룹으로 설정해준다.
인스턴스가 실행이 되었으면, 인스턴스 커넥터를 사용해서 접속해주고 필요한 소프트웨어를 설치해준다.
나는 Django를 배포할 것이기 때문에 아래와 같은 소프트웨어를 설치해주었다.
# git & nginx 설치
sudo yum install -y git nginx
# 파이썬 최신 버전 설치
sudo yum groupinstall "Development Tools" -y
sudo yum erase openssl-devel -y
sudo yum install openssl-devel bzip2-devel libffi-devel zlib-devel wget -y
cd /usr/src
sudo wget https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tgz
sudo tar xzf Python-3.11.6.tgz
cd Python-3.11.6
sudo ./configure --enable-optimizations
sudo make altinstall
# PostgreSQL 개발 도구 설치
sudo yum install postgresql-devel # Amazon Linux 2
Launch Template
시작 템플릿은 EC2인스턴스를 시작할때 필요한 모든 설정 정보를 미리 정의하는 템플릿이다. EC2 인스턴스를 쉽게 생성할 수 있을 뿐 아니라, 추후 사용하는 Auto Scaling, EC2 스팟 인스턴스, 온디맨드 인스턴스 등에 적용할 수 있어 유연한 배포를 도와준다.
구성 요소
EC2인스턴스를 시작하기 위한 구성 정보를 포함하는 템플릿이다.
- AMI - 인스턴스의 운영 체제와 소프트웨어 템플릿
- Instance Type - 인스턴스의 CPU, 메모리 크기 설정
- key Pair - SSH 접속에 사용할 키 페어
- Security Group - 인스턴스 트래픽을 제어하는 방화벽 규칙
- Network Settings - VPC 및 서브넷 설정
- Storage Volumes - EBS 볼륨 설정
- User Data - 인스턴스 부팅 시 실행할 스크립트
Launch Template 생성
1. 이름, 버전 설명을 간단히 작성해준다.
2. Auto Scaling을 사용할 것이기 때문에, Guidance를 체크해주었다.
3. Owned by me에 앞서 만든 AMI를 선택
4. Instance는 프리티어 아무거나
5. Key pair 역시 기존에 사용하던 것으로 선택
6. 서브넷은 오토 스케일링 그룹을 만들때 선택할 수 있어, 포함하지 않았다.
7. 보안 그룹을 프라이빗으로 선택하고, 유저 데이터 입력
유저 데이터의 경우 Django를 배포할 예정이므로 아래와 같이 작성하였다.
#!/bin/bash
#패키지 업데이트
sudo yum update -y
# 디렉토리 이동
cd /home/ec2-user/
#Git 레포지토리 클론 및 브랜치로 이동
git clone https://github.com/jong-seoung/TodoList.git
# 권한 변경
sudo chown ec2-user:ec2-user TodoList
sudo chmod 777 TodoList
cd TodoList/
# 가상환경 & 라이브러리 설치
python3.11 -m venv venv
source venv/bin/activate
sudo yum install postgresql-devel
pip install gunicorn
python3.11 -m pip install --upgrade pip
pip install -r requirements/common.txt
# Django 설정 파일에 RDS 정보 추가 (.env 파일 생성)
cat <<EOF > .env
SECRET_KEY=시크릿키 입력
# RDS PostgreSQL 정보
DB_NAME=데이터베이스 이름
DB_USER=데이터베이스 유저명
DB_PASSWORD=데이터베이스 비밀번호
DB_HOST=데이터베이스 엔드포인트
DB_PORT=5432
EOF
# Nginx 설정
sudo cat <<EOF > /etc/nginx/conf.d/django.conf
server {
listen 80;
server_name 퍼블릭 IP(bastion Host);
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
location /static/ {
alias /home/ec2-user/TodoList/static/;
}
location /media/ {
alias /home/ec2-user/TodoList/media/;
}
}
EOF
# Nginx 재실행
sudo systemctl restart nginx
# 마이그레이션 실행
python3.11 manage.py migrate
# Gunicorn을 Systemd 서비스로 등록
sudo cat <<EOF > /etc/systemd/system/django.service
[Unit]
Description=Django Gunicorn Server
After=network.target
[Service]
User=ec2-user
WorkingDirectory=/home/ec2-user/TodoList
ExecStart=/home/ec2-user/TodoList/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 TodoList.wsgi:application
[Install]
WantedBy=multi-user.target
EOF
# Nginx 설정 테스트 및 재 시작
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl enable nginx
# Django 서버 실행
sudo systemctl daemon-reload
sudo systemctl start django
sudo systemctl enable django
'BackEnd > 인프라' 카테고리의 다른 글
[AWS] RDS 읽기 복제본 - 읽기 트래픽 분산 (0) | 2024.10.10 |
---|---|
[AWS] RDS - 관계형 데이터 베이스 (0) | 2024.10.10 |
[AWS] RDS 인스턴스 생성, 연결 (0) | 2024.10.07 |
[AWS] EC2 사용자 데이터가 재 실행 되도록 설정(테스트 목적) (0) | 2024.10.07 |
[AWS] IAM Identity Center 계정 사용자 만들기 & 로그인 (0) | 2024.09.27 |