인프런 커뮤니티 질문&답변

nathan님의 프로필 이미지
nathan

작성한 질문수

Airflow 마스터 클래스

section 8 postgres 연결 안됨

해결된 질문

작성

·

438

·

수정됨

0

선생님 안녕하세요

좋은 강의 감사합니다.

 

section 8, connection 과 hook 강의 9분 대에서 처음으로 postgres 서버와 연결하는 부분에서 연결이 안된다고 에러가 뜨는데요

 

에러내용은 아래와 같습니다.


참고로 저는 5432 포트 대신 5429 포트를 사용했고, dbeaver 상에 postgres도 제대로 연결이 되었고, py_opr_drct_insrt 테이블도 제대로 만들어졌습니다.

오류 내용 중에 이런 내용이 있던데

conn = _connect(dsn, connection_factory=connection_factory, **kwasync)

psycopg2.OperationalError: connection to server at "172.28.0.3", port 5429 failed: Connection refused

Is the server running on that host and accepting TCP/IP connections?

 

postgres 설정에 무슨 문제가 있는 것일까요?

 

 

891c9ef91a84

*** Found local files:

*** * /opt/airflow/logs/dag_id=dags_python_with_postgres/run_id=manual__2024-01-01T05:58:04.315802+00:00/task_id=insrt_postgres/attempt=1.log

[2024-01-01, 14:58:06 KST] {taskinstance.py:1103} INFO - Dependencies all met for dep_context=non-requeueable deps ti=<TaskInstance: dags_python_with_postgres.insrt_postgres manual__2024-01-01T05:58:04.315802+00:00 [queued]>

[2024-01-01, 14:58:06 KST] {taskinstance.py:1103} INFO - Dependencies all met for dep_context=requeueable deps ti=<TaskInstance: dags_python_with_postgres.insrt_postgres manual__2024-01-01T05:58:04.315802+00:00 [queued]>

[2024-01-01, 14:58:06 KST] {taskinstance.py:1308} INFO - Starting attempt 1 of 1

[2024-01-01, 14:58:06 KST] {taskinstance.py:1327} INFO - Executing <Task(PythonOperator): insrt_postgres> on 2024-01-01 05:58:04.315802+00:00

[2024-01-01, 14:58:07 KST] {standard_task_runner.py:57} INFO - Started process 80 to run task

[2024-01-01, 14:58:07 KST] {standard_task_runner.py:84} INFO - Running: ['***', 'tasks', 'run', 'dags_python_with_postgres', 'insrt_postgres', 'manual__2024-01-01T05:58:04.315802+00:00', '--job-id', '447', '--raw', '--subdir', 'DAGS_FOLDER/9. dags_python_with_postgres.py', '--cfg-path', '/tmp/tmp7_5f243h']

[2024-01-01, 14:58:07 KST] {standard_task_runner.py:85} INFO - Job 447: Subtask insrt_postgres

[2024-01-01, 14:58:07 KST] {task_command.py:410} INFO - Running <TaskInstance: dags_python_with_postgres.insrt_postgres manual__2024-01-01T05:58:04.315802+00:00 [running]> on host 891c9ef91a84

[2024-01-01, 14:58:07 KST] {taskinstance.py:1547} INFO - Exporting env vars: AIRFLOW_CTX_DAG_OWNER='***' AIRFLOW_CTX_DAG_ID='dags_python_with_postgres' AIRFLOW_CTX_TASK_ID='insrt_postgres' AIRFLOW_CTX_EXECUTION_DATE='2024-01-01T05:58:04.315802+00:00' AIRFLOW_CTX_TRY_NUMBER='1' AIRFLOW_CTX_DAG_RUN_ID='manual__2024-01-01T05:58:04.315802+00:00'

[2024-01-01, 14:58:07 KST] {taskinstance.py:1824} ERROR - Task failed with exception

Traceback (most recent call last):

File "/home/airflow/.local/lib/python3.7/site-packages/airflow/operators/python.py", line 181, in execute

return_value = self.execute_callable()

File "/home/airflow/.local/lib/python3.7/site-packages/airflow/operators/python.py", line 198, in execute_callable

return self.python_callable(*self.op_args, **self.op_kwargs)

File "/opt/airflow/dags/9. dags_python_with_postgres.py", line 16, in insrt_postgres

with closing(psycopg2.connect(host=ip, dbname=dbname, user=user, password=passwd, port=int(port))) as conn:

File "/home/airflow/.local/lib/python3.7/site-packages/psycopg2/__init__.py", line 122, in connect

conn = _connect(dsn, connection_factory=connection_factory, **kwasync)

psycopg2.OperationalError: connection to server at "172.28.0.3", port 5429 failed: Connection refused

Is the server running on that host and accepting TCP/IP connections?

[2024-01-01, 14:58:07 KST] {taskinstance.py:1350} INFO - Marking task as FAILED. dag_id=dags_python_with_postgres, task_id=insrt_postgres, execution_date=20240101T055804, start_date=20240101T055806, end_date=20240101T055807

[2024-01-01, 14:58:07 KST] {standard_task_runner.py:109} ERROR - Failed to execute job 447 for task insrt_postgres (connection to server at "172.28.0.3", port 5429 failed: Connection refused

Is the server running on that host and accepting TCP/IP connections?

; 80)

[2024-01-01, 14:58:07 KST] {local_task_job_runner.py:225} INFO - Task exited with return code 1

[2024-01-01, 14:58:07 KST] {taskinstance.py:2653} INFO - 0 downstream tasks scheduled from follow-on schedule check

 

 

 

