(AWS) AWS Lightsail Nest Js 인스턴스 CI/CD

최건·2025년 5월 8일

참고 블로그

과정

  1. Lightsail 인스턴스 생성 후 SSH 키페어 생성
  2. IAM 사용자 생성 및 AWS AccessKey 발급 받기
  3. Lightsail에 aws-cli 설치
  4. Lightsail에 configure 설정
  5. Github 프로젝트(리포지토리)에 SecretKey 등록
  6. Github Action의 Workflow 생성

1. Lightsail 인스턴스 생성 후 SSH 키페어 생성

  • SSH key > Create custom key 클릭




  • 다운로드 받은 .pem키 원하는 곳에 위치 시키기 (Desktop, ssh ...)

  • 해당 .pem을 cat으로 열어서 저장해놓기 (---BEGIN RSA PRIVATE KEY---- 부터 제일 마지막 ---END RSA PRIVATE KEY--- 을 포함한 값까지!)

  • 아래의 경우 맨 마지막에 보이는 %는 포함시키면 안된다 (이거 때문에 오류가

  • 권한 에러가 날 수 있기 때문에 권한 수정해놓기
chmod 400 CICDTEST.pem

2. IAM 사용자 생성 및 AWS AccessKey 발급 받기

  • IAM에서 사용자 생성 → 권한은 AWSCodeDeplyFullAccess 추가하기 → 생성 후 액세스 키 생성해서 다운 받기

3. Lightsail에 aws-cli 설치

  • aws-cli 설치:
sudo apt-get update && sudo apt-get install awscli

  • 설치 후 버전 확인 :

aws --version

4. Lightsail Configure 설정하기

aws configure
  • AWS Access Key ID: IAM에서 발급받은 ACCESS_ID
  • AWS Secret Access Key ID: IAM에서 ACCESS_KEY
  • region:  ap-northeast-2 (서울)
  • output format : json

5. Github 프로젝트에 SecretKey 등록하기

  • CI/CD를 적용할 리포지토리의 Settings > Secrets and variables > Actions 클릭

  • 이후 키 등록

    • AWS_ACCESS_KEY_ID : IAM에서 발급 받은 ACCESS_ID
    • AWS_SECRET_ACCESS_KEY: IAM에서 발급 받은 ACCESS_KEY
    • LIGHTSAIL_HOST: Lightsail 인스턴스의 public IP
    • LIGHTSAIL_SSH_KEY: 인스턴스를 생성할 때 발급받은 SSH 키페어.
      • ---BEGIN RSA PRIVATE KEY---- 부터 제일 마지막 ---END RSA PRIVATE KEY--- 을 포함한 값까지!
  • 예시)
    Name: AWS_ACCESS_KEY_ID
    Secret: IAM 콘솔에서 발급 받은 ACCESS_ID

6. Github Actions Workflow 생성

  • CI/CD를 적용할 리포지토리의 Actions > set up a workflow yourself 클릭

  • 아래 코드 복붙

name: CI CD

on:
  push:
    branches: ['main']
  pull_request:
    branches: ['main']

env:
  LIGHTSAIL_SSH_KEY: ${{ secrets.LIGHTSAIL_SSH_KEY }}
  LIGHTSAIL_HOST: ${{ secrets.LIGHTSAIL_HOST }}
  LIGHTSAIL_USERNAME: bitnami
  AWS_REGION: ap-northeast-2

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: 소스 코드 체크아웃
        uses: actions/checkout@v3

      - name: Node.js 설정
        uses: actions/setup-node@v3
        with:
          node-version: 20 // 원하는 버전 선택

      - name: 의존성 설치
        run: sudo npm install

      - name: 빌드
        run: sudo npm run build

      - name: AWS 자격 증명 설정
        uses: aws-actions/configure-aws-credentials@v3
        with:
          aws-region: ${{ env.AWS_REGION }}
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

      - name: SSH 키 설정
        run: |
          mkdir -p $HOME/.ssh
          echo "${{ secrets.LIGHTSAIL_SSH_KEY }}" > $HOME/.ssh/deploy_key
          chmod 600 $HOME/.ssh/deploy_key
          eval $(ssh-agent -s)
          ssh-add $HOME/.ssh/deploy_key
          ssh-keyscan -H ${{ secrets.LIGHTSAIL_HOST }} >> $HOME/.ssh/known_hosts

      - name: 기존 디렉토리 정리 및 권한 설정
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.LIGHTSAIL_HOST }}
          username: ${{ env.LIGHTSAIL_USERNAME }}
          key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
          script: |
            sudo rm -rf /home/bitnami/test-cicd // test-cicd를 자신의 프로젝트명으로 수정!            sudo mkdir -p /home/bitnami/test-cicd
            sudo chown -R bitnami:bitnami /home/bitnami/test-cicd // test-cicd를 자신의 프로젝트명으로 수정!
            sudo chmod -R 755 /home/bitnami/test-cicd // test-cicd를 자신의 프로젝트명으로 수정!

      - name: 애플리케이션 파일 배포
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.LIGHTSAIL_HOST }}
          username: ${{ env.LIGHTSAIL_USERNAME }}
          key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
          source: 'dist/,package.json,package-lock.json'
          target: '/home/bitnami/test-cicd' // test-cicd를 자신의 프로젝트명으로 수정!
          strip_components: 0
          overwrite: true

      - name: PM2 프로세스 재시작
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.LIGHTSAIL_HOST }}
          username: ${{ env.LIGHTSAIL_USERNAME }}
          key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
          script: |
            cd /home/bitnami/test-cicd // test-cicd를 자신의 프로젝트명으로 수정!
            sudo npm ci --production
            sudo pm2 restart main || sudo pm2 start dist/main.js --name main

