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

윤희돈님의 프로필 이미지
윤희돈

작성한 질문수

Airflow 마스터 클래스

pythonoperator 를 이용한 unzip 오류

작성

·

444

·

수정됨

0

python operator를 이용한 파일 unzip 시 permision denied 오류 발생했습니다.

airflow 는 wsl을 이용하여 설치하였고, unzip을 이용하여 네트워크 드라이브에 압축을 풀어 저장하고자 합니다.

이때

[2023-09-01, 18:12:33 KST] {taskinstance.py:1824} ERROR - Task failed with exception Traceback (most recent call last): File "/home/xxx/airflow_env/lib/python3.10/site-packages/airflow/operators/python.py", line 181, in execute return_value = self.execute_callable() File "/home/xxx/airflow_env/lib/python3.10/site-packages/airflow/operators/python.py", line 198, in execute_callable return self.python_callable(*self.op_args, **self.op_kwargs) File "/home/xxx/airflow/dags/Answersheet_dp_2.py", line 66, in unzipfiles zip_ref.extractall(extract_path) File "/usr/lib/python3.10/zipfile.py", line 1647, in extractall self._extract_member(zipinfo, path, pwd) File "/usr/lib/python3.10/zipfile.py", line 1701, in extractmember open(targetpath, "wb") as target: PermissionError: [Errno 13] Permission denied: '/mnt/s/04.xxxxx/'

와 같은 오류가 발생하였습니다.

위 문제를 해결하려면 어떻게 해야하나요?

답변 2

1

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

안녕하세요! 윤희돈님

우선 저 에러는 권한이 없어서 발생한 에러인데, 에러 발생한 대상 파일이 root owner로 만들어지지 않았는지 확인이 필요합니다. 에러 발생한 해당 파일에 대해 ls -l 명령으로 owner를 한번 확인해보시겠어요?

 

그리고 보다보니 저도 궁금한게 있는데, airflow를 WSL내 도커 컨테이너를 이용하여 설치하셨을까요?

그렇다면 WSL의 /mnt/s 드라이브를 airflow worker/scheduler가 인식하지는 못했을거라서요.

airflow를 도커 이용하지 않고 설치하신걸까요?

윤희돈님의 프로필 이미지
윤희돈
질문자

airflow 는 도커를 사용하지 않고 wsl로 우분투 22.04.2 LTS 버전으로 설치하였습니다.
mnt/s/ 드라이브는 root owner이고, airflow가 설치된 곳은 사용자 계정입니다.
mnt/s 드라이브에 생성된 파일 owner 확인해보니 root 였습니다.

도커로 설치를 하고자 하였는데, 도커 내에서 mnt/s 드라이브를 접근하는 방법을 찾지 못해서 wsl로 설치하였습니다. 혹시 도커에서 mst/s 드라이브를 접근할 방법도 알 수 있을까요?

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

airflow 를 docker-compose를 이용해서 설치했을 때 yaml 파일 내 volume 연결해주는 항목 있었죠?

그 부분에 아래처럼 작성하시면 되요.

밑에 코드는 docker-compose.yaml 파일의 volumes 항목에서 /mnt/c 볼륨 밑에 Downloads 폴더를 airflow의 /opt/airflow/download 폴더로 연결되도록 한거에요.

volumes:
    - ${AIRFLOW_PROJ_DIR:-.}/airflow/dags:/opt/airflow/dags
    - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
    - ${AIRFLOW_PROJ_DIR:-.}/airflow/plugins:/opt/airflow/plugins
    - /mnt/c/Users/statg/Downloads:/opt/airflow/download

이렇게 하면 잘 될거에요.

해보시고 안되시면 다시 남겨주세요 ^^

 

윤희돈님의 프로필 이미지
윤희돈
질문자

volumes 부분에
"/mnt/c/Users/statg/Downloads:/opt/airflow/download" 와 유사하게 작성하여
네트워크 드라이브 접속 문제 해결하였습니다!
빠른 답변 감사드립니다~

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

네 도커로 다시 설치해서 해결되셨다니 다행이네요 ^-^

열공하시고 또 궁금한 점 있으면 남겨주세요.

 

0

윤희돈님의 프로필 이미지
윤희돈
질문자

Traceback (most recent call last): File "/home/airflow/.local/lib/python3.8/site-packages/airflow/operators/python.py", line 192, in execute return_value = self.execute_callable() File "/home/airflow/.local/lib/python3.8/site-packages/airflow/operators/python.py", line 209, in execute_callable return self.python_callable(*self.op_args, **self.op_kwargs) File "/opt/airflow/dags/file_unzip_dag.py", line 36, in _unzip_files shutil.unpack_archive(zip_file_path, extract_path, format) File "/usr/local/lib/python3.8/shutil.py", line 1239, in unpack_archive func(filename, extract_dir, **dict(format_info[2]), **filter_kwargs) File "/usr/local/lib/python3.8/shutil.py", line 1151, in _unpack_zipfile _ensure_directory(target) File "/usr/local/lib/python3.8/shutil.py", line 1128, in _ensure_directory os.makedirs(dirname) File "/usr/local/lib/python3.8/os.py", line 213, in makedirs makedirs(head, exist_ok=exist_ok) File "/usr/local/lib/python3.8/os.py", line 223, in makedirs mkdir(name, mode) PermissionError: [Errno 13] Permission denied: '/opt/airflow/sdrive/04.XXX/230918'

