(트러블슈팅) standalone 배포시 hostname 적용 안되는 문제
MacOS에서 standalone 옵션을 적용하고 Docker 용량 차이
문제 상황
standalone을 적용하고 나서 배포하려 할 때 이미지 빌드까지는 완료되었으나 health-check가 실패하여 ECS 배포가 실패하는 문제가 있었음. 일단 health-check를 성공하게 설정해서 태스크를 배포해보니 502 Bad Gateway 에러가 발생
해결방법
ECS에서 로그를 확인하니 standalone을 사용할 때와 차이점이 존재했는데
(standalone을 사용했을 때)
(standalone을 사용하지 않았을 때) 기존의 next start를 이용하여 서버를 띄웠을 때
standalone을 사용할 때는 localhost가 아니라 내부 DNS 이름이 할당 되었다. 이는 server.js에서 아래와 같은 코드 때문인데
const path = require('path')
const dir = path.join(__dirname)
process.env.NODE_ENV = 'production'
process.chdir(__dirname)
const currentPort = parseInt(process.env.PORT, 10) || 3000 // 이쪽에서 ENV의 hostname을 참조한다.
const hostname = process.env.HOSTNAME || '0.0.0.0'
이때문에 nginx proxy가 잘못되어서 생간 문제가 아닐까 하는 생각에 ECS Container 내에 직접 접속해서 확인해보기로 함
$ aws ecs execute-command --cluster 클러스터명 --task arn:aws...(태스크id) --container 컨테이너명 --command "/bin/sh" --interactive
ENV 명령어를 찍어보니 HOSTNAME에 대한 ENV가 변경되지 않은것을 확인함. 그런데 분명 Dockerfile에서 아래와 같이 HOSTNAME을 바꾸어주었기 때문에 내부 DNS HOSTNAME으로 처리되는게 이상해서 구글링하던 중 아래 이슈를 발견했다.
ENV HOSTNAME="localhost"
https://github.com/vercel/next.js/issues/54093
standalone을 사용해서 배포할때 HOSTNAME이 ECS에 의해서 덮어쓰여진다는 것이다. 이를 해결하기 위해 태스크에서 변경해주거나 아래와 같이 Dockerfile을 변경해주니 올바르게 배포 되었다.
ENV HOSTNAME="0.0.0.0"