2016-12-29 5 views
1

/photos이라는 접두어 (또는 "폴더")가있는 AWS S3 버킷이 있습니다. 그것은 "많은 양의 이미지 파일을 포함하고 더 적은 파일 EVENT.json을 포함합니다. 본래의 표현은 다음과 같습니다 boto3을 사용하여 특정 파일 이름과 일치하는 S3 객체

  • 내-멋진-이벤트 버킷
    • 사진
      • 에서는 image1.jpg
      • 에서는 image2.jpg
      • 1_EVENT.json
      • 에게 image3.jpg
      • 2_EVENT.json
      • ,
      • ...

    EVENT.json 파일

특정 이벤트에 이미지 파일의 임의의 양의 그룹 이미지 경로 참조를 포함하는 객체를 갖는다. 위 예제를 사용하면 image1.jpg와 image2.jpg가 1_EVENT.json에 나타날 수 있으며 image3.jpg는 2_EVENT.json에 속할 수 있습니다.

버킷이 커지면 결과를 페이징하는 데 관심이 있습니다. S3에서 한 번에 한 페이지 만 요청하면됩니다. 내가 겪고있는 문제는 "EVENT"라는 단어가 포함 된 키에 의해 특별히 페이지를 지정하고자한다는 것입니다. 모든 객체를 다시 가져 오지 않고 결과를 필터링하거나 반복하지 않으면이 작업을 수행하기가 어렵습니다.

S3 Paginator을 사용하면 페이징 작업을 할 수 있습니다.

/photos/ 
/photos/image1.jpg 
/photos/image2.jpg 
/photos/1_EVENT.json 
/photos/image3.jpg 
/photos/2_EVENT.json 
S3의 평면 구조는 접두사에 따라 양동이에 모든 객체를 통해 페이징 및 제한 것을 의미

및 내 PageSizeMaxItems 6으로 설정되어 가정하면, 이것은 내 첫 페이지를 다시 얻을 수 있습니다 것입니다 페이징 매개 변수에 따라 페이징. 즉, 페이지에 따라 EVENT.json 파일을 여러 개 가져올 수도 있고 전혀 가져갈 수도 없습니다. 첫째 모든 객체를 요청하고 어떤 방법으로 설정 한 결과를 슬라이스 할 필요없이

/photos/1_EVENT.json 
/photos/2_EVENT.json 
/photos/3_EVENT.json 
/photos/4_EVENT.json 
/photos/5_EVENT.json 
/photos/6_EVENT.json 

;

그래서 나는이의 라인을 따라 뭔가 더 찾고 있어요 나는 현재하고있어 정확히 어떤 :

client = boto3.client('s3') 
paginator = client.get_paginator('list_objects_v2') 
page_iterator = paginator.paginate(
    Bucket=app.config.get('S3_BUCKET'), 
    Prefix="photos/") # Left PaginationConfig MaxItems & PageSize off intentionally 
filtered_iterator = page_iterator.search(
    "Contents[?contains(Key, `EVENT`)][]") 
for page in filtered_iterator: 
    # Do stuff. 
    pass 

위를 정말 비싼, 아니 페이징으로, 그러나 그것은 나에게 내 "이벤트"검색 문자열을 포함하는 모든 파일의 목록을 제공한다.

구체적으로는 의 결과 만 EVENT.json 개체는 S3을 통해 boto3을 사용하여 요청할 때마다 모든 개체를 반환하고 필터링하는 오버 헤드없이 처리해야합니다. 그게 가능하니?

EDIT : 나는 이미 photos/ 접두어가 붙은 개체로 요청을 좁히고 있습니다. 내 버킷에는 EVENT 파일을 포함 할 수있는 다른 "폴더"가 있기 때문입니다. 따라서 EVENT 또는 EVENT를 사용할 수 없습니다.응답이 다른 폴더의 파일에 의해 오염 될 수 있으므로 json을 내 접두사로 사용하십시오.

+0

Amazon S3 콘텐츠 목록이 필요하고 완벽하게 최신 버전이 필요하지 않은 경우 [Amazon S3 Storage Inventory] (http://docs.aws.amazon.com/AmazonS3/)를 사용할 수 있습니다. 최신/dev/storage-inventory.html) S3 버킷에있는 모든 파일의 일일 CSV를 저장합니다. –

+0

@JohnRotenstein 저장소 인벤토리는 결과를 페이징하는 데 도움이되는 추가 구조를 제공하지 않는 것으로 보이며 [설명서] (http://docs.aws.amazon.com/AmazonS3/latest)에 따라 접두어로 카탈로그로 제한됩니다. /dev/storage-inventory.html#storage-inventory-how-to-setup). 그러나이를 사용하여 지정된 접두사가있는 EVENT 파일의 인벤토리를 만들고 유지 관리 할 수 ​​있다면 예약 된 인벤토리가 기다릴 가치가 있습니다. – afilbert

답변

2

가장 간단한 방법은 이벤트 파일이대신 photos/EVENT_*.json 패턴을 따르도록 파일 구조를 재사용하는 것입니다. 그런 다음 공통 접두어 photos/EVENT을 사용할 수 있습니다.

너가 사용하는 값 ​​비싼 방법이 실제로 그것에 관하여가는 유일한 방법다고 나는 생각한다.

+0

'\'backticks \''을 사용하여 파일 이름을 이스케이프하십시오. '* 여기에있는 것들 * '은 기울임 꼴로 표시됩니다. –

+0

파일 이름은 불행하게도 프로젝트에 들어가기 전에 개발 된 앱에 의해 생성됩니다. 이미 고객의 순환기에 있으며 변경하기 어려울 것입니다. 이것을 잠시 살펴본 후에 필자는 제안한대로 파일 이름 지정 및 구성 방법을 변경하거나 모든 개체를 다시 가져 오는 오버 헤드를 해결할 필요가 있음을 결론지었습니다. S3 서비스의 이름에 "단순한"것이 주어지면 놀랄 필요가 없습니다. 나는 RDS를 통해 결과를 캐싱하고 페이징하는 방법을 검토 중이다. – afilbert

0

boto의 검색 기능 중 하나에 던질 수있는 접두사 옵션이 있습니다. 이렇게하면 스캔해야하는 파일의 양이 크게 줄어 듭니다. 그러나 문자열의 중간에 와일드 카드를 사용하여 문자열을 검색해야하는 경우, 그 객체의 모든 객체를 검사해야한다는 것을 알았지 만 객체를 검색 할 때 와일드 카드를 사용해야합니다.

예는 :

bucket.search_function(prefix="string") 

그래도 난 내 머리 위로 떨어져 BOTO 기능을 불러올 수 없습니다.

+0

불행히도 이미 접두사를 사용하여 내 결과를/photos "폴더"로 제한하고 있습니다. 그렇지 않으면 EVENT를 접두어로 사용하고 하루로 부릅니다. 불행히도 내/사진 이벤트를 오염시키지 않으려는 동일한 버킷의 다른 "폴더"에도 EVENT 파일이 있습니다. – afilbert