같은 강의 15:00 부분 connection 부분 실습에서 test를 누르면 아래와 같은 에러가 뜹니다. 아마 같은게 아닐까 싶습니다

connection to server at "172.28.0.3", port 5429 failed: Connection refused Is the server running on that host and accepting TCP/IP connections?

 

 

dags_python_with_postgres 파일에서 구간마다 print 를 해서 실행되는지 여부를 확인해본 결과

 

print('실행1')

with closing(psycopg2.connect(host=ip, dbname=dbname, user=user, password=passwd, port=int(port))) as conn:

print('conn', conn)

 

'실행1' 은 프린트가 되는데 conn은 프린트가 안됩니다.

그런데 ip, port, dbname, user, passwd, **kwargs 모두 정확하게 들어갔거든요 ㅠ

 

답변 1

0

김현진님의 프로필 이미지
김현진
지식공유자

안녕하세요 nathan 님!

새해에도 열공하시네요 ^^

docker-compose.yaml 파일에서 postgres 포트를 5429:5432 이렇게 작성하셨나요?

그렇다면 외부에서(local 컴퓨터에서) 접속할 때는 5429 포트로 접속하시는게 맞습니다.

하지만 컨테이너들끼리 접속할 때에는 5432로 접속하셔야 해요 .

5429는 컨테이너가 외부로 노출할 때의 IP이고 컨테이너들끼리 통신할때는 내부 포트인 5432를 사용합니다.

 

airflow의 connection 등록에서 port를 5429가 아닌 5432로 한번 해보시겠어요?

 

nathan님의 프로필 이미지
nathan
질문자

세상에...되네요ㅠ 명쾌한 설명 정말 감사합니다.

 

질문 하나 더 추가로 드립니다.

 

지금 저는 docker on window를 사용하고 있고요.

image

airflow_pull 이라는 폴더 안에서 작업중입니다.

메타db는 5431:5432 포트를 사용하고 있고, 실습을 위해서 만든 postgres_custom db는 5429:5432 포트를 사용하고 있습니다.

 

그런데 postgres_custom 는 같은 도커 안에 만든 것이고, 위의 그림과 같이 postgres 컨테이너를 다른 도커로 별도로 만들었거든요 (5555:5432 포트를 사용합니다)

 

이 경우에도 똑같이 5432로 접근한다면, postgres_custom db와 헷갈리는것 아닐까요?

 

새로운 db에 접속할때는 dags_python_with_postgres 를 아래와같이 수정했습니다.  

 op_args=['172.21.0.2', '5432', 'daily_code', 'postgres', 'password1234']

image

(근데 지금 해봤는데 5432, 5555 둘다 안되네요 ㅠ)

김현진님의 프로필 이미지
김현진
지식공유자

맨 위에 있는 postgres_db_1 에 접속하시려는 거죠?

동일한 포트를 가진 컨테이너라 하더라도 컨테이너들은 IP로 구분이 됩니다.

현재 nathan님은 172.21.0. 대역의 네트워크를 가지고 있습니다.

  • postgres_custom-1의 IP는 172.21.0.3 이고

  • postgres_db_1의 IP는 또 다른 IP일 겁니다. 따라서 이 컨테이너의 IP를 확인해본 후 해당 IP:5432 포트로 접속해보시면 될거에요.

     

     

    그런데 혹시나 확인해셔야 하는 것이 airflow_pull 이라는 폴더에 묶여 있는 컨테이너들이 쓰고 있는 네트워크 대역(172.21.0. )대역을 postgres_db_1 컨테이너도 쓰고있는지를 확인해보셔야 해요. 만약 postgres_db_1 컨테이너가 172.22.0. 대역처럼 전혀 다른 대역을 쓰고 있다면 airflow_pull 아래에 있는 컨테이너들이 접속할 수 없습니다.

     

     

    한번 확인해보실래요?

     

     

nathan님의 프로필 이미지
nathan
질문자

선생님 안녕하세요

답변 감사합니다!!

 

강의에서 만든 postgres_custom : 172.28.0.3 IP를 사용중입니다.

(강의에서 만든 모든 container 와 dag는 172.28~ 을 사용중입니다)

 

제가 별도로 만든 postgres_db_1 : 172.21.0.2 IP 를 사용중입니다.

 

이런경우 28 vs 21 이라는 별도의 대역을 쓰고 있기때문에, 컨테이너 간 접속이 안된다는 말씀이시죠?

 

그러면, (어떤 이유에서든) 별도로 postgres 컨테이너를 만드는 경우에는 대역을 airflow_pull 이라는 작업폴더가 사용하고 있는 공통의 대역인 172.28.~~ 로 만들어줘야 접속이 가능하다는 말씀이신거네요! 맞으실까요?

김현진님의 프로필 이미지
김현진
지식공유자

넵 맞습니다.

네트워크 대역이 다르면 논리적으로 서로 바라볼 수 없는 상태입니다.

가장 쉬운 해결책은 postgres_db_1 컨테이너에 대해 airflow와 동일한 네트워크를 할당해주는 방법일 것 같구요.

아니면 postgres_db_1 컨테이너에 추가 네트워크를 부여할 수 있습니다. 이 컨테이너에 대해 현재 사용중인 172.21.0. 대역 말고도 airflow 에서 쓰고 있는 172.28.0. 대역의 네트워크를 부여해준다면 서로 통신이 가능할거에요.

 

nathan님의 프로필 이미지
nathan
질문자

선생님 답변 정말 감사합니다. 새해 복 많이 받으세요!

nathan님의 프로필 이미지
nathan

작성한 질문수

질문하기