오늘 크롤링 서버를 EC2에 배포하면서 github action을 사용해 CI/CD 워크 플로우를 구성하던 중, 비동기 작업을 처리하는 celery_worker 가 redis에 연결을 요청해서 작업 큐로 사용해야하는데 엄한 곳에다가 요청을 하는 소동이 벌어졌다. 분명히 로컬에서는 도커 컴포즈로 띄웠을 때 잘 작동하던 코드라 안될리가 없는데, 안돼서 당황스러움을 가득 안고 디버깅에 들어갔다.
1. 에러 상황
개요는 이러했다.
이런 식으로 잘 연결되어야 하는 애가
celery_worker | [INFO/MainProcess] Connected to redis://redis_celery:6379/0
바보마냥 연결해야할 엔드포인트를 잘 못 지정하고 있는 문제였다.
amqp와 5672포트로 연결하는 걸 미루어보아 기본으로 rabbitMQ에 연결하려고 하는 것 같다.
celery_worker | [ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
celery_worker | Trying again in 2.00 seconds... (1/100)
celery_worker |
celery_worker | [ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
celery_worker | Trying again in 2.00 seconds... (2/100)
2. 잘못된 점
이 연결 설정 정보를 지정하는 곳의 코드를 보자면 이 코드인데
환경 변수들을 .env파일에 모아놓고 저장하고 있어 os.getenv()와 같은 식으로 불러오고 있었다.
#CeleryConfig.py
load_dotenv()
BROKER_URL = os.getenv("CELERY_BROKER_URL")
BACKEND_URL = os.getenv("CELERY_RESULT_BACKEND")
# ✅ Redis 설정 (Celery와 연동)
celery_app = Celery(
"scraper",
broker=BROKER_URL, # 🔹 메시지 브로커 (현재 Redis 사용 중)
backend=BACKEND_URL, # 🔹 작업 결과 저장을 위한 백엔드 추가
include=["workers.scraping_tasks"]
)
분명 로컬에서는 잘 실행됐고, 컨테이너로 실행되는 환경이라서 어느 os에서도 잘 돌아가야하는데, 에러가 나는 게 이상했다.
알고보니,
나는 github actions를 사용해서 repo에 push한 github 코드를 기반으로 이미지를 만들고, 도커허브에 올려서 해당 이미지를 깃헙 액션이 pull 해와서 내 배포 서버에 올리는 과정이이었는데, 환경 변수 파일은 gitignore을 통해서 github에 올리는 건 제외해놨기 때문에 해당 github repo의 코드로 구운 이미지에는 환경변수 설정 파일이 포함되지 않아서 일어난 일이었다. 그래서 일단은 하드코딩으로 임시방편을 해놨는데 차후에 환경변수 파일을 추가하고 개선할 예정이다.
+
이후 배포를 마치고 해당 ec2 서버로 curl을 보내 확인해보려는데, 요청이 도달하지 못하는 이슈가 발생했다.
대부분 이런 이슈는 보안그룹을 잘 못 지정하거나, 포트를 잘 못 지정해서 일어난 일이기에
1. 보안그룹
2. 포트 포워딩, 포트 바인딩
두가지 위주로 확인해보았다.
보안그룹의 경우는 http 포트나 https: 두가 지 포트와 ssh 세가지 포트가 모두 잘 열려있는 걸 확인할 수 있었다.
생각해보니 로컬에서 쓰던 docker-compose 를 사용해서 서버를 띄운거라 서버가 8000->8000 으로 포워딩 돼 있다는 걸 알 수 있었다. 그러나 내가 열어놓은 포트는 80 번 포트이기에 docker-compose.yml 에서 바인딩을 80으로 바꿔주고 포워딩을 80->8000으로 설정해주었더니 요청을 잘 받을 수 있었다.
fastapi_app | INFO: Started server process [8]
fastapi_app | INFO: Waiting for application startup.
fastapi_app | INFO: Application startup complete.
fastapi_app | INFO: 115.23.129.96:61030 - "GET / HTTP/1.1" 200 OK
fastapi_app | INFO: 115.23.129.96:61030 - "GET /favicon.ico HTTP/1.1" 404 Not Found
fastapi_app | INFO: 115.23.129.96:61034 - "GET /api/task-status/e4048591-8626-4329-80a1-d76171066162 HTTP/1.1" 200 OK
fastapi_app | INFO: 54.196.247.85:54222 - "GET / HTTP/1.1" 200 OK
다음 포스팅이야 말로 제목에 어울리는 포스팅이 되겠다 쓰다보니 사담이 많이 들어가게 되어 구분하려고 한다,,, ㅎㅎ
읽어주셔서 감사합니다..
다음 시간에는 그러면 환경변수를 배포환경에 어떻게 안전하게 추가할 수 있는 지에 대해 포스팅을 하겠다.
'AlgoMate' 카테고리의 다른 글
host.docker.internal은 왜 운영환경에서 사용하기 어려울까⁉️ (0) | 2025.02.19 |
---|---|
🛠️ 컨테이너 내부에서 로컬 서버로 API 요청 보내는 방법 🚀 (0) | 2025.02.19 |
Selenium을 통한 크롤링 시, 마주하는 reCAPTCHA 해결기 (0) | 2025.02.19 |
Redis만으로도 비동기 처리는 가능하잖아‼️ 근데 왜 Celery+Redis를 사용해야 할까 (0) | 2025.02.18 |
🚀 크롤링 서버 vs 메인 서버, 크롤링한 데이터를 어디서 저장해야 할까? (0) | 2025.02.17 |