본문 바로가기

AWS

Github Action + ECS + Fargate를 통한 CI/CD 구현 1 (요약)

흔히 일반 스타트업에선 개발자가 인프라도 일부 만져야 하며 빌드 및 배포까지 하며 인프라 운영도 해야하는 경우가 많다.

나 또한 그렇게 시작했지만, 개발자 1 ~ 2명이 개발 / 빌드 / 배포 / 운영까지 하기엔 가혹하다.

 

밤낮없이 서버까지 봐가며 컨텐츠 개발일도 해야 한다.

 

워라벨이 문제가 아니라 생존을 위한 방법으로 CI/CD를 통해 업무의 효율성을 이해 하고 공부하기 시작했다.

 

이 편에선 많은 사람들이 이용하는 CI/CD중 Github과 ECS를 이용한 배포를 자동화 하는 방법에 대해서 공유하고 사용하는 것을 알아보고자 한다.

 

AWS에선 CodeSeries라는 이름으로 불리지만, CodeCommit의 사용법이 생각보다 어렵다.

개발자가 사용하기엔 비용도 싸고 기능도 거의 비슷하지만 IAM 권한 세부 범위가 다양하여 생각보다 다루기 복잡하다.

일단 심플하게 구현하기 위해 비싸지만 github을 이용해서 도입하는 것을 해보고자 한다.

 

1. Github

 - github은 전 세계에서 사람들이 많이 사용하는 형상 관리툴 중에 하나이다. 이 github에는 workflow를 이용해서 action을 실행하고

    CI / CD를 구현하는 방법이 존재한다.

https://github.com/

 

GitHub: Let’s build from here

GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...

github.com

https://docs.github.com/ko/actions

 

GitHub Actions 설명서 - GitHub Docs

GitHub Actions를 사용하여 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행합니다. CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완

docs.github.com

yaml 파일 문서를 통해 빌드를 할 수 있다.

 

2. docker로 컨테이너 만들어보기

도커는 어플리케이션 또는 서비스를 컨테이너 화하여 복잡한 어플리케이션 설치를 극복하고 다양한 서비스를 간편하게 사용해볼수 있는 서비스다. 사실 개발자들 모두 들어는 봤겠지만, 많이 사용해본 경우는 없을 수도 있다. 이참에 한번 해보는 것도 나쁘지 않겠다.

 

빌드된 소스는 docker화 되어 대체적으로 dockerhub 또는 AWS ECR에 이미지를 저장하고 해당 이미지를 다른 곳에서 docker pull하여 사용할 수 있게 된다.

 

https://www.docker.com/

 

Docker: Accelerated Container Application Development

Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

빌드를 위한 도커 이미지 생성시 주의 사항.

1. 도커이미지를 최대한 작게 작성할 것. (alpine, buster, slim 이미지 등)

2. 불필요한 어플리케이션을 내부에 또 깔지 말 것.

3. 라인을 줄여서 이미지 레이어를 줄일 것.

4. 불필요한 캐시 파일들을 제거하여 이미지 사이즈를 줄일 것.

5. .dockerignore를 이용해 빌드시 불필요한 파일을 삭제해서 이미지 사이즈를 줄여 나갈 것.

6. 포트 오픈을 위한 EXPOSE {PORT_NUM}을 확실하게 지정할 것.

7. 가능하면 계속 최신화된 이미지 (언어 버전을 못 올리면 최대한 마이너 버전이라도 계속 올리자)를 사용하여 이미지 취약점에 대비할 것.

 

dockerfile을 생성할 수 있는 사람은 원하는대로 구현하면 되지만 할 줄 모르는 경우 일단 chatGPT 사용을 권한다.

작성자도 작업시 샘플 코드에 한해서는 chatGPT를 많이 사용하고 있다.

Devops의 특성상 여러가지 기술을 다루다보니, 모든 기술을 정석으로 공부하기 어려웠다.

그래서 샘플코드에 한해서는 chatGPT를 활용하고 맨땅으로 부딪혀가며 작업을 하고 있다.

 

# Use an official Node.js runtime as the base image
FROM node:14

# Set the working directory to /app
WORKDIR /app

# Copy package.json and package-lock.json to the working directory
COPY package*.json ./

# Install Node.js dependencies
RUN npm install

# Copy the rest of your application code to the working directory
COPY . .

# Expose port 3000
EXPOSE 3000

# Define the command to start your Node.js application
CMD ["npm", "start"]

 

예시로 node.js를 이용해서 웹서버를 3000포트로 띄워주는 dockerfile 스크립트를 chatGPT로 만들었다.

당연히 각 회사마다 사용하는 언어가 다르므로 각 언어에 맞게 실행할 수 있도록 하면 될 것 같다.

서버에 올리기전엔 당연히 dockerfile을 이용해서 로컬에서 docker가 정상적으로 빌드 되고 실행되는지를 테스트 해야 한다.

 

$ docker build -t test:latest .
$ docker run -d --name test -p 3000:3000 test:latest

 

위와 같은 코드를 실행하여 먼저 도커가 되는지 확인한다.

소스가 있다면 의도대로 3000포트로 웹을 열었을때 의도한 index.html이나 로그인 페이지가 나오는지 확인해볼 수 있을 것이다.

내 어플리케이션이 로컬에서 스타트 될때랑 똑같은 상태가 유지될때까지 일단 도커가 동작하도록 이미지를 계속 깍아나가 보자.

 

2편에 계속...