백만년 만에 벨로그 🙊
프론트 개발을 시작한지도 2년차에 들어서면서 회사에서 하는 일이 점점 익숙해져 갈 때쯤 새로운 업무가 주어졌다! 그동안은 항상 말로만 들어서 나와는 상관없다고 느꼈던 AWS ... 드디어 그녀석과 제대로 마주할 일이 생겼다.😨💦
항상 수동 배포로만 진행하던 프로젝트가 있었는데 미루고 미뤘던 그 녀석의 자동배포를 내가 맡게된 것!
자동배포를 위한 AWS ECS 인프라 구축 이라고만 하면 너무 거창해서 내가 할 수 있을까? 싶지만 하나하나 뜯어보면서 하니깐 어느새 목적지에 도달해 있는 나를 발견할 수 있었다ㅎㅎ
처음엔 AWS 홈페이지 자체가 뭔가 어색하고 어디를 어떻게 들어가서 뭐를 누르라는 거지...? 싶었지만 계속 보다보니 이또한 익숙해졌다ㅎㅎ 이 블로그는 나와 같이 AWS를 처음 접하는 사람들을 위해 하나하나 최대한 이해가 쉽게 갈 수 있도록 상세하게 적어봤다. 부디 누군가에게 도움이 될 수 있길 바라면서 꽤나 긴글을 시작해본다😉
본격적인 구현 과정을 설명하기 전에 먼저 내가 구현한 자동배포 프로세스는 다음과 같다.
FROM node:16 기본 이미지로 Node.js 16을 사용
COPY package*.json ./ 프로젝트 디렉토리에 있는 package.json 및 package-lock.json 파일을 도커 이미지 내부의 /app 디렉토리로 복사
RUN npm install 의존성 패키지를 설치하기 위해 npm을 실행
COPY . . 프로젝트 디렉토리의 모든 파일을 도커 이미지 내부의 /app 디렉토리로 복사
RUN npm run build 프로젝트의 빌드 스크립트를 실행
EXPOSE 3000 컨테이너가 사용하는 포트를 외부에 노출합니다. 여기서는 애플리케이션이 3000번 포트에서 실행되고 있다고 가정하고 노출
CMD ["npm", "start"] 컨테이너가 시작될 때 실행되는 명령어를 정의합니다. 여기서는 npm start 명령을 실행하여 애플리케이션을 시작
docker build -t your_image_name .
docker images
.
은 현재 디렉토리에서 빌드 하겠다는 것을 의미한다. 🤔 배포 할 때마다 매번 이렇게 수동으로 docker image를 push 해줘야 하나?
➡️ 이미지 빌드 및 푸시를 자동화하기 위해서 CI/CD (GitHub Action) 파이프라인을 구축하여 자동으로 빌드 및 푸시 되어 배포 프로세스가 실행될 수 있도록 한다.
배포 프로세스를 정리하자면,
1. 코드 변경 : 코드가 변경되면 CI/CD (GitHub Action)이 실행된다.
2. 빌드 : CI서버에서 Docker 이미지를 빌드한다.
3. 이미지 푸시: 빌드된 이미지를 Docker 레지스트리 (ASW ECR)에 푸시한다.
4. 배포 : ECS 를 통해 새로운 이미지를 배포한다.
docker-compose
와 비슷한 역할을 한다.task-definition.json
파일 생성task-definition.json
파일 참고executionRoleArn
값은 AWS IAM 계정이 있어야 알 수 있다.executionRoleArn
확인 방법task-definition.json
을 aws-cli을 사용해서 AWS 계정에 등록aws ecs register-task-definition --cli-input-json file://[your task-definition.json name with path]
// 예시
aws ecs register-task-definition --cli-input-json file:///Users/sujin/Desktop/cicd-test/.github/task-definition.json
새로운 버전이 배포 될때가지 애플리케이션이 중단(다운타임) 되는 것을 막기 위한 방법
서비스 환경 설정을 모두 해줬다면 서비스 배포를 진행하면 되는데, 이 과정에서 경험했던 트러블슈팅에 대해서 공유한다.
containerDefinitions
안에 logConfiguration
에 CloudWatch에 생성한 로그 그룹을 등록 해 준다. (새롭게 수정한 작업정의는 aws에 업데이트 해줘야함)aws ecs register-task-definition --cli-input-json file://your-updated-task-definition.json --region your-region
exec /usr/local/bin/docker-entrypoint.sh: exec format error
이런 오류가 볼 수 있었다. uname -m
X86_64
→ arm64
이렇게 AWS ECS 배포 환경 구축이 마무리됐다!🙊 자동배포 프로세스까지 연결하려면 CICD 파이프라인까지 구성해야한다. 그 부분에 대해서도 추후에 정리해서 올려야겠다ㅎㅎ
처음엔 막연했는데 막상 해보고 나니 별거 아닌거처럼(?) 느껴지도 한다. 그래도 AWS랑 조금은 친해진거 같아서 의미가 있었고 앞으로도 AWS와 더 친해질 수 있도록 인프라 쪽에도 지속적으로 관심을 가져야겠다~!!
잘보고 가요~ ^^