-
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 접속 정상