ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 8. NestJs & Git Actions 통한 CI/CD - [ AWS EC2 배포 ] - 자동배포 (2)
    카테고리 없음 2023. 2. 3. 22:21

     

    EC2 IAM 설정    저는 미리 만들어서 링크의 4번, 5번을 참조해주세요

     

    ec2 인스턴스 aws-cli 설치

    sudo yum install -y aws-cli
    cd /home/ec2-user
    sudo aws configure
    
    ###
    AWS Access Key ID [None]:
    AWS Secret Access Key [None]:
    Default region name [None]: ap-northeast-2
    Default output format [None]: json
    ###

     


    ec2 인스턴스 codeDeploy agent 설치

     

    sudo yum update
    sudo yum install ruby
    sudo yum install wget
    cd /home/ec2-user
    # 서울 리전일 경우
    wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
    chmod +x ./install
    sudo ./install auto
    sudo service codedeploy-agent start
    sudo service codedeploy-agent status

    ec2 인스턴스 재부팅 시 codeDeploy 자동실행

     

    sudo vi /etc/init.d/codedeploy-startup.sh
    
    
    ###
    # i를 누르고 입력모드로 전환 후
    #!/bin
    sudo service codedeploy-agent restart
    :wq
    
    ###

    .github/workflows/github-actions.yml 수정

     

    name: New Nest Survey
    
    on:
      push:
        # branches: [main]
      pull_request:
        # branches: [main]
    
      workflow_dispatch:
    
    env:
      # 생성한 s3 버킷 이름
      S3_BUCKET_NAME: 
      # 자신의 프로젝트 이름
      PROJECT_NAME: 
      # aws codeDeploy application name
      AWS_CODEDEPLOY_APPLICATION_NAME: 
      # aws codeDeploy application -> deploy-group name
      AWS_CODEDEPLOY_DEPLOYMENT_GROUP_NAME: new-nest-survey-group
    
    jobs:
      # build test
      build:
        runs-on: ubuntu-latest
    
        steps:
          # 레파지토리 코드를 git actions 리눅스로 가져온다.
          - name: Checkout Repository
            uses: actions/checkout@v2.4.2
          # 리눅스 node 설치, 나는 ec2에 설치된 node의 버전과 동일하게 설정
          - name: Setup Node.js environment
            uses: actions/setup-node@v3.4.1
            with:
              node-version: 16.19.0
    
          - name: Install Dependencies
            run: npm install
    
          - name: Build a Nest Application
            run: npm run build
            shell: bash
      # build 테스트를 통과하면 배포
      deploy:
        runs-on: ubuntu-latest
        needs: build
        steps:
          - name: Checkout Repository
            uses: actions/checkout@v2.4.2
    
          - name: Setup Node.js environment
            uses: actions/setup-node@v3.4.1
            with:
              node-version: 16.19.0
    
          - name: Install Dependencies
            run: npm install
    
          - name: Build a Nest Application
            run: npm run build
            shell: bash
          # build 파일 압축
          - name: Make a zip file
            run: zip -r ./$GITHUB_SHA.zip . -x "node_modules/*" "coverage/*" "src/*" "test/*" "README.md" "*.git*"
            shell: bash
          # aws cli
          - name: Configure AWS credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              aws-region: ${{ secrets.AWS_REGION }}
          # s3 버킷에 압축된 build 파일 업로드
          - name: Upload to S3
            run: aws s3 cp --region ${{ secrets.AWS_REGION }} ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
          - name: Request Deployment
            run: aws deploy create-deployment --application-name $AWS_CODEDEPLOY_APPLICATION_NAME --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name $AWS_CODEDEPLOY_DEPLOYMENT_GROUP_NAME --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip

    /경로에 appspec.yml 생성

    version: 0.0
    os: linux
    files:
      - source: /
        destination: /home/ec2-user/build 
        overwrite: yes
    permissions: 
      - object: /home/ec2-user/build
        owner: ec2-user
        group: ec2-user
        mode: 755
    hooks:
      AfterInstall:
        - location: scripts/deploy.sh
          timeout: 300
          runas: root

    scripts/deploy.sh

     

    
    #!/bin/bash
    REPOSITORY=/home/ec2-user/build
    
    cd $REPOSITORY
    
    sudo pm2 start "node dist/main.js"

    배포 테스트 시작!

     

    git actions 통과!

    s3 정상 업로드

    codedeploy-agent -> s3 ->  zip 파일 다운로드 성공

    scripts/deploy.sh 실패


    pm2 명령어를 찾을 수 없어 심볼릭 링크로 연결 node 또한 마찬가지일거라고 판단해서 node, npm도 심볼릭 링크 생성

    # ec2 instance
    
    cd /usr/bin
    
    which pm2
    ~/.nvm/versions/node/v16.19.0/bin/pm2 # 결과
    
    which node
    ~/.nvm/versions/node/v16.19.0/bin/node # 결과
    
    sudo ln -s /home/ec2-user/.nvm/versions/node/v16.19.0/bin/pm2
    sudo ln -s /home/ec2-user/.nvm/versions/node/v16.19.0/bin/node
    sudo ln -s /home/ec2-user/.nvm/versions/node/v16.19.0/bin/npm
    cd
    
    [TEST]
    sudo /usr/bin/pm2 list
    
    pm2 list가 출력되면 심볼릭 링크를 정상적으로 생성한 것

    결과

    sudo pm2 명령이 실행 후 바로 에러처리 되는걸 확인

    sudo pm2 logs --err --lines 100 명령으로 에러 체크

    --> deploy.sh 명령에 npm install을 안해줘서 빌드 디렉토리에 모듈이 존재하지 않아서 발생하는 에러


    deploy.sh 수정 후 테스트

     

    #!/bin/bash
    REPOSITORY=/home/ec2-user/build
    
    cd $REPOSITORY
    
    sudo /usr/bin/npm i
    sudo /usr/bin/pm2 kill
    sudo /usr/bin/pm2 start "node dist/main.js"

    결과

     

    pm2 정상

     dns 접속 정상

Designed by Tistory.