본문 바로가기
관리자

Programming-[Infra]/Cloud-AWS

[TIL] AWS S3 donwload_file() method directory에 random string 붙는 현상. FileNotFoundError

728x90
반응형

1. 현상

 
S3의 boto3를 이용하여 donwload_file() 메서드를 실행한다. 첫 번째 인자인 obj.key는 S3에 저장된 파일의 key값, 두번째 인자는 저장된 버킷의 이름, 세 번째 인자는 다운로드한 파일을 저장할 디렉토리 이름이다.

 
os.mkdir(folder, exist_ok=True) 를 써서 folder에 대한 경로는 로컬에 만들어놓고, obj.key값을 붙여서 저장할려고 했는데 저장이 안되고 디버깅 상에서 _packed라는 obj.key 상 파일 이름 뒤에 .bd88bF6E라는 이상한 문자열이 추가로 붙었다. 그리고 실행할 때마다 뒤 문자열이 임의로 계속 변경되었다.
 
 

2. 원인

random string이 붙는 현상
boto3는 파일 다운로드 중 파일의 이름 뒤에 random string을 붙인다. 마치 크롬으로 파일을 다운로드 하고 있을 때 다운로드 하고 있는 파일을 확인해보면 cr_download.{random string}이 붙는 원리와 비슷한 것 같다. 디버깅 중에는 exception이 나서 다운로드 도중에 에러가 났으므로 파일 이름 뒤에 random string이 붙은 채로 출력된 것이다. 만약 정상통과 된다면 이 random string은 사라진다.
 
FileNotFoundError 원인
os.mkdir을 통해서 로컬 디렉토리를 만들었지만, obj.key값 속에 AWS S3에서의 key값 상 포함된 디렉토리처럼 보이는 "/"가 있기 때문이다. 예를 들어 AWS S3 파일의 key 값은 "test/files/file.txt" 라면 세 번째 인자에 folder/test/files/file.txt 라는 경로를 입력하여 현재 로컬 디렉토리에 생성되어있지 않은 디렉토리를 조회하는 꼴이 되기 때문이다.
 
 

3. 해결방안

key값에서 /가 들어간 부분들을 제외한다. split을 해도 되고, os.path.join()을 사용해도 된다.

 
 
 

참조

 
https://stackoverflow.com/questions/31918960/boto3-to-download-all-files-from-a-s3-bucket

728x90
반응형