조건부 삭제 수행하기
조건부 삭제 수행하기
객체를 삭제하기 전에, 그 객체가 실제로 존재하는지 또는 변경되지 않았는지를 확인하고 싶을 때가 있어요. 조건부 삭제(conditional delete) 를 쓰면 객체를 삭제하기 전에 그 존재 여부나 변경 여부를 평가할 수 있어요. S3 일반 용도 버킷과 디렉터리 버킷에서 DeleteObject 또는 DeleteObjects API 작업으로 조건부 삭제를 수행할 수 있어요. 시작하려면 조건부 삭제 요청을 보낼 때 HTTP If-Match 헤더에 사전 조건 값 *를 사용해 객체가 존재하는지 확인하거나, If-Match 헤더에 여러분이 제공한 ETag를 사용해 객체가 변경되었는지 확인할 수 있어요.
S3 버킷 정책이나 Identity and Access Management(IAM) 정책을 사용해 일반 용도 버킷 수준에서 조건부 삭제를 강제할 수도 있어요. 자세한 내용은 S3 버킷에서 조건부 삭제 강제하기를 참고하세요.
참고
조건부 삭제 평가는 객체의 현재 버전에만 적용돼요.
출처: 문서
본문
삭제 전에 객체가 변경되었는지 확인하기
조건부 삭제를 쓰면 애플리케이션이 객체를 실수로 삭제하는 것을 막을 수 있어요. ETag 값과 함께 HTTP If-Match 헤더를 사용하면 객체가 변경되었는지 확인할 수 있어요. S3 버킷 안 객체의 ETag 값이 삭제 작업 중에 제공한 ETag와 일치하지 않으면 작업이 실패해요. DeleteObjects 작업으로 여러 객체를 조건부 삭제할 때는 XML 요청 본문의 객체 ETag 요소에 ETag 값을 제공해야 해요. 자세한 내용은 Content-MD5와 ETag를 사용해 업로드 객체 검증하기를 참고하세요.
참고
ETag값과 함께If-Match헤더로 조건부 삭제를 하려면s3:DeleteObject와s3:GetObject권한이 있어야 해요.
ETag 값과 함께 If-Match 헤더는 버킷 안 기존 객체를 기준으로 평가해요. 같은 키 이름의 기존 객체가 있고 ETag가 일치하면 DeleteObject 요청이 성공하고 204 No Content 응답을 반환해요. ETag가 일치하지 않으면 삭제 작업이 412 Precondition Failed 응답과 함께 실패해요. DeleteObjects 작업으로 여러 객체를 조건부 삭제할 때는 XML 요청 본문의 객체 ETag 요소에 ETag 값을 제공할 수 있어요. 요청이 성공하면 DeleteObjects 작업이 200 OK로 응답하고 응답 본문에서 각 객체의 상태를 제공해요. 사전 조건이 성공하면 해당 객체의 응답이 응답 본문의 <Deleted> 요소에 담기고, 사전 조건이 실패하면 해당 객체의 응답이 응답 본문의 <Error> 요소에 담겨요.
동시 요청에서 조건부 삭제 작업이 완료되기 전에 객체에 대한 DELETE 또는 PUT 요청이 먼저 성공하면 409 Conflict 오류 응답을 받을 수도 있어요. 조건부 삭제 작업이 완료되기 전에 동시 삭제 요청이 성공하면 객체 키가 더 이상 존재하지 않으므로 404 Not Found 응답을 받아요.
ETag 값과 함께 If-Match 헤더는 다음 API에서 사용할 수 있어요.
다음 delete-object 예시 명령은 제공한 ETag 값 6805f2cfc46c0f04559748bb039d69al로 조건부 삭제를 시도해요.
aws s3api delete-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --if-match "6805f2cfc46c0f04559748bb039d69al"
자세한 내용은 _AWS CLI Command Reference_의 delete-object를 참고하세요.
다음 delete-objects 예시 명령은 제공한 ETag 값 6805f2cfc46c0f04559748bb039d69al로 조건부 삭제를 시도해요.
aws s3api delete-objects --bucket amzn-s3-demo-bucket --delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "6805f2cfc46c0f04559748bb039d69al"}]}'
자세한 내용은 _AWS CLI Command Reference_의 delete-objects를 참고하세요. AWS CLI에 대한 내용은 _AWS Command Line Interface User Guide_의 What is the AWS Command Line Interface?를 참고하세요.
삭제 전에 객체가 존재하는지 확인하기
* 값과 함께 If-Match 헤더를 사용하면 삭제를 시도하기 전에 객체가 존재하는지 확인할 수 있어요. * 값은 객체가 수정되었는지와 무관하게 객체가 존재할 때만 작업이 진행되어야 함을 뜻해요.
삭제 마커(delete marker)는 버전 관리 S3 일반 용도 버킷에서 객체가 삭제되었음을 나타내는 특수 객체예요. 이전 버전을 보존하면서 객체가 삭제된 것처럼 보이게 하는 자리 표시자예요. 따라서 DeleteObject API에 If-Match:*를 사용하면 객체가 존재할 때만 204 No Content로 성공해요. 객체의 최신 버전이 삭제 마커라면 객체가 존재하지 않는 것이므로 DeleteObject API가 실패하고 412 Precondition Failed 응답을 반환해요. 삭제 마커에 대한 자세한 내용은 삭제 마커 사용하기를 참고하세요.
DeleteObjects 작업으로 여러 객체를 조건부 삭제할 때는 XML 요청 본문의 객체 ETag 요소에 *를 제공할 수 있어요. 사전 조건이 성공하면 DeleteObjects 작업이 200 OK로 응답하고 응답 본문에서 각 객체의 상태를 제공해요. 사전 조건이 성공하면 해당 객체의 응답이 응답 본문의 <Deleted> 요소에 담기고, 사전 조건이 실패하면 해당 객체의 응답이 응답 본문의 <Error> 요소에 담겨요. 두 사전 조건 중 어느 것도 평가할 때 객체가 존재하지 않으면 S3는 요청을 거부하고 Not Found 오류 응답을 반환해요.
참고
If-Match:*로 조건부 삭제를 하려면s3:DeleteObject권한이 있어야 해요.
* 값과 함께 If-Match 헤더는 다음 API에서 사용할 수 있어요.
다음 delete-object 예시 명령은 my_images.tar.bz2라는 키 이름의 객체에 대해, 어떤 ETag든 나타내는 * 값을 사용한 조건부 삭제를 시도해요.
aws s3api delete-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --if-match "*"
자세한 내용은 _AWS CLI Command Reference_의 delete-object를 참고하세요.
다음 delete-objects 예시 명령은 my_images.tar.bz2라는 키 이름의 객체에 대해, 어떤 ETag든 나타내는 * 값을 사용한 조건부 삭제를 시도해요.
aws s3api delete-objects --bucket amzn-s3-demo-bucket --delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "*"}]}'
자세한 내용은 _AWS CLI Command Reference_의 delete-objects를 참고하세요. AWS CLI에 대한 내용은 _AWS Command Line Interface User Guide_의 What is the AWS Command Line Interface?를 참고하세요.