도커에서 네트워크 드라이브 마운트 성공하여 도커 내부 opt/airflow 경로에 sdrive 와 S: 를 연결하였습니다.

그런데 python operator 로 압축을 푸는 과정에서 [Errno 13] Permission denied 가 발생했습니다.
알집파일이 있는 경로를 제대로 불러왔는 지 확인하고자
print(str(os.path.exists(zip_file_path))+': zip_path') 를 사용했을때, True 가 출력됐습니다.

도커에서 폴더를 생성할때 문제가 되는 것 같습니다.

도커 bash 내에서 ls -al 을 입력하니 모두 root 로 나왔는데,dag를 sudo 유저로 설정하여 실행시키는 방법이 있을까요?


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

안녕하세요 희돈님

오랜만에 답글을 달아주셨네요 ^^

우선... dag 내에서 sudo로 실행시키기는 어려울 것 같고 윈도우 네트웍 드라이브를 WSL 내에서 마운트시킬 때 root owner가 아닌 user owner로 마운트를 시켜줘야 할 듯 합니다.

네트웍 드라이브를 WSL에서 마운트할 때

sudo mount -t drvfs S: /mnt/s -o metadata,uid=1000,gid=1000

이렇게 마운트하면 WSL의 기본 유저로 마운트가 가능합니다.

그러면 그 안의 내용들도 기본 유저의 owner, group 권한으로 보일거에요.

그럼 압축 푸는것도 해결될겁니다.

한번 해보시고 안되시면 또 남겨주세요 ^^

윤희돈님의 프로필 이미지
윤희돈
질문자

안녕하세요. 강사님.
알려주신대로 진행했을 때, wsl에서 dag 를 main 함수에 넣고 실행을 시켜봤을 때, 정상적으로 압축 해제가 가능했습니다.
하지만 docker exec -it "컨테이너" bash 로 컨테이너 내부에서 실행시켰을 때, [Errno 13] Permission denied이 똑같이 발생했습니다.

도커를 통해 컨테이너 안에서 실행시킬 때 ls -al 명령을 확인해보니 root 권한이 유지되었습니다.

 

drwxr-xr-x 2 root root          0 Sep  4 00:54  230831
-rwxr-xr-x 1 root root 4450999869 Sep  1 03:33  230831.zip
-rwxr-xr-x 1 root root 3515218982 Sep 19 12:54  230918.zip

dag 를 wsl에서 실행시키는게 아니고, 도커 컨테이너 내부에서 실행하기 때문에 권한 문제가 발생하는 것 같습니다...

에어플로를 도커에 설치하지 않고 wsl로 설치하여 실행해야 네트워크 드라이브에 있는 알집 파일을 풀 수 있을까요..?

 

항상 친절한 답변 감사드립니다!!

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

음.. 희돈님이 말씀하신 상황을 제가 잘 이해를 못했습니다.

WSL내 도커를 이용하지 않고 그냥 Airflow를 올린 상태에서는 압축 해제가 잘 됐고,

WSL 내 도커를 이용해서 Airflow를 올렸을 때는 여전히 잘 안됐다는 의미이지요?

아래 순서대로 확인이 잘 됐는지 한번만 더 확인 부탁드립니다.

  1. 네트웍 드라이브를 WSL에 마운트할 때 제가 알려드린 sudo mount -t drvfs S: /mnt/s -o metadata,uid=1000,gid=1000

    명령으로 마운트하면 마운트된 WSL 내부의 파일들은 user owner로 보이는 것은 확인되었나요?

  2. 그리고나서 docker-compose.yaml 파일의 volumes 항목을 이용해서
    /mnt/s/디렉토리:/opt/airflow/download

같은 형태로 지정하여 기동하신것도 맞을까요?

  1. 이 상태에서 docker worker 컨테이너 내부에 들어가서 /opt/airflow/download 폴더에 보면 파일들이 root owner가 아닌 default owner 로 보이나요?

 

윤희돈님의 프로필 이미지
윤희돈
질문자

안녕하세요!
wsl에서 s drive를 마운트만 시키고 docker compose down 을 하지 않고, 확인을 해서 그대로 root 계정으로 보였던 것 같습니다.

말씀대로 docker compose up 을 새로 하여 확인하니 일반 계정으로 확인이 되었습니다.

정상적으로 알집 해제작업 진행하고 있습니다.

친절한 답변 감사드립니다!!

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

잘 해결되서 다행입니다.

그럼 열공하시기 바래요 ^^

윤희돈님의 프로필 이미지
윤희돈

작성한 질문수

질문하기