S3 파일을 일괄 삭제하는 가장 효율적인 방법


16

S3에서 한 번에 수천 또는 수만 개의 파일을 일괄 적으로 삭제할 수 있기를 원합니다. 각 파일은 1MB에서 50MB 사이입니다. 당연히, 나는 파일이 삭제되는 동안 사용자 (또는 내 서버)가 대기하는 것을 원하지 않습니다. 따라서 질문 :

  1. S3는 특히 많은 수의 파일을 삭제할 때 파일 삭제를 어떻게 처리합니까?
  2. 이를 수행하고 AWS가 대부분의 작업을 수행 할 수있는 효율적인 방법이 있습니까? 효율적으로, 나는 S3에 대한 요청을 최소화하고 서버에서 가장 적은 양의 리소스를 사용하여 시간을 최소화하는 것을 의미합니다.

답변:


12

AWS는 S3 REST API 및 다양한 래퍼를 사용하여 요청 당 최대 1000 개의 객체를 대량으로 삭제할 수 있습니다. 이 방법에서는 제거하려는 S3 객체 키를 알고 있다고 가정합니다 (즉, 보존 정책, 특정 크기를 초과하는 파일 등을 처리하도록 설계되지 않음).

S3 REST API는 단일 요청에서 최대 1000 개의 파일을 삭제하도록 지정할 수 있으며 개별 요청보다 빠릅니다. 각 요청은 HTTP (따라서 TCP) 요청입니다. 따라서 각 요청에는 오버 헤드가 발생합니다. 객체의 키를 알고 HTTP 요청을 작성하거나 원하는 언어로 래퍼를 사용하면됩니다. AWS는이 기능과 사용법에 대한 훌륭한 정보를 제공합니다 . 가장 편한 방법을 선택하십시오!

유스 케이스에는 최종 사용자가 한 번에 삭제할 특정 파일을 여러 개 지정하는 것이 포함되어 있다고 가정합니다. "그림 파일을 참조하는 모든 개체를 제거하십시오"또는 "특정 날짜보다 오래된 모든 파일을 제거하십시오"(S3에서 별도로 구성하기 쉽다고 생각 함)와 같은 작업을 시작하기보다는.

그렇다면 삭제해야 할 키를 알게됩니다. 또한 사용자가 파일이 성공적으로 삭제되었는지 여부에 대한 실시간 피드백을 원한다는 것을 의미합니다. S3는 매우 많은 양의 데이터를 처리하더라도 효율적으로 확장되도록 설계되었으므로 정확한 키에 대한 참조는 매우 빠릅니다.

그렇지 않은 경우 비동기 API 호출을 조사 할 수 있습니다. 이 블로그 게시물 에서 일반적인 작동 방식에 대한 내용을 읽 거나 원하는 언어로 수행하는 방법을 검색 할 수 있습니다. 이를 통해 삭제 요청이 자체 스레드를 차지하고 나머지 코드는 사용자를 기다리지 않고 실행할 수 있습니다. 또는 요청을 대기열로 오프로드 할 수 있습니다. . . 그러나이 두 옵션 모두 코드 (비동기 코드가 성 가실 수 있음) 또는 환경 (대기열을 처리하기 위해 서비스 / 데몬 / 컨테이너 / 서버가 필요합니다)을 불필요하게 복잡하게 만듭니다. 가능한 경우이 시나리오를 피할 것입니다.

편집 : 2 개 이상의 링크를 게시 할 평판이 없습니다. 하지만 여기에 요청 속도와 성능에 아마존의 의견을 볼 수 http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html 그리고 S3 자주 묻는 질문 코멘트가 대량 deleiton가 있다는 가능하다면 갈 길.


19

극심한 느린 옵션은 s3 rm --recursive당신이 기다리고 실제로 같은 경우.

s3 rm --recursive서로 다른 --include패턴으로 병렬 로 실행하는 것이 약간 빠르지 만 각 프로세스가 개별적으로 --include패턴 일치를 수행하기 위해 전체 키 목록을 페치하므로 대기하는 데 많은 시간이 소요 됩니다.

일괄 삭제를 입력하십시오.

를 사용하여 한 번에 1000 개의 키를 삭제하여 가장 빠른 속도를 얻을 수 있다는 것을 알았습니다 aws s3api delete-objects.

예를 들면 다음과 같습니다.

