-
NestJS + Bitbucket pipelines + EC2 + CodeDeploy (CI/CD) - 2공부/AWS 2025. 1. 20. 00:21
지난번에 작성했던 부분을 이어서 작성하도록 하겠습니다. 혹시라도 전 부분을 확인 안 하셨다면 읽으신 다음에 동일하게 진행 부탁드리겠습니다.
NestJS + Bitbucket pipelines + EC2 + CodeDeploy (CI/CD) - 1
Nestjs로 CI/CD를 구축하면서 여러 가지를 시도해 보고 해결을 했던 부분을 기록하려고 합니다.제가 성공했던 방법은 총 2가지 입니다. 1. NestJS + Bitbucket Pipelines 만을 이용하여 CI/CD2. NestJS(PM2로 실행
baam.tistory.com
1. Bitbucket Pipelines 작성
image: node:18 definitions: // 공통된 부분은 definitions를 이용하여 정의하였습니다. steps: - step: &build-step name: Install and Build caches: - node script: - npm install - npm run build artifacts: // 다음 스탭으로 파일을 전달합니다. - dist/** - appspec.yml - scripts pipelines: branches: dev: - step: *build-step // definitions에 정의된 step을 이용합니다. - step: name: Package Dev script: # zip 설치 - apt-get update && apt-get install -y zip # 필요한 파일을 dist 디렉터리에 복사 - cp scripts/execute.sh dist/scripts/ - cp scripts/restart.sh dist/scripts/ - cp appspec.yml dist/ // 압축할 파일에 appspec.yml이 있어야 합니다. # dist 디렉터리를 .zip 파일로 압축 - zip -r ./dist.zip dist/ artifacts: - dist.zip - step: name: Deploy to DEV image: amazon/aws-cli:2.13.4 // aws cli를 이용할 수 있도록 image를 설정합니다. script: # 1. S3에 업로드 - aws s3 cp ./dist.zip s3://$S3_BUCKET/ --region $AWS_DEFAULT_REGION # 2. CodeDeploy upload - pipe: atlassian/aws-code-deploy:1.5.1 variables: AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION APPLICATION_NAME: $AWS_APPLICATION_NAME S3_BUCKET: $S3_BUCKET_DEV COMMAND: 'upload' ZIP_FILE: 'dist.zip' # 3. CodeDeploy 배포 실행 - pipe: atlassian/aws-code-deploy:1.5.1 variables: AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION S3_BUCKET: $S3_BUCKET_DEV COMMAND: 'deploy' APPLICATION_NAME: $AWS_APPLICATION_NAME DEPLOYMENT_GROUP: 'dev' // Code Deploy Application에 생성한 배포그룹
- $로 작성한 부분들은 Repository variables에 작성해주시면 됩니다.
- AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY는 이전에 생성한 IAM에서 발급받은 값을 등록합니다.
- S3_BUCKET는 .zip 파일을 업로드할 S3의 버킷명을 넣으시면 됩니다.
- definitions에 작성한 step은 다른 브랜치에서 공통적으로 상용예정이라서 중복 코드를 분리하였습니다.
- EC2에 AWS S3 파일을 읽어 올 수 있는 권한이 있는 IAM 설정이 됐는지도 확인이 필요합니다.
2. appspec.yml 작성
version: 0.0 os: linux # Amazon Linux, RHEL, Ubuntu Server일 경우 "linux", Windows Server일 경우 "windows" files: - source: / # 인스턴스에 복사할 S3 파일의 경로입니다. / 로 설정하면S3_BUCKET_NAME/PROJECT_NAME/GITHUB_SHA.zip을 가져옵니다. destination: /home/ubuntu/test/dist # S3에서 가져온 파일을 저장할 위치입니다. overwrite: yes # 덮어쓰기를 허용하는 옵션입니다. file_exists_behavior: OVERWRITE # 동일한 파일이 있는 경우를 정의합니다. # files에서 가져온 파일들에게 권한을 어떻게 적용해야하는지 지정하는 곳입니다. permissions: - object: / pattern: '**' owner: ubuntu group: ubuntu hooks: # Code Deploy에서 실행하는 단계를 정의합니다. AfterInstall: - location: scripts/execute.sh # 스크립트의 위치입니다. files.destination에 정의한 경로에 대한 상대경로롤 작성해주세요. timeout: 600 # 스크립트 실행시, 여기에 지정된 시간을 초과하면 안됩니다. 최대 3600초입니다. runas: ubuntu # 스크립트 실행 시 가장하는 사용자입니다.
- hooks는 Code Deploy에서 진행하는 단계를 정의합니다. ( 링크 )
- 각각의 단계를 이용하여 원하는 작업을 진행하실 수 있습니다.
3. execute.sh 작성
- script를 작성시 절대경로로 지정된 상태에서 실행해야 됩니다.
cd /home/ubuntu/test sh /home/ubuntu/test/dist/scripts/restart.sh # restart.sh을 실행하기 위함입니다.
4. restart.sh 작성
- 저는 restart.sh로 분리하여 작성하였습니다. 굳이 분리하지 않으셔도 됩니다.
# NVM 설정 export NVM_DIR="/home/ubuntu/.nvm" export PATH="$NVM_DIR/versions/node/v18.17.1/bin:$PATH" pm2 restart test
- node가 설치된 환경을 설정합니다. 설정하지 않은 경우 pm2를 인식하지 못합니다.
- 작성 후에 pm2 restart로 실행명령어를 입력합니다.
5. 배포 테스트를 진행합니다.
- 순차적으로 Install 이후에 S3에 업로드가 된 상태부터 공유드리겠습니다.
- S3에 dist.zip 업로드 확인( 현재 다른 파일 5개가 있는데, 이건 Code Deploy에서 배포 시 자동으로 생성됩니다.)
- 애플리케이션에 접속하여 해당 배포그룹을 선택합니다. 이후에 배포 그룹 배포 내역에서 실제 배포 진행 과정을 확인하실 수 있습니다.
- 실패를 하신다면 로그를 확인하시면 원인을 확인하시고 해결하실 수 있으실 겁니다.
마주했던 에러
The deployment failed because a specified file already exists at this location:
- 코드 덮어쓰기시 발생하는 에러 ( 링크 )
CI/CD를 진행하면서, nestjs는 ts -> js로 컴파일하는 과정에서 memory와 CPU 사용량이 증가합니다. 이를 인스턴스에서 진행한다면 제한된 리소를 사용하는 상황에서 제대로 배포가 진행되지 않을 수 있습니다.
그러나 build된 파일을 인스턴스에 전달한다면 해당 문제는 해결이 된다고 생각합니다.
요즘 추세는 EC2가 아닌 ECS라는 것을 알고 있습니다. 하지만 EC2로 먼저 진행을 하고 이후에 ECS로 진행하는 게 나을 것이라고 생각합니다.
특정 문제나 궁금한 점을 검색하며 찾아보고 작성한 글입니다. 혹시라도 부정확한 정보를 전달드릴 수 있습니다. 틀린 부분이 있으면 댓글을 남겨주세요.
Ref.
https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/primary-components.html
CodeDeploy 기본 구성 요소 - AWS CodeDeploy
Amazon ECS 블루/그린 배포는 CodeDeploy 및 를 모두 사용하여 지원됩니다 AWS CloudFormation. 이러한 배포에 대한 세부 정보는 다음 단원에서 설명합니다.
docs.aws.amazon.com
AppSpec '후크' 섹션 - AWS CodeDeploy
배포의 시작 , DownloadBundle, 설치 , BlockTraffic, AllowTraffic, 종료 이벤트는 스크립팅할 수 없으므로 이 다이어그램에서 회색으로 표시됩니다. 그러나 AppSpec 파일의 '파일' 섹션을 편집하여 설치 이벤
docs.aws.amazon.com
https://velog.io/@chldmswnl/AWS-The-deployment-failed-because-a-specified-file-al[…]B%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-feat.-github-action
[AWS] The deployment failed because a specified file already exists at this location 에러 해결하기 (feat. github action)
에러마주하기 aws codedeploy를 통해 배포중에 에러가 땋! 원인을 찾아보니 파일 destination에 이미 내가 올리려는 파일과 똑같은 파일이 있다는 의미였다. 구글링을 해보니 appspec.yml 파일에 명령어 한
velog.io
'공부 > AWS' 카테고리의 다른 글
AWS Systems Manager - Parameter Store (with NestJs) (0) 2025.04.23 ECR에 이미지 업로드 (0) 2025.03.29 Bitbucket Pipelines + EC2 + NestJS (0) 2025.01.19 NestJS + Bitbucket pipelines + EC2 + CodeDeploy (CI/CD) - 1 (0) 2025.01.14 AWS Session Manager 생성 (0) 2025.01.09