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
'Programming-[Infra] > Cloud-AWS' 카테고리의 다른 글
Elasticache 연결 문제 - <unresolved>:6379, Redis, Springboot, Lettuce (0) | 2024.02.15 |
---|---|
[탐험]S3 Content-Disposition으로 파일 다운로드 이름 변경, CloudFront 캐시 무효화 (1) | 2023.10.05 |
[TIL] AWS Lambda, CloudFormation, Gateway (0) | 2022.10.19 |
2020/11/11 TIL : AWS/local 서버 생성, AWS DB 생성, 서버-DB 연결 (0) | 2020.11.11 |
[AWS] 개요, S3, EC2, RDS 시작 방법 등 (0) | 2020.11.03 |