workflow 설명

name: CI CD

# main 브랜치에 push 또는 pull request 발생 시 워크플로우 실행
on:
  push:
    branches: ['main']
  pull_request:
    branches: ['main']

# 공통 환경 변수 정의 (GitHub Secrets 사용)
env:
  LIGHTSAIL_SSH_KEY: ${{ secrets.LIGHTSAIL_SSH_KEY }}
  LIGHTSAIL_HOST: ${{ secrets.LIGHTSAIL_HOST }}
  LIGHTSAIL_USERNAME: bitnami
  AWS_REGION: ap-northeast-2

jobs:
  deploy:
    runs-on: ubuntu-latest  # 최신 Ubuntu 환경에서 실행

    steps:
      # GitHub 저장소에서 소스 코드를 체크아웃
      - name: 소스 코드 체크아웃
        uses: actions/checkout@v3

      # Node.js 20버전 설정
      - name: Node.js 설정
        uses: actions/setup-node@v3
        with:
          node-version: 20 # 원하는 Node.js 버전

      # npm 의존성 설치
      - name: 의존성 설치
        run: sudo npm install

      # 빌드 명령 실행 (예: Next.js 앱 빌드)
      - name: 빌드
        run: sudo npm run build

      # AWS 자격 증명 환경 설정 (Secrets에 저장된 키 사용)
      - name: AWS 자격 증명 설정
        uses: aws-actions/configure-aws-credentials@v3
        with:
          aws-region: ${{ env.AWS_REGION }}
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

      # Lightsail 서버 접근을 위한 SSH 키 설정
      - name: SSH 키 설정
        run: |
          mkdir -p $HOME/.ssh
          echo "${{ secrets.LIGHTSAIL_SSH_KEY }}" > $HOME/.ssh/deploy_key
          chmod 600 $HOME/.ssh/deploy_key
          eval $(ssh-agent -s)
          ssh-add $HOME/.ssh/deploy_key
          ssh-keyscan -H ${{ secrets.LIGHTSAIL_HOST }} >> $HOME/.ssh/known_hosts

      # 서버에서 기존 프로젝트 디렉토리 삭제 후 재생성, 권한 설정
      - name: 기존 디렉토리 정리 및 권한 설정
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.LIGHTSAIL_HOST }}
          username: ${{ env.LIGHTSAIL_USERNAME }}
          key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
          script: |
            # 기존 디렉토리 삭제 및 생성 (프로젝트명에 따라 경로 변경 가능)
            sudo rm -rf /home/bitnami/test-cicd
            sudo mkdir -p /home/bitnami/test-cicd
            sudo chown -R bitnami:bitnami /home/bitnami/test-cicd
            sudo chmod -R 755 /home/bitnami/test-cicd

      # 빌드된 파일을 서버로 전송
      - name: 애플리케이션 파일 배포
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.LIGHTSAIL_HOST }}
          username: ${{ env.LIGHTSAIL_USERNAME }}
          key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
          source: 'dist/,package.json,package-lock.json'
          target: '/home/bitnami/test-cicd' # 이 경로는 프로젝트명에 맞게 수정
          strip_components: 0
          overwrite: true

      # PM2를 통해 앱 재시작 또는 새로 시작
      - name: PM2 프로세스 재시작
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.LIGHTSAIL_HOST }}
          username: ${{ env.LIGHTSAIL_USERNAME }}
          key: ${{ secrets.LIGHTSAIL_SSH_KEY }}
          script: |
            cd /home/bitnami/test-cicd  # 해당 디렉토리로 이동
            sudo npm ci --production    # production 환경용 의존성만 설치
            # main이라는 이름으로 프로세스를 재시작, 없으면 새로 실행
            sudo pm2 restart main || sudo pm2 start dist/main.js --name main
profile
개발이 즐거운 백엔드 개발자

0개의 댓글