유랑하는 나그네의 갱생 기록

だけど素敵な明日を願っている -HANABI, Mr.children-

Devlog/Infra

[AWS] 프로젝트 초기 EC2 인프라 작업

Madirony 2024. 7. 28. 20:54
728x90

AWS EC2

AWS?

 AWS EC2(Amazon Elastic Compute Cloud)클라우드 환경에서 가상 서버를 쉽게 생성하고 관리할 수 있는 서비스입니다. EC2는 사용자가 필요에 따라 컴퓨팅 리소스를 유연하게 사용할 수 있도록 돕습니다. 초기 비용을 절감할 수 있고, 관리 효율성과 확장성을 제공하는 장점이 있습니다.

 

팀 프로젝트할 때 로컬 환경에서만 작업하다가 클라우드 환경으로 옮겼었는데 엄청 편리해졌습니다..

부트캠프에서 프로젝트할 때 EC2를 지급받는데 시간이 좀 걸렸었는데,

"어? 내 컴퓨터에서는 되는데 왜 님 컴에서는 안됨?"

같은 상황이 많이 발생했습니다. 하지만 EC2를 받고 인프라 세팅을 하고 나서는 그런 일이 발생하지 않았죠.

 

그러니 ASAP.. 초기 인프라 작업을 ..


기본 Setting

 노션에 메모해 놨던 내용들을 복기하면서 적는 거라 스크린샷은 따로 준비해두지 않았습니다. 어차피 CLI 환경이니 크게 상관은 없지만.. 나머지는 프로젝트를 진행하면서 필요하다 싶으면 그때 설정해 주면 됩니다.

 

 pem 파일은 Putty를 사용할 경우에는 따로 ppk파일로 변환해서 접속해야 하지만, MobaXterm을 사용하면 엄청 편리하니 참고하세요. 파일 전송도 MobaXterm이 잘되어있습니다. 다만 Mac 버전은 없습니다 ..

ubuntu 계정 초기 비밀번호 설정

 예전부터 곁에서 봐왔던 보안 이슈로 인해 root 계정과 ubuntu 계정의 비밀번호를 제일 먼저 설정하였습니다.

sudo passwd root

-----------------

sudo su -
passwd ubuntu

패키지 업데이트

sudo apt-get -y update && sudo apt-get -y upgrade

 시스템 패키지 목록을 최신화하고, 설치된 패키지를 최신 버전으로 업그레이드합니다. y 옵션은 명령 실행 중 발생하는 모든 yes/no 질문에 대해 자동으로 yes 해주는 옵션입니다.

timezone 설정

sudo timedatectl set-timezone Asia/Seoul

 로그 기록과 시스템 작업에 중요한 서버 시간 설정. 한국 시간대에 맞게 바꿔줍니다.

우분투 패키지 저장소 변경 : 미러 서버

sudo sed -i 's/ap-northest-2.ec2.archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list

 기존 패키지 서버를 통해 패키지를 받아도 되긴 하지만, 패키지 업데이트 속도를 높이기 위해 가까운 지역의 패키지 미러 서버를 사용하는 것이 좋습니다.

Swap Memory 설정

 여기서 잠깐 스왑 메모리에 대해서 짚고 넘어가겠습니다. 스왑 메모리는 시스템의 물리적 RAM이 부족할 때 임시 저장 공간으로 사용되는 디스크 영역입니다. 스왑 공간을 설정하면 메모리 관리를 더 효율적으로 할 수 있으며, 시스템의 성능과 안정성을 높일 수 있습니다. 프로젝트를 할 때, 배포 환경에서 갑자기 서비스가 터지던 이유 중 하나가 메모리 부족이었습니다. 그걸 이제 스왑 메모리를 통해 방지하는 거죠.

 

 일반적으로는 권장 스왑 메모리는 RAM의 2배라고는 하는데 글쎄요. RAM이 너무 작지 않은 이상 20% 정도로 해도 충분합니다.

sudo fallocate -l 4G /swapfile

먼저 필요한 크기의 스왑 파일을 생성합니다.

 

sudo chmod 600 /swapfile

권한도 파일 소유자만 읽고 쓸 수 있게 설정합니다.

 

sudo mkswap /swapfile

	Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
	no label, UUID=9a362582-ec25-488e-8a93-e102ce024999

스왑 파일을 스왑 공간으로 사용하기 위해 초기화합니다.

 

sudo swapon /swapfile
sudo echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

	/swapfile none swap sw 0 0

초기화된 스왑 파일을 활성화하고 시스템에서 사용할 수 있도록 합니다. 추가로, 시스템 재부팅 시 스왑 파일이 자동으로 활성화되도록 설정합니다.

 

free -h

	              total        used        free      shared  buff/cache   available
	Mem:           15Gi       773Mi        13Gi       1.0Mi       952Mi        14Gi
	Swap:         4.0Gi          0B       4.0Gi

