23.5.2 DevOps 4기 Section2 실습과제

쿡쿡·2023년 6월 26일

DevOps(Code States)

목록 보기
22/25

💡 이번 프로젝트는 내용을 정리해서 정리한 내용은 노션 페이지로 대체. 중요하고 짜증났고 힘들었고 놀라웠던 이슈들과 나의 느낀점을 작성함.

개요: AWS 배포 자동화

Achievement Goals

섹션 2 파트에 학습 했던 내용을 완전히 이해하고 실습합니다.

  • 네트워크
  • Yaml
  • Docker
  • AWS
  • 지속적 통합
  • 배포 자동화

AWS 리소스에 대한 이해를 통해 실제 AWS에 서비스를 배포합니다.

목표달성을 위한 실습내용

WAS를 Docker image로 빌드하여 컨테이너화 (Docker, Yaml,AWS, 지속적통합)

  • 실습과제 1에서 실습한 내용을 토대로 was를 도커 이미지로 빌드하여 컨테이너 화 합니다.
  • 빌드한 이미지를 레지스트리로 푸시 합니다.
  • 깃헙 액션을 통해서 레지스트리 푸시를 자동화 합니다.

컨테이너화 한 이미지를 AWS에 배포(Docker, AWS)

  • aws ECR 서비스를 이용하는 방법을 배웁니다.
  • was 및 mongoDB 이미지를 AWS ECS를 통해 배포합니다.

AWS 배포 자동화(AWS, 배포자동화)

  • WAS의 이미지 배포 자동화를 구현합니다.
  • 프론트엔드의 배포 자동화를 구현합니다.

CDN을 통한 캐싱 및 HTTPS 적용(네트워크)

  • CDN을 통해 프론트엔드를 캐싱하고, HTTPS를 적용해야 합니다.
  • 프론트엔드와 WAS를 연결해야 합니다.
  • 프론트엔드가 잘 작동하기 위해 WAS를 구현해야 합니다.

🎃 Day 1

Achievement Goals

Day 1

  • WAS를 Docker Image로 빌드하여 컨테이너화 해야 합니다.
  • 컨테이너화한 WAS를 Registry에 Push해야 합니다.
  • 기존에 배포된 Docker Image를 활용/실행해야 합니다.
  • mongoDB 기준
  • Docker Compose를 이용해, WAS와 DB를 한 번에 실행해야 합니다.
  • WAS 이미지 빌드 및 push 자동화를 구현해야 합니다.
  • ECR 서비스를 이용하는 방법을 배웁니다

📌 (링크) 23.04.27 마일스톤1 - Hello World 서버 컨테이너화

📌 (링크) 23.04.27 마일스톤2 - docker-compose 작성

📌 (링크) 23.04.27 마일스톤3 - 이미지 repository push 자동화

💡 section2 끝! 두번째 프젝 시작!


프젝2 하는 나의 심정
aws와 도커를 재미있게 진행해서 자신감은 아니지만 용기는 있었다

✔ 명령어 문제

## app.js

# Node.js 18 버전을 기반으로 하는 Alpine Linux 이미지를 사용
FROM node:18-alpine

# 도커 컨테이너 내부에서 작업 디렉토리
WORKDIR /usr/src/app

# 현재 디렉토리에서 "package.json""package-lock.json" 파일을 도커 컨테이너 내부의 "/app" 디렉토리로 복사
COPY package*.json ./

# 컨테이너 내부에서 Node.js 애플리케이션의 의존성 패키지를 설치
RUN npm install --production

# /app 디렉토리로 모든 파일 복사
COPY . .

EXPOSE 3000
# 도커 내부 실행 기본 명령어
CMD ["npm", "run", "start"]

작성한 app.js파일이다 CMD명령어는 중요하다…. “node” , “dev”, “start” 라고 해두고

npm run start 안되냐고 속으로 얼마나 욕을 했는지…. 이 아쉬운 오류로 첫날 오전과 오후2시까지 사용했다

ⓒ AWS ECR 리포지토리 푸시 명령

AWS는 내 생각보다 더 친절했다

첫날은 로컬에서 WAS서버와 mongodb를 컨테이너화 하고 docker compose로 실행, AWS ECR에 Github Action을 사용해 이미지 빌드와 push를 자동화 하는 것으로 끝



🎃 Day 2

Day 2

  • WAS 및 mongoDB 이미지를 ECS를 통해 배포해야 합니다.
  • WAS 이미지의 배포 자동화를 구현해야 합니다.
  • WAS와 연결된 로드 밸런서에 HTTPS를 적용해야 합니다.

📌 (링크) 23.04.28 마일스톤4 - 이미지 ECS 배포

📌 (링크) 23.4.28 마일스톤5 - 서버 이미지 ECS 배포 자동화

📌 (링크) 23.4.28 마일스톤6 - 서버 애플리케이션의 HTTPS 적용

✔ 이미지 오류

서버와 디비를 연결하라고 하지 않았는데 그냥 연결하는 방법을 찾아서 연결 후 빌드하고 이미지를 ECR에 push하니 ECS에서 클러스터에 컨테이너를 만들때 계속 오류가 생겼다

