Code States/회고

Section 2. 프로젝트 - AWS 배포

ki1111m2 2023. 5. 2. 17:03
2023.04.26-05.02

두 번째 프로젝트가 끝났습니다 👏
 
일차별 작업 진행 사항과 모든 트러블슈팅은 TIL로 정리하였기 때문에, 해당 회고에서는 변경점이나 주요 트러블슈팅 등을 기록합니다!
(TIL 링크: 마일스톤1 마일스톤2 마일스톤3 마일스톤4 마일스톤5-1 마일스톤5-2 마일스톤6 마일스톤7 마일스톤8 마일스톤9 마일스톤10)


프로젝트 목표

섹션 2 파트에 학습했던 내용을 완전히 이해하고 실습한다.
AWS 리소스에 대한 이해를 통해 실제 AWS에 서비스를 배포한다

  • WAS를 Docker image로 빌드하여 컨테이너화(Docker, Yaml, AWS, 지속적통합)
  • 컨테이너화한 이미지를 AWS에 배포(Docker, AWS)
  • AWS 배포 자동화(AWS, 배포자동화)
  • CDN을 통한 캐싱 및 HTTPS 적용(네트워크)

 

진행 일정
  • Day 1: Hello world 서버 컨테이너화, 도커 컴포즈 작성, 이미지 리파지토리 푸쉬 자동화
  • Day 2: 서버 이미지 ECS 배포, 서버 이미지 ECS 배포 자동화, 서버 애플리케이션의 HTTPS 적용
  • Day 3: 프론트엔드 배포 자동화, 프론트엔드 HTTPS 적용, 프론트엔드-서버 연결 확인
  • Day 4: 서버 애플리케이션 CRUD 구현

다이어그램

 

마일스톤 3: requested access to the resource is denied
더보기

구글링 결과 이미지 태그의 문제라는 의견이 절대적이었다

태그를 아무리 수정하고.. 이미지를 지우고 다시 만들고.. 경로를 다시 설정해주고..

뭘 해도 되지 않았다

로그를 다시 확인해본 결과, yml 파일을 처음에 생성한 후 계속해서 수정을 했는데

처음에 만든 yml 파일의 내용을 바라보고 있었다

yml 파일을 몇번을 고치고 그 외 레포지토리 안의 파일을 수정하고 삭제하고 생성하고 뭔 짓을 해도 처음에 있던 파일 내용을 바라보고 있었다

githun action 내부 자체 캐시의 문제인가 싶어서 캐시를 지우는 온갖 명령어를 다 실행하고 넣어도 반영이 안됐다

3시간 가량 이 문제만 붙잡고 있다가 결국 엔지니어님께 물어봤고, 엔지니어님도 다 잘 돼있는데 뭐가 문제인지 모르겠다며 외국 커뮤니티에 물어보셨다

외국인의 답변은 "그거 종종 그래 그냥 삭제하고 다시해"

레포지토리 삭제 후 재생성, 같은 내용으로 yml 파일 생성 후 실행하니 정상작동했다..

 

마일스톤 3: 파일 경로를 찾지 못하는 상황(no such file or directory)
더보기

도커파일을 찾지 못한다는 에러였다

자세히 봐보니 도커파일이 있는 경로가 아닌 루트 파일에서 도커파일을 찾고있었다

도커파일이 있는 폴더로 경로를 지정해야겠다는 판단을 했다

도커 허브에 올릴때 사용했던 context 구문을 사용하면 되겠다는 생각을 했으나, 같은 오류가 발생했다

예전엔 with 블럭 안에 context를 넣었었는데 그냥 넣어서 그랬다고 생각했다

with 블럭을 추가했으나 또 오류가 발생했고 with 블럭은 혼자 사용되지 못하나? 라는 생각에 위치를 옮겼다

그러나 여전히 오류가 발생하였고 uses 블럭과만 사용이 가능한건가 라는 생각에 구글링을 해보았지만 명쾌한 답안이 안나왔다

 

그러던 중 팀원분이 새로운 옵션을 찾으셨다

 

docker build -t ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }} -f ./helloworld-was/Dockerfile .

 

-f 옵션을 사용하여 파일 경로를 지정할 수 있다고 한다

해당 방법으로 해결 완료!

 

마일스톤 4: 파일 경로를 찾지 못하는 상황(테스크가 생성됐다 삭제됐다 반복되며 서비스가 제대로 작동하지 않음)
더보기

태스크 생성 삭제가 반복되며 서비스가 제대로 작동하지 않는 오류가 발생하였다

서비스 로그를 확인했을 때 타겟이 언헬시 상태로 가는 것이 아닌 등록과 삭제만 반복되는 것을 확인할 수 있었다

서비스 로그를 확인했을 때 npm start를 인식하지 못하는 것을 확인했다

npm start를 인식하지 못한다는 것은 package.json 파일을 인식하지 못한다는 것 아닌가? 라는 생각이 들었고 실제로 그랬다..

우리가 필요한 package.json 파일은 /helloworld-was 폴더 안에 있는데 작업 디렉토리가 한 단계 상위였던 것 같다

