단어들: ssh, nginx, Docker, GitHub Actions
1. ssh란?
ssh란 Secure Shell의 줄임말이다. 아래 명령어는 원격서버에 보안 연결로 접속하는 명령어이다.
.pem은 Private Key 파일 확장자로 EC2 인스턴스를 만들 때 생성되는 비밀번호 대신 사용하는 인증키이다.
ssh -i my-key.pem ubuntu@your-ip
* 도서추천: 처음 배우는 AWS, 모두의 리눅스
2. nginx
가볍고 빠른 웹 서버 소프트웨어이다.
정적 파일(=프론트 빌드 파일)을 클라이언트에게 전달(=서빙)하거나 백엔드 API 서버로 프록시 연결도 해준다.
nginx는 EC2 혹은 Docker 컨테이너 내부에서 실행된다.
3. Docker란?
앱 실행 환경을 통째로 포장한 박스이다. 환경설정 + 배포 + 실행을 표준화하는 기술이다.
Node, Python, MySQL, Redis 등을 설치할 필요 없이 하나의 이미지로 어디서든 동일한 환경으로 실행가능하다.
Dockerfile을 작성하고 docker build 명령어로 이미지를 생성한다.
여기서 이미지란 컨테이너를 만들기 위한 설계도 + 재료들이 담긴 것이다.
(Dockerfile -> 이미지 -> 그 이미지를 컨테이너로 실행)
Step 1. Dockerfile 생성
# Node.js 앱을 위한 Dockerfile
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]
Step 2. 이미지 만들기
docker build -t my-app .
Step 3. 이미지로부터 컨테이너 만들고 실행하기
// -p 3000:3000: 내 컴퓨터의 3000번 포트를 컨테이너의 3000번 포트에 연결하겠다는 뜻
// my-app: 실행할 Docker 이미지 이름
docker run -p 3000:3000 my-app
3-1. Docker의 실행환경
내 PC에서 run (무료)
AWS EC2에서 run
AWS ECS / Fargate 사용
Docker Hub 저장
4. GitHub Actions
CI(빌드 & 테스트): 코드 푸시 시 자동 실행
CD(배포): EC2에 SSH 접속하여 최신 코드 배포
.github/workflows/deploy.yml
EC2에 SSH로 접속해서 배포하는 예시
name: Deploy to EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Copy files to EC2 via SSH
uses: appleboy/scp-action@v0.1.1 // scp-action: 코드를 EC2로 복사
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
source: "."
target: "/home/ubuntu/app"
- name: Run remote deploy commands
uses: appleboy/ssh-action@v1.0.0 // ssh-action: EC2 접속 후 배포 명령어 실행
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd /home/ubuntu/app
docker-compose down
docker-compose up -d --build