cat file-of-keys | xargs -P8 -n1000 bash -c 'aws s3api delete-objects --bucket MY_BUCKET_NAME --delete "Objects=[$(printf "{Key=%s}," "$@")],Quiet=true"' _
  • -P8에 옵션 xargs제어 병렬. 이 경우 8 개로 한 번에 1000 개의 삭제가 8 개 있습니다.
  • -n1000옵션은 xargsaws s3api delete-objects통화 마다 1000 개의 키를 묶으 라고 지시 합니다 .
  • 이를 제거 ,Quiet=true하거나 변경하면 false서버 응답이 분출됩니다.
  • 참고 : _해당 명령 줄 끝에 쉽게 놓칠 수 있습니다 . @VladNikiforov는 의견에 대한 내용에 대한 훌륭한 논평을 게시 했으므로 링크에 연결하려고합니다.

그러나 당신은 file-of-keys어떻게 얻 습니까?

이미 키 목록이 있다면 좋습니다. 작업 완료

그렇지 않은 경우 다음과 같은 한 가지 방법이 있습니다.

aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | sed -nre "s|[0-9-]+ [0-9:]+ +[0-9]+ |SOME_SUB_DIR|p" >file-of-keys

10
훌륭한 접근 방법이지만 키를 나열하는 것이 병목 현상이라는 것을 알았습니다. 훨씬 빠릅니다 : aws s3api list-objects --output text --bucket BUCKET --query 'Contents[].[Key]' | pv -l > BUCKET.keys 그리고 객체를 제거합니다 (1 개의 병렬 프로세스를 넘어 tail -n+0 BUCKET.keys | pv -l | grep -v -e "'" | tr '\n' '\0' | xargs -0 -P1 -n1000 bash -c 'aws s3api delete-objects --bucket BUCKET --delete "Objects=[$(printf "{Key=%q}," "$@")],Quiet=true"' _
SEK

2
당신은 아마 _결국 에 중요성을 강조했을 것입니다 :) 나는 그것을 놓 쳤고 첫 번째 요소가 왜 건너 뛴지를 이해하는 데 꽤 오랜 시간이 걸렸습니다. 요점은 bash -c모든 인수를로 시작하는 위치 매개 변수로 전달 $0하는 반면 "$ @"는로 시작하는 매개 변수 만 처리 한다는 것 입니다 $1. 따라서 밑줄 더미는의 위치를 ​​채우기 위해 필요합니다 $0.
Vlad Nikiforov

@VladNikiforov 건배, 편집.
antak

3
이 접근법에서 발견 한 한 가지 문제 (antak 또는 Vlad에서)는 오류가 있으면 쉽게 재개 할 수 없다는 것입니다. 로트 키 (필자의 경우 10M)를 삭제하는 경우 네트워크 오류 또는 조절 오류가 발생하여이 문제가 발생할 수 있습니다. 이를 개선하기 위해 split -l 1000키 파일을 1000 개의 키 배치로 분할했습니다. 이제 각 파일에 대해 delete 명령을 실행 한 다음 파일을 삭제할 수 있습니다. 문제가 발생하면 계속할 수 있습니다.
joelittlejohn

모든 키 목록을 원한다면 aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | awk '{print $4}'더 간단 하다고 생각 | grep하고 거기에서 필터링 할 수 있습니다 .
Hayden

3

이 작업에 대한 웹 콘솔의 성능에 좌절했습니다. AWS CLI 명령이이 작업을 잘 수행 한다는 것을 알았 습니다. 예를 들면 다음과 같습니다.

aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files

큰 파일 계층 구조의 경우 상당한 시간이 걸릴 수 있습니다. tmux또는 screen세션 에서 실행되도록 설정 하고 나중에 다시 확인할 수 있습니다 .


2
aws s3 rm --recursive명령이 파일을 개별적으로 삭제 하는 것처럼 보입니다 . 웹 콘솔보다 빠르지 만 많은 파일을 삭제할 때 대량으로 삭제하면 훨씬 빠릅니다.
Brandon


0

s3 버킷을 관리하는 방법을 모르면 특히 유용 할 수도 있고 그렇지 않을 수도 있습니다.

AWS CLI 도구에는 s3에 올바른 객체가 있는지 확인하는 데 특히 효과적인 "sync"옵션이 있습니다. 사용자 또는 사용자가 로컬 파일 시스템에서 S3를 관리하는 경우 CLI 도구를 사용하여 삭제할 오브젝트를 결정하는 많은 작업을 저장할 수 있습니다.

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html


0

이전에는 s3 sync명령 에 대해 언급 했지만 --delete옵션 에 대한 예와 단어는 없습니다 .

S3버킷 에서 폴더의 내용을 삭제하는 가장 빠른 방법 my_bucket은 다음과 같습니다.

aws s3 sync --delete "local-empty-dir/" "s3://my_bucket/path-to-clear"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.