[ CI/CD ] EC2, Nginx, GitAction

·2023년 9월 15일
0

AWS

목록 보기
1/1
post-thumbnail

이 회사에 입사하자마자 새로운 프로젝트를 만들어야했고, 프론트엔드 플젝은 알아서 배포해야한다는 청천벽력(?)과 같은 말을 들었다.
어차피 Next.js를 안쓰고 CRA로 만든 프로젝트를 쓰다 보니 S3에 build 파일 올리는 형식으로 배포하면 되겠다 생각했는데... 여차저차의 이유로 EC2 instance로 배포하라고 하셨다.
instance 사양도 t3a nano로.... 처음에 많은 난관에 부딪혔다.
1. instance로 배포하면 정적 build 파일이더라도 instance가 백그라운드에서 계속 실행되게 해야하는데 어떻게 할지? -> 나는 어설프게나마 Docker로 돌려 본 경험은 있다
2. 부트캠프에서 플젝 배포할 때 요금 생각안하고 빵빵한 사양으로 돌렸던 instance에서도 build할 때 멈추던 경험이 있는데 nano 사양에서 npm run build가 돌아갈지...? -> 역시나 안돌아갔다

저 두 가지의 큰 난관 아닌 난관을 어떻게 풀어가야할까란 생각을 하다 결론을 지었다.

  • instance 백그라운드 실행을 위해 Nginx를 사용하자!
  • npm run build가 절대 안돌아가니 gitignore 파일에서 build 주석을 슬며시 풀어주어 로컬에서 npm run build를 실행하고 build 파일을 git에 함께 올리자.......!

이런 결론에 따라... instance 안에 Nginx를 설치하고 github default branch (master 아니면 main)에 push하면 build 파일을 pull 받아 배포되는 GitAction을 설정한 과정을 대략적으로 정리해보고자 한다!

EC2 instance 생성

  • 애플리케이션 및 OS 이미지
    Amazon Linux
    Amazon Machine Image (AMI) : 위에서 두번째 선택
  • 인스턴스 유형 : t3a.nano
  • 키 페어 (로그인) : 새 키 페어 생성에서 instance명과 같은 이름으로 ppk 생성 후 ppk 파일 드라이브에 저장
  • 네트워크 설정 : ‘인터넷에서 HTTPS 트래픽 허용’, ‘인터넷에서 HTTP 트래픽 허용’ 체크

탄력적 IP

  • 탄력적 IP 주소 할당
  • 생성된 ip 선택 → 작업 → 탄력적 IP 주소 연결
  • 인스턴스 해당 프로젝트로 선택

instance 보안 설정

  • 인스턴스 - 보안 - 보안그룹 - 인바운드 규칙 편집 - 규칙추가 해서 3000포트 넣기

instance root 계정 활성화

  • 인스턴스 연결 - sudo su 로 루트계정 실행
  • sshd 설정 파일에서 주석 풀기
vi /etc/ssh/sshd_config
:set number
38번째줄 "PermitRootLogin yes" 주석 해제
  • 접근권한 파일 root 계정 폴더로 옮기기
sudo cp /home/ec2-user/.ssh/authorized_keys /root/.ssh
  • sshd 재시작
systemctl restart sshd

instance에 git 설치 후 git clone

  • git 설치
yum install git -y
  • git 계정 정보 저장
git config credential.helper store

nginx 설치 및 설정

**nginx 설치**
sudo amazon-linux-extras install nginx1 -y

**nginx 실행**
sudo systemctl start nginx.service

**nginx 상태 확인**
service nginx status

**nginx 설정 변경**
cd /etc/nginx
vi nginx.conf

**아래부분 다음과 같이 수정**
server {
        listen 3000;
        listen [::]:80;

        root /home/프로젝트명/build;

**새로고침 404 수정
아래부분 추가**
location / {
          try_files $uri /index.html;
        }
****
**nginx 재시작**
service nginx restart

github Action 설정 (CI/CD)

github secrets 설정

  • repo - Settings - Secrets and variables - Actions
  • New repository secret으로 secret 생성
    • REMOTE_SSH_HOST : 인스턴스 IP 넣기 (퍼블릭 IPv4 DNS)
    • REMOTE_SSH_USER : root
    • REMOTE_SSH_KEY : 저장해둔 ppk 파일 pem으로 변환하여 해당 내용 복붙
      • PuTTY gen - Load - ppk 파일 선택 - Conversions - Export OpenSSH key 저장
    • REMOTE_SSH_PORT : 22

프로젝트 내 action 관련 deploy파일 설정

  • 프로젝트 내 /.github/workflows/deploy.yml 파일 생성
# Deploy
name: Deploy

on:
  push:
    branches: [master] # 마스터 브랜치에 push될 경우 배포

jobs:
  deploy:
    name: deploy
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: excuting remote ssh commands
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.REMOTE_SSH_HOST }} # 인스턴스 IP
          username: ${{secrets.REMOTE_SSH_USER}} # user
          key: ${{ secrets.REMOTE_SSH_KEY }} # ec2 instance pem key
          port: ${{ secrets.REMOTE_SSH_PORT }} # 접속포트
          script: |
            cd /home
            cd [ git clone한 프로젝트명 ]
            git pull
            service nginx restart
profile
개발을 개발새발 열심히➰🐶

0개의 댓글