개발 환경
- Nest.JS -> Mysql(도커 파일 작성) -> 도커-컴포즈 생성후 개발 환경 테스트
배포 환경
- Nest.Js(도커파일 수정) -> 도커-컴포즈 수정 -> iam 생성후 키 파일 저장
-> EC2 인스턴스 생성(보안그룹 (rds용까지생성)) -> s3 버킷생성
-> rds(서브넷,파라미터그룹 생성) 생성 -> 인스턴스 연결후 rds 연동 테스트
-> codeDeploy (애플리케이션 , 배포그룹 생성) -> travisCi.yml 최종 작성
-> git push 순으로 되는거같다.!
nest.js 코딩을 하던중 자동화 배포를 해보고싶었따.
내가 생각하기에는 인프라를 먼저 셋팅 후에 서비스를 구현하는게 더 나을 거같았다.
- 여러 모듈을 사용하고 복잡해진 코드위에 인프라 셋팅시 오류발생할때 에러찾기가 힘들거같았다.
- 편의성 , 디버깅 용이 그런이유들이 있을것같다.
우선 dockerfile.dev 생성하여 개발 환경에서 테스트를 진행하였다.
FROM node:10
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
CMD ["npm", "run", "start:dev"]
- db는 typeorm(mysql) 을 써서 mysql폴더를 만들어 dockerfile 도 생성
FROM mysql:5.7
ADD ./my.cnf /etc/mysql/conf.d/my.cnf
- my.cnf 파일
[mysqld]
character-set-server=utf8
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
을 넣어준다
docker-compose.yml 생성후 테스트를 진행한다
- networks
- mysql ip 주소를 db 설정하는 파일에 넣어주며 mysql 에서도 설정을 바꿔준다.
- ( root 권한자로하면 호스트가 localhost 로 되기때문에 사용자를 생성후 권한을 다시 주고 만들어야된다)
테스트 성공시 자동화 배포 시스템 셋팅 시작
AWS
- IAM 을 하나 생성후 key 값을 파일로 저장시켜놓는다
- ec2, travisCI 에 사용(정책 ,ec2,codeDeploy,s3,rds)
- ec2 (우분투 18.04(mysql 5.7 버전사용으로인해)) 생성후 codeAgent, mysql, docker 을 설치한다.
- condeAgent 설치후 aws 키 (iam) 을넣어준다.
- 3개 다 실행시켜준다.
- 보안그룹에 따로 rds 용으로 하나 생성후 인바운드에 ec2에 설정된 보안그룹을 3306 포트의 ip 에 설정해준다.
- RDS
- 서브넷 그룹으로 들어가 ec2 인스턴스의 vpc와 같이 설정후 가용영역 도 같이 지정
- 파라미터 그룹에 들어가 생성후 char~ , collatcion~ 관련된 설정들을 ut8,utf8_general_ci 로 바꿔준다.
- 데이터 베이스 생성
- 버전은 5.7.30 , 프리티어 설정
- 서브넷 그룹, 보안그룹에 rds용으로 만든 그룹을 지정한다.
- 파라미트 그룹까지 지정후 생성
- ec2 인스턴스에 가서 ssh 연결후
- mysql -u <username> -p --host "<rds-데이터베이스 엔드포인트>" 입력후 접속되면 성공
- s3
- 버킷을 만들어 준다. (배포 할때 필요한 폴더를 생성후 s3에 넣어주면 s3에있는 파일을 ec2가 가져다가 배포??로알고있다)
Dockerfile(nest.js)
FROM node:10 AS builder
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
RUN npm run build
## base image for Step 2: Node 10-alpine(light weight)
FROM node:10-alpine
WORKDIR /app
## Step 1의 builder에서 build된 프로젝트를 가져온다
COPY --from=builder /app /app
CMD ["npm", "run", "start:prod"]
으로 dockerfile 배포용으로 하나 만들어준다.
docker-compose.yml(배포용으로 수정해준다)
- mysql 은 이제 rds 로 인프라구성으로 dockerfile이 필요없으므로 주석처리나 지워준다.
travisCI
우선 테스트는 아직 작성이 안되있어서 test 부분에 exit 으로 넣어준다.(안넣어주면 err가 뜬다.)
- before_install
- env 파일은 배포시 gitignore 에 등록되어있어서 배포했다해도 실행이안된다
- .env.example
travis.com에 들어가 해당 프로젝트 세팅에서 DB_HOST 키로 된 Envrionment Variable을 하나 만들어준다.
이렇게 하므로 env 관련 환경 변수는 마무리 됬다.
깃 푸시 를 해주면 travisCI 가 실행된다.
Travis CI가 빌드와 테스트가 끝난 코드를 S3에 업로드 하고 AWS CodeDeploy 이벤트를 발생시켰을때 appspec.yml 이라는 파일로 AWS CodeDeploy가 어떻게 행동을 할 것인지 정의해 줘야합니다.
해당 프로젝트 루트 디렉터리에 appspec.yml 파일을 만들어 주세요 해당 파일에 들어갈 내용은 다음과 같습니다.
AWS CodeDeploy에서는 S3에서 코드를 받아 EC2 서버에 저장만 해줄뿐 직접 명령어 실행을 못합니다. 그렇기 때문에 루트 디렉터리 배포 스크립트를 실행할 쉘 스크립트 파일을 만들고 appspec.yml에서 해당 쉘 스크립트 파일을 실행할 수 있게 해줘야 합니다.
루트 디렉터리에 execute-deploy.sh 파일을 만들고 다음과 같이 내용을 작성합니다.
- aws (codedeploy) 보면 배포 진행 상태가 나온다.
- ec 인스턴스에 연결후
- ls 치면 deploy 폴더가 생성되어있다.
- deploy/bolier-CD 에 들어가서 ls 쳐서 파일 확인!
- docker ps 를 입력후 실행 되고있는지 확인!!
포스트맨 켜서 테스트 해본다.!
처음 도전해본 자동화 배포라서 조금 많이 해맸다... 그래도 좋은경험이었다. 성공해서 기쁘다
내가 자동화 배포 진행하면서 참조햇던 사이트들
Travis CI, AWS CodeDeploy, Docker 로 배포 자동화 및 무중단 배포 환경 구축하기 - (1)
시작하기에 앞서 안녕하세요, 영훈입니다. 이번에는 Traivs CI, AWS CodeDeploy, Docker를 활용해 CI/CD 환경을 구축하는 글을 작성했습니다. 이 글을 작성하기전 제가 Travis CI와 Docker를 공부하면서 어떻게
velog.io
- https://juneyoung.io/devops-better-way-to-handle-env-in-travis-210308
'Infra > AWS' 카테고리의 다른 글
ECS-ElasticWatch-OpenSearch (0) | 2022.05.19 |
---|---|
EC2 volume 축소 EBS (0) | 2022.03.01 |
ECS 기본 개념 (0) | 2022.02.17 |
IAM,RDS, CodeDeploy 간단한 설정방법 (0) | 2021.10.16 |