그 후 스왑 메모리가 잘 할당됐는지 확인합니다.

 

ufw (우분투 방화벽) 포트 설정하기

 일단은 제가 사용했었던 EC2는 ssh 22번 포트만 열려있어서 다른 포트를 열어줘야 했습니다.

sudo ufw status

ufw 상태를 확인하는 명령어입니다.

 

sudo ufw allow 22

사용할 포트를 허용

 

sudo ufw show added

등록한 포트 조회

 

sudo ufw enable

ufw 활성화

 

sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 22 (v6)                    ALLOW IN    Anywhere (v6)

ufw 상태 확인 (번호)

 

sudo ufw allow 80

80번 포트도 추가합시다.

 

sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 80                         ALLOW IN    Anywhere
[ 3] 22 (v6)                    ALLOW IN    Anywhere (v6)
[ 4] 80 (v6)                    ALLOW IN    Anywhere (v6)

추가했으면 삭제하는 법도 알아야겠죠?

 

$ sudo ufw delete 4
$ sudo ufw delete 2
$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 22 (v6)                    ALLOW IN    Anywhere (v6)
sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

삭제는 반드시 enable을 해줘야 적용됩니다.

 


 

 일단은 기본적인 작업은 끝났습니다. Docker와 Nginx 그리고 Certbot 설정까지만 알려드리겠습니다. 다른 설정들은 프로젝트를 진행하면서 적용하면 되겠습니다.

Docker

Docker 설치

sudo apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

 HTTPS를 통한 패키지 다운로드, 인증서 검증, 외부 저장소 관리 기능 등 시스템의 보안과 기능성을 향상하는 데 필수적인 패키지들을 설치합니다.

 

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
	OK

Docker 저장소 등록

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Docker 패키지 설치

sudo apt-get -y install docker-ce docker-ce-cli containerd.io

Docker 일반 유저 권한

sudo usermod -aG docker ubuntu

Docker 버전 확인

 sudo docker version
Client: Docker Engine - Community
 Version:           25.0.4
 API version:       1.44
 Go version:        go1.21.8
 Git commit:        1a576c5
 Built:             Wed Mar  6 16:32:14 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          25.0.4
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.8
  Git commit:       061aa95
  Built:            Wed Mar  6 16:32:14 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.28
  GitCommit:        ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Docker 디스크 확인

sudo docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          0         0         0B        0B
Containers      0         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

Docker compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 56.7M  100 56.7M    0     0  35.4M      0  0:00:01  0:00:01 --:--:--  114M

Docker compose 실행 권한

sudo chmod +x /usr/local/bin/docker-compose

 


Nginx

Nginx 이미지 다운로드

sudo docker pull nginx

Nginx 서버 가동

sudo docker container run --name nginx-container -d -p 80:80 nginx
609dc8741bd1f3d0b62031bcd8897607a6dda411c0363f3759e98f6b91b000d8

sudo docker run -d --restart always -p 80:80 -p 443:443 -e TZ=Asia/Seoul --name nginx -u root nginx:latest

Nginx 작동 확인

sudo docker container ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
a5ba04a16d43   nginx          "/docker-entrypoint.…"   26 seconds ago   Up 26 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp                      nginx-container
3da91439788c   mysql:8.0.36   "docker-entrypoint.s…"   16 minutes ago   Up 16 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql-container

Nginx 컨테이너 가동 확인

 sudo docker container stats nginx-container
CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS
a5ba04a16d43   nginx-container   0.00%     4.5MiB / 15.61GiB   0.03%     726B / 0B   0B / 8.19kB   5

Nginx 서버 작동 확인

nginx

Nginx 컨테이너 정지 및 실행

docker stop nginx-container
docker start nginx-container

 


Nginx Certbot

sudo docker exec -it nginx bash

컨테이너에 Certbot 패키지 설치하기

$ apt-get update
$ apt-get install certbot python3-certbot-nginx

Nginx 설정 파일 수정하기

vim /etc/nginx/conf.d/default.conf
// default.conf

server {
    listen       80;

    # 수정
    server_name  자신의 도메인;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # 이 부분 추가
    location /.well-known/acme-challenge/ {
        allow all;
        root /var/www/certbot;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
$ certbot —-nginx -d 도메인
email
y
y

갱신 테스트

root@e6b4082142ec:/# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/{도메인}.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for {도메인}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/{도메인}/fullchain.pem (success)

인증이 성공적으로 마무리되었다면 기본적으로 암호키는 /etc/letsencrypt/live/도메인/ 아래에 생성되며, 자동 설정을 선택했다면 결과물은 다음과 같습니다.

 

Processing /etc/letsencrypt/renewal/{도메인}.conf

 

728x90