💡 2일차 종료. 유어클래스는 또 한번 느끼지만 요약을 잘 한 교과서 느낌이다. 빨리빨리 하고싶어서, 다른 사람은 빨리 하는데 나는 느리다고 급해지면 요약한 내용인데 스킵을 해버리니 작동이 안되는 경우가 있다. 잘 보자. 천천히 해도 상관 없다. 기술을 배우는데 목표가 있는거지 빨리 달성하는게 목표는 아니다.



🎃 Day 3

Day 3-4

  • 프론트엔드의 배포를 자동화해야 합니다.
  • CDN을 통해 프론트엔드를 캐싱하고, HTTPS를 적용해야 합니다.
  • 프론트엔드와 WAS를 연결해야 합니다.
  • 프론트엔드가 잘 작동하기 위해 WAS를 구현해야 합니다.

📌 (링크) 23.5.1 마일스톤7 - 프론트엔드 배포 자동화

📌 (링크) 23.5.1 마일스톤8 - 프론트엔드 HTTPS 적용

📌 (링크) 23.5.1 마일스톤9 - 프론트엔드-서버 연결 확인

마일스톤7과 8은 해결을 했다. 이전에 배운 부분도 있어서 오래 걸리지 않았다.

마일스톤9가 문제였음

✔ 디렉토리 오류

curl http://localhost:3000/api/restaurants 했는데 폴더를 못찾고 있다

혹시나 .env 파일의 오류일까 마일스톤5의 POST컬 날렸는데 이건 온다

디렉토리 문제인듯?

생각을 해보니 프론트와 서버 연결을 하는 부분이라 프론트와 서버가 연결이 안된듯 하다.


docker run --name some-mongo --env MONGO_INITDB_ROOT_USERNAME=qook --env MONGO_INITDB_ROOT_PASSWORD=1234 -p 27017:27017 -d mongo:latest

몽고 컨테이너를 env를 설정해서 실행후

내부 env파일을 로컬호스트 포트로 변경 하고

npm run start 명령어로 서버 실행,

curl http://localhost:3000/api/restaurants 명령어 통해서 하드코딩 된 db를 가져왔다

✔ AWS에서 프론트와 서버 연결 실패

로컬에서 서버와 프론트 연결을 확인 했음 이후 AWS에서 모든 설정 후 Route53에서 도메인 접속하면 서버와의 연결이 안되는 문제 발생.

오타 등 휴먼 오류가 있나 확인

실행 되었던 태스크 정의를 제외하고 클러스터부터 라우트53까지 모두 새로 만들기 > 실패

혹시나 로컬에서 다시 하면 서버와 연결 되는가 확인

로컬에서는 package.json에 로컬호스트:3000 으로 설정 후 서버 실행하면 실행 되는 것 확인 > 확인 완료

package.json의 REACT_APP_ENDPOINT 설정 문제인가 확인

route53에 있는 모든 설정한 도메인 이름, alb 주소

(혹시나 해서 alb주소, localhost, 0.0.0.0 등 넣을 수 있는 주소는 혹시나 해서 다 넣음)

현상 유지 하며 변화 없음 > 실패

이미지 문제인가 확인

이미지가 자동화 되어서 배포 되는줄 알았지만 깃엑션 과정에서 빌드가 안된 것인지(?) 이전 이미지에 태그만 수정되는 것 같음

해서 직접 이미지를 수동으로 빌드(태그 2.0)해서 올리고 확인 > 실패

환경변수 실수? 등등 여러가지 이유를 찾아 보았음

💡 section2 진짜 끝. 고생했다. 탈모 생길뻔.



회고2(후기?)

섹션2가 끝났다. 벌써 반을 했다니. 믿어지지 않음

나는 성장 했는가? 성장의 기준이 어떤지 정확하게 모르겠지만 배운 지식을 활용해서 뭔가 하는 것이라면 성장 했다고 볼 수 있다 생각한다.

이번 실습과제 시작하면서 내가 팀원들에게 개인이 하고 달성하면 팀원들에게 알려주면서 다음으로 넘어가자 했지만 제대로 실행되지 않았다.

나도 빠르게 달성하지 못했고 팀원들도 그러지 못했어.

마음만 급해서, 빨리 하고싶어서 제대로 읽지 않고 읽으면서 바로바로 구현하려고 하다보니 놓치는 것들이 많았고 정해진 시간 안에 달성하지 못했다.

그래도 발전했다. 실습과제2 하면서 어떤 부분을 해야하는지 어떻게 하는지 왜 그런지 생각하게 되었고 정리하게 되었다. 실습과제1에서 목표했던 이슈가 생기면 적고 해결하고 해결 방법을 적는다는 목표를 달성했고 앞으로도 그렇게 현업에 가서도 할거야.

쉬운 부분도 있었지만 어려운 부분도 있었다. 주변에 빨리 하는 사람도 있지만 느린 사람도 있었다. 나는 그냥 내 탬포에 맞춰서 하자. (난 나일 뿐이야~ 누구도 나를 대신 할 수 없어~ 피카츄~~???)

남은 50퍼도 파이팅이다. DevOps04기 파이팅

마지막으로 실습과제1에서 사용했던 짤을 남기며 회고3에서 봅시다

profile
https://www.notion.so/a67850905fb843fc9cdcdb173f888338

0개의 댓글