copy 명령어를 이용할 때 호스트파일의 경로를 지정할 수 있으면 좋을텐데 지정할 수 없댄다

 

보통 하위 디렉토리에 있는 도커파일로, 상위 디렉토리에 있는 파일에 접근하고 싶은 사람들이 많던데(우리는 반대였다 ㅋㅋ;;)

우리가 기존에 사용했던 -f 옵션을 이럴때 사용하더라

내가 이해하기로는 상위 디렉토리에서 작업을 하는데 도커 파일은 -f 뒤에 있는 경로에서 가져다가 작업해라~ 라는 느낌이었다

 

working_directory 를 환경변수로 등록해서 하는 방법을 다른 조 동기분이 성공하셔서 우리도 적용해보았는데

우리 조에서는 작동하지 않았다..

 

우리는 아예 작업 경로를 바꾸고 싶던 거라서 어떻게 하면 좋을지 찾아보다가

-f 옵션을 없애고 그냥 ./경로 만 하면 작동이 되는 것을 발견했다

 

마일스톤 5: mongoDB 접속시 ServerSelectionError: getaddrinfo ENOTFOUND 오류 발생
더보기

mongoDB에 접속하기 위한 주소를 인식하지 못했다

hostname의 변수로 입력한 주소가 인식이 안되는 거였다

root, localhost 등으로 접속이 안됐다

구글링 결과 127.0.0.1로 접속하면 해결된다는 사람들이 있어서 적용해보았는데 접속에 성공했다

 

 

마일스톤 5: mongoDB 접속시 ServerSelectionError: connect ECONNREFUSED 오류 발생
더보기

로컬(npm start)로 접속할 때 사용했던 환경변수로 도커 컨테이너를 만들 시 접근 거부되는 오류가 발생했다

환경변수로 localhost, 0.0.0.0, 127.0.0.1 등등을 사용해봤지만 여전히 해결되지 않았다

팀원 분은 mongo로 설정해서 해결하셨는데 나는 해결되지 않았다

팀원님이 gpt를 닦달해서 얻어낸 결과, hostname의 환경변수 값으로 host.docker.internal 을 넣어보라는 얘기를 했다

((진짜 구글링을 3시간동안 쥐잡듯이 했는데 전혀 발견하지 못했던 내용이다,,;;))

해당 환경변수로 컨테이너를 만들었다

정상 작동하는 것을 볼 수 있다

 

마일스톤 7: react-scripts: command not found
더보기

npm build로 돌렸을 때는 발생하지 않던 오류가 명령어로 바꾸니 발생했다

gpt가 알려주길 npm run build 앞부분에 환경변수를 넣어서 설정할 수 있다고 했다

코드를 아래와 같이 수정했다

package.json 파일의 build 부분에 있던 환경변수 부분은 삭제했다

 

마일스톤 9: 환경변수가 제대로 인식되지 않음
더보기

프론트엔드 배포시 환경변수로 alb의 주소를 설정했다

설정한 환경 변수가 제대로 작동하면 GET 요청을 alb주소/api/restraunts 로 보내야 한다

 

그러나 s3의 주소로 접속할 때 오류가 발생했다
콘솔창을 보니 GET 요청을 보내는 URI 주소에 환경변수에 넣은 값만 들어가야 하는데, 실제로 요청된 값은 환경변수, 즉 alb 주소 앞에 s3 버킷의 주소까지 붙어있었다

이는 환경변수 앞에 프로토콜(http, https 등)을 넣어주지 않아서 발생한 문제였다

또한 처음에 alb 주소를 넣었지만, 이에 연결된 rout 53 레코드도 생성했으므로 server.yourdomain.click으로 값을 변경했다


첫 프로젝트보다 기간도 길고 내용도 어려워진 만큼 트러블슈팅 내용도 많아졌다.. 😇

트러블 슈팅을 겪으면서 내 스스로가 발전한 느낌을 받았다. 처음에 오류를 만나고 3시간동안 한 오류를 붙잡고 있었으면서 추후에 같은 오류를 만나면 '아 이거!' 하고 금방 해결할 수 있었다.

Github Action 실패 메일이 내 메일창을 점거했다 😇


솔직히 첫 프로젝트는.. 쉬웠어서 정규시간 넘겨서 나머지공부하고 그런 일 없었는데, 이번엔 나머지 공부도 하고 주말에도 굴렀다.. 🤪 무슨 주말에도 9시간을..
그래도 시간 맞춰서 구현 다 끝냈고 결과적으로 이번에도 우리 조가 1등 !! 했다 저번에도 1등으로 끝냈는데 짱뿌듯하다 ㅋㅋ 
마일스톤의 최소 목표를 보고 어떻게 진행하면 좋을지 방향성을 스스로 잡아야하는데, 내가 그런 방향성 잡는 것을 잘하는 것 같다
마일스톤 10에서 api 작성도 혼자서 뚝딱 해냈다 나 되게 똑똑한거같애 ..

냅다 언니라고 불러버리는 귀여운 팀원님 ㅋㅋ💕