Range 및 partNumber 헤더 작업 - Amazon Simple Storage Service

Range 및 partNumber 헤더 작업

Amazon S3 객체 Lambda에서 대용량 객체로 작업하는 경우 Range HTTP 헤더를 사용하면 객체에서 지정된 바이트 범위를 다운로드할 수 있습니다. 동일한 객체 내에서 서로 다른 바이트 범위를 가져오려면 Amazon S3에 대한 동시 연결을 사용하면 됩니다. 객체에서 지정된 부분에 대해 범위가 지정된 요청을 수행하는 partNumber 파라미터(1~10,000 사이의 정수)를 지정할 수도 있습니다.

Range 또는 partNumber 파라미터를 포함하는 요청을 처리할 수 있는 여러 방법이 있기 때문에 S3 객체 Lambda는 이러한 파라미터를 변환된 객체에 적용하지 않습니다. 대신 AWS Lambda 함수가 애플리케이션에 필요한 경우 이 기능을 구현해야 합니다.

RangepartNumber 파라미터를 S3 객체 Lambda와 함께 사용하려면 다음을 수행하십시오.

  • 객체 Lambda 액세스 포인트 구성에서 이러한 파라미터를 활성화합니다.

  • 이러한 파라미터를 포함하는 요청을 처리할 수 있는 Lambda 함수를 작성합니다.

다음 단계에서 이 작업을 수행하는 방법을 설명합니다.

1단계: 객체 Lambda 액세스 포인트 구성

기본적으로 객체 Lambda 액세스 포인트는 헤더 또는 쿼리 파라미터에 Range 또는 partNumber 파라미터가 포함되는 모든 GetObject 또는 HeadObject 요청에 HTTP 상태 코드 501(구현되지 않음) 오류로 응답합니다.

객체 Lambda 액세스 포인트가 이러한 요청을 수락하도록 설정하려면 객체 Lambda 액세스 포인트 구성의 AllowedFeatures 섹션에 GetObject-Range, GetObject-PartNumberHeadObject-Range 또는 HeadObject-PartNumber를 포함해야 합니다. 객체 Lambda 액세스 포인트 구성 업데이트에 대한 자세한 내용은 객체 Lambda 액세스 포인트 생성 섹션을 참조하십시오.

2단계: Lambda 함수에서 Range 또는 partNumber 처리 구현

객체 Lambda 액세스 포인트가 범위가 지정된 GetObject 또는 HeadObject 요청을 사용하여 Lambda 함수를 호출할 경우 Range 또는 partNumber 파라미터가 이벤트 컨텍스트에 포함됩니다. 다음 테이블에 설명된 대로 이벤트 컨텍스트에서 파라미터의 위치는 객체 Lambda 액세스 포인트에 대한 원래 요청에서 어떤 파라미터가 사용되었는지와 파라미터가 포함된 방식에 따라 달라집니다.

파라미터 이벤트 컨텍스트 위치

Range(헤더)

userRequest.headers.Range

Range(쿼리 파라미터)

userRequest.url(쿼리 파라미터 Range)

partNumber

userRequest.url(쿼리 파라미터 partNumber)

중요

객체 Lambda 액세스 포인트에 제공된 미리 서명된 URL에는 원래 요청의 Range 또는partNumber 파라미터가 포함되어 있지 않습니다. AWS Lambda 함수에서 이러한 파라미터를 처리하는 방법은 다음 옵션을 참조하세요.

Range 또는 partNumber 값을 추출한 후 애플리케이션의 요구 사항에 따라 다음 방법 중 하나를 사용할 수 있습니다.

  1. 요청된 Range 또는 partNumber를 변환된 객체에 매핑합니다(권장).

    Range 또는 partNumber 요청을 처리하는 가장 신뢰할 수 있는 방법은 다음을 수행하는 것입니다.

    • Amazon S3에서 전체 객체를 검색합니다.

    • 객체를 변환합니다.

    • 요청된 Range 또는 partNumber 파라미터를 변환된 객체에 적용합니다.

    이 작업을 수행하려면 제공된 미리 서명된 URL을 사용하여 Amazon S3에서 전체 객체를 가져온 다음 필요에 따라 객체를 처리합니다. 이 방식으로 Range 파라미터를 처리하는 Lambda 함수의 예제에 대해서는 AWS 샘플 GitHub 리포지토리의 이 샘플을 참조하십시오.

  2. 요청된 Range를 미리 서명된 URL에 매핑합니다.

    경우에 따라 Lambda 함수가 요청된 Range를 미리 서명된 URL에 직접 매핑하여 Amazon S3에서 객체의 일부만 검색할 수 있습니다. 이 접근 방식은 변환이 다음 두 기준을 모두 충족하는 경우에만 적합합니다.

    1. 변환 함수를 부분 객체 범위에 적용할 수 있습니다.

    2. 변환 함수 앞 또는 뒤에 Range 파라미터를 사용하면 동일한 변환된 객체가 생성됩니다.

    예를 들어 ASCII로 인코딩된 객체의 모든 문자를 대문자로 변환하는 변환 함수는 이전 두 조건을 모두 충족합니다. 변환을 객체의 일부에 적용할 수 있고 Range 파라미터를 변환 전에 적용하는 것과 파라미터를 변환 후에 적용하는 것이 동일한 결과를 얻습니다.

    이와 달리 ASCII로 인코딩된 객체의 문자 순서를 반대로 바꾸는 함수는 이러한 조건을 충족하지 못합니다. 이러한 함수는 부분 객체 범위에 적용할 수 있기 때문에 조건 1을 충족합니다. 그러나 Range 파라미터를 변환 전에 적용하는 것과 파라미터를 변환 후에 적용하는 것이 서로 다른 결과를 얻기 때문에 조건 2를 충족하지 못합니다.

    콘텐츠가 abcdefg인 객체의 처음 세 문자에 함수를 적용하는 요청을 가정합니다. Range 파라미터를 변환 전에 적용하면 abc만 가져오며 다음에 데이터의 순서를 반대로 바꾸면 cba를 반환합니다. 그러나 파라미터를 변환 후에 적용하면 함수가 전체 객체를 가져온 다음 데이터의 순서를 바꾸고 Range 파라미터를 적용하여 gfe를 반환합니다. 두 결과가 다르기 때문에 이 함수는 Amazon S3에서 객체를 가져올 때 Range 파라미터를 적용해서는 안 됩니다. 따라서 이 함수는 전체 객체를 가져와 변환을 수행한 다음 Range 파라미터를 적용해야만 합니다.

    주의

    많은 경우에 Range 파라미터를 미리 서명된 URL에 적용하면 Lambda 함수 또는 요청을 하는 클라이언트에서 예기치 않은 동작이 발생합니다. Amazon S3에서 부분 객체만 가져올 때 애플리케이션이 제대로 작동한다는 확신이 없는 경우 앞서 방법 A에서 설명한 대로 전체 객체를 가져오고 변환하는 것이 좋습니다.

    애플리케이션이 B 방법에서 설명한 조건을 충족하는 경우 요청된 객체 범위만 가져온 다음 해당 범위에서 변환을 실행하여 AWS Lambda 함수를 간소화할 수 있습니다.

    다음 Java 코드 예시는 다음 작업을 실행하는 방법을 설명한 것입니다.

    • GetObject 요청에서 Range 헤더를 검색합니다.

    • Range 헤더를 Lambda가 Amazon S3에서 요청된 범위를 가져오는 데 사용할 수 있는 미리 서명된 URL에 추가합니다.

    private HttpRequest.Builder applyRangeHeader(ObjectLambdaEvent event, HttpRequest.Builder presignedRequest) { var header = event.getUserRequest().getHeaders().entrySet().stream() .filter(e -> e.getKey().toLowerCase(Locale.ROOT).equals("range")) .findFirst(); // Add check in the query string itself. header.ifPresent(entry -> presignedRequest.header(entry.getKey(), entry.getValue())); return presignedRequest; }