작은하마

[AWS] S3의 목록을 Boto3 list_objects_v2 로 1000개 이상 불러오기 본문

AWS/Glue

[AWS] S3의 목록을 Boto3 list_objects_v2 로 1000개 이상 불러오기

꼬몽울 2021. 7. 12. 11:14

AWS에서 Boto3는 가장 기본으로 가져가야할 지식이 아닌가 한다.

 

최근 Glue에서 S3의 Log파일을 읽어와 DF에서 전처리를 진행하는 작업을 하나 만들었었는데 최근 이게 문제가 발생하였다.

 

list_objects_v2를 사용하여 S3의 목록 갯수가 1000개가 넘어가면 1000개 이후의 목록들은 잘려서 가져오는데 여기서 문제가 발생하였다.

 

확인결과 리스트에 1130개 정도의 목록이 있었고 필요한 Log파일은 1000개를 제외한 130개 중 하나에 있었다.

 

여러가지 해결방안이 생각이 났다.

1. log파일의 경로를 파티셔닝 시켜서 1000개이상이 되지 않도록 만든다 => 날짜별 폴더를 생성하게 만들기

2. 파일을 오름차순, 또는 내림차순시켜서 해당파일을 1000개 안으로 가져오게 만든다.

3. 1000개 이상으로 불러올 방법을 찾는다.

 

1번의 경우가 가장 해결하기 쉽고 관리하기도 쉽고 정석인 방법이지만 해당 경로로 Log파일을 생성되게 만드려면 기존 Job의 수정이 불가피 하기떄문에 고객사 측에서 주저했다.

 

2번의 경우도 쉬운방법이나 하나의 폴더에 Log파일을 넣게되면 언젠가는 1000개가 넘어버리기때문에 Pass

 

3번을 적용하기로 했다.

 

AS-IS

s3 = boto3.client('s3') 
bucket = 'bucket' 
key_path = '경로' 
obj = s3.get_object(Bucket=bucket, Key=key_path)
result=s3.list_objects_v2(Bucket=bucket, Prefix=key_path)

for item in result['Contents']:
    files = item['Key']
    file_nm=files.split('/')[2]

위와같이 list_objects를 가져와 파일이름을 가져오게 만들었었다. => 1000개 이상넘어가면 잘림

 

paginator = s3.get_paginator('list_objects_v2')
list = paginator.paginate(Bucket=bucket, Prefix=key_path)

paginator를 사용하여 1000개 이상의 리스트를 가져오면 paginator에서 자동으로 페이징을 하여 다음페이지로 불러 오게 된다.

https://boto3.amazonaws.com/v1/documentation/api/latest/guide/paginators.html

 

Paginators — Boto3 Docs 1.17.109 documentation

Paginators are created via the get_paginator() method of a boto3 client. The get_paginator() method accepts an operation name and returns a reusable Paginator object. You then call the paginate method of the Paginator, passing in any relevant operation par

boto3.amazonaws.com

 

최종적으로

for page in list:
    for item in page['Contents']:
        files = item['Key']
        file_nm=files.split('/')[-1]

이렇게 해당경로에 있는 모든 파일이름을 가져왔다.

'AWS > Glue' 카테고리의 다른 글

[AWS] GLUE의 2가지 핵심기능  (0) 2021.08.05
[AWS] GLUE의 배치결과를 Slack으로 전송하기  (0) 2021.07.09
Comments