Trabajar con encabezados Range y partNumber - Amazon Simple Storage Service

Trabajar con encabezados Range y partNumber

Cuando se trabaja con objetos grandes en Amazon S3 Object Lambda, puede utilizar el encabezado HTTP Range para descargar un rango de bytes especificado de un objeto. Para obtener diferentes rangos de bytes dentro del mismo objeto, puede utilizar conexiones concurrentes a Amazon S3. También puede usar el parámetro partNumber (número entero entre 1 y 10 000) que realiza una solicitud de rango para la parte especificada del objeto.

Puesto que hay varias formas de gestionar una solicitud que incluya los parámetros Range o partNumber, S3 Object Lambda no aplica estos parámetros al objeto transformado. En su lugar, la función de AWS Lambda debe implementar esta funcionalidad según sea necesario para la aplicación.

Para usar los parámetros Range y partNumber con S3 Object Lambda, haga lo siguiente:

  • Active estos parámetros en la configuración del punto de acceso de Object Lambda.

  • Escriba una función de Lambda que pueda gestionar las solicitudes que incluyan estos parámetros.

Esta operación se describe en los siguientes pasos.

Paso 1: Configurar el punto de acceso de Object Lambda

De forma predeterminada, los puntos de acceso de Object Lambda responden con un código de estado HTTP 501 (No implementado) a cualquier solicitud GetObject o HeadObject que contenga un parámetro Range o partNumber, ya sea en los encabezados o en los parámetros de consulta.

Para permitir que un punto de acceso de Object Lambda acepte este tipo de solicitudes, debe incluir GetObject-RangeGetObject-PartNumberHeadObject-Range o HeadObject-PartNumber en la sección AllowedFeatures de la configuración de su punto de acceso de Object Lambda. Para obtener más información acerca de la actualización de la configuración del punto de acceso de Object Lambda, consulte Creación de puntos de acceso Object Lambda.

Paso 2: Implementar el tratamiento de Range o partNumber en la función de Lambda

Cuando el punto de acceso de Object Lambda invoque la función de Lambda con una solicitud GetObject o HeadObject de rango, los parámetros Range o partNumber se incluyen en el contexto del evento. La ubicación del parámetro en el contexto del evento depende del parámetro que se haya utilizado y de cómo se incluyó en la solicitud original al punto de acceso de Object Lambda, tal como se explica en la tabla siguiente.

Parámetro Ubicación en el contexto del evento

Range (encabezado)

userRequest.headers.Range

Range (parámetro de consulta)

userRequest.url (parámetro de consulta Range)

partNumber

userRequest.url (parámetro de consulta partNumber)

importante

La URL prefirmada proporcionada para su punto de acceso de Object Lambda no contiene el parámetro Range o partNumber de la solicitud original. Consulte las siguientes opciones sobre cómo manejar estos parámetros en la función de AWS Lambda.

Después de extraer el valor de Range o partNumber, puede adoptar uno de los siguientes enfoques en función de las necesidades de su aplicación:

  1. Asigne el Range o partNumber solicitados al objeto transformado (recomendado).

    La forma más fiable de gestionar solicitudes Range o partNumber es hacer lo siguiente:

    • Recupere el objeto completo de Amazon S3.

    • Transforme el objeto.

    • Aplique los parámetros Range o partNumber solicitados al objeto transformado.

    Para ello, utilice la URL prefirmada proporcionada para obtener el objeto completo de Amazon S3 y, a continuación, procesarlo según sea necesario. Para ver un ejemplo de función de Lambda que procesa así un parámetro Range, consulte este ejemplo en el repositorio AWS de GitHub.

  2. Asigne el Range solicitado a la URL prefirmada.

    En algunos casos la función de Lambda puede asignar el Range solicitado directamente a la URL prefirmada para recuperar solo parte del objeto de Amazon S3. Este enfoque es adecuado solo si la transformación cumple los dos criterios siguientes:

    1. La función de transformación se puede aplicar a rangos de objetos parciales.

    2. La aplicación del parámetro Range antes o después de la función de transformación da como resultado el mismo objeto transformado.

    Por ejemplo, una función de transformación que convierte en mayúsculas todos los caracteres de un objeto codificado en ASCII cumple los dos criterios anteriores. La transformación se puede aplicar a parte de un objeto y aplicar el parámetro Range antes de la transformación da el mismo resultado que aplicar el parámetro después de la transformación.

    Por el contrario, una función que invierte los caracteres de un objeto codificado en ASCII no cumple estos criterios. Dicha función cumple el criterio 1, ya que se puede aplicar a rangos de objetos parciales. No obstante, no cumple el criterio 2, porque cuando se aplica el parámetro Range de la transformación se obtienen resultados distintos que si se aplica el parámetro después de la transformación.

    Considere una solicitud para aplicar la función a los tres primeros caracteres de un objeto con el contenido abcdefg. Aplicar el parámetro Range antes de la transformación solo recupera abc y luego invierte los datos, devolviendo cba. Pero si el parámetro se aplica después de la transformación, la función recupera todo el objeto, lo invierte y, a continuación, aplica el parámetro Range, devolviendo gfe. Puesto que los resultados son diferentes, esta función no debe aplicar el parámetro Range cuando se recupera el objeto de Amazon S3. En su lugar, debe recuperar el objeto completo, realizar la transformación y solo después aplicar el parámetro Range.

    aviso

    En muchos casos si se aplica el parámetro Range a la URL prefirmada, el resultado será un comportamiento inesperado por parte de la función de Lambda o el cliente solicitante. A menos que tenga la seguridad de que su aplicación funcionará correctamente cuando se recupere solo un objeto parcial de Amazon S3, recomendamos que recupere y transforme objetos completos como se describió anteriormente en el enfoque A.

    Si la solicitud cumple los criterios descritos anteriormente en este método B, puede simplificar la función AWS Lambda recuperando solo el intervalo de objetos solicitado y, a continuación, ejecutando la transformación en ese intervalo.

    En el siguiente ejemplo de código Java, se muestra cómo realizar lo siguiente:

    • Recupere el encabezado Range de la solicitud GetObject.

    • Añada el encabezado Range a la URL prefirmada que Lambda puede utilizar para recuperar el rango solicitado desde Amazon S3.

    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; }