

# Trabajo con objetos de S3 en Outposts
<a name="S3OutpostsWorkingObjects"></a>

Con Amazon S3 en Outposts, puede crear buckets de S3 en Outposts de AWS y almacenar y recuperar fácilmente objetos en las instalaciones para las aplicaciones que requieren acceso local a los datos, procesamiento local de los datos y residencia de los datos. S3 en Outposts proporciona una nueva clase de almacenamiento, S3 Outposts (`OUTPOSTS`), que utiliza las API de Amazon S3 y está diseñada para almacenar datos de manera duradera y redundante en múltiples dispositivos y servidores de AWS Outposts. Usted se comunica con su bucket de Outpost mediante un punto de acceso y una conexión de punto de conexión a través de una nube privada virtual (VPC). Puede usar las mismas API y características en los buckets de Outposts que en buckets de Amazon S3, como políticas de acceso, cifrado y etiquetado. Puede utilizar S3 en Outposts a través de la Consola de administración de AWS, AWS Command Line Interface (AWS CLI), AWS SDK o la API de REST. 

Los objetos son las entidades fundamentales almacenadas en Amazon S3 en Outposts. Cada objeto está almacenado en un bucket. Debe utilizar puntos de acceso para acceder a cualquier objeto de un bucket de Outpost. Cuando especifica el bucket para las operaciones de objetos, se utiliza el Nombre de recurso de Amazon (ARN) del punto de acceso o el alias del punto de acceso. Para obtener más información acerca de los alias de punto de acceso, consulte [Uso de un alias de estilo de bucket para su punto de acceso de bucket de S3 en Outposts](s3-outposts-access-points-alias.md).

En el siguiente ejemplo se muestra el formato ARN para los puntos de acceso de S3 en Outposts, que incluye el código Región de AWS de la Región a la que pertenece el Outpost, el ID de Cuenta de AWS, el ID de Outposts y el nombre del punto de acceso:

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

Para obtener más información acerca de S3 en Outposts, consulte [ARN de recursos para S3 en Outposts](S3OutpostsIAM.md#S3OutpostsARN).

Los ARN de objeto utilizan el siguiente formato, que incluye la Región de AWS a la que está destinada Outposts, el ID de Cuenta de AWS, el ID de Outpost, el nombre del bucket y la clave de objeto:

```
arn:aws:s3-outposts:us-west-2:123456789012:​outpost/op-01ac5d28a6a232904/bucket/amzn-s3-demo-bucket1/object/myobject
```

Con Amazon S3 en Outposts, los datos de objeto siempre se almacenan en el Outpost. Cuando AWS instala un bastidor de Outpost, sus datos permanecen de manera local en su Outpost para cumplir los requisitos de residencia de datos. Sus objetos nunca salen de su Outpost y no están en una Región de AWS. Ya que la Consola de administración de AWS está alojada dentro de la región, no puede usar la consola para cargar o administrar objetos en su Outpost. Sin embargo, puede utilizar la API de REST, AWS Command Line Interface (AWS CLI) y los SDK de AWS para cargar y administrar los objetos a través de los puntos de acceso.

**Topics**
+ [Carga de un objeto en un bucket de S3 en Outpost](S3OutpostsUploadObjects.md)
+ [Copia de un objeto en un bucket de Amazon S3 en Outposts utilizando AWS SDK para Java](S3OutpostsCopyObject.md)
+ [Obtención de un objeto de un bucket de Amazon S3 en Outposts](S3OutpostsGetObject.md)
+ [Obtención de listas de objetos en un bucket de Amazon S3 en Outposts](S3OutpostsListObjects.md)
+ [Eliminación de objetos en buckets de Amazon S3 en Outposts](S3OutpostsDeleteObject.md)
+ [Uso de HeadBucket para determinar si existe un bucket de S3 en Outposts y si tiene permisos de acceso](S3OutpostsHeadBucket.md)
+ [Ejecución y administración de una carga multiparte con el SDK para Java](S3OutpostsMPU.md)
+ [Uso de URL prefirmadas para S3 en Outposts](S3OutpostsPresignedURL.md)
+ [Amazon S3 en Outposts con Amazon EMR en Outposts local](s3-outposts-emr.md)
+ [Almacenamiento en caché de autorización y autenticación](s3-outposts-auth-cache.md)

# Carga de un objeto en un bucket de S3 en Outpost
<a name="S3OutpostsUploadObjects"></a>

Los objetos son las entidades fundamentales almacenadas en Amazon S3 en Outposts. Cada objeto está almacenado en un bucket. Debe utilizar puntos de acceso para acceder a cualquier objeto de un bucket de Outpost. Cuando especifica el bucket para las operaciones de objetos, se utiliza el Nombre de recurso de Amazon (ARN) del punto de acceso o el alias del punto de acceso. Para obtener más información acerca de los alias de punto de acceso, consulte [Uso de un alias de estilo de bucket para su punto de acceso de bucket de S3 en Outposts](s3-outposts-access-points-alias.md).

En el siguiente ejemplo se muestra el formato ARN para los puntos de acceso de S3 en Outposts, que incluye el código Región de AWS de la Región a la que pertenece el Outpost, el ID de Cuenta de AWS, el ID de Outposts y el nombre del punto de acceso:

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

Para obtener más información acerca de S3 en Outposts, consulte [ARN de recursos para S3 en Outposts](S3OutpostsIAM.md#S3OutpostsARN).

Con Amazon S3 en Outposts, los datos de objeto siempre se almacenan en el Outpost. Cuando AWS instala un bastidor de Outpost, sus datos permanecen de manera local en su Outpost para cumplir los requisitos de residencia de datos. Sus objetos nunca salen de su Outpost y no están en una Región de AWS. Ya que la Consola de administración de AWS está alojada dentro de la región, no puede usar la consola para cargar o administrar objetos en su Outpost. Sin embargo, puede utilizar la API de REST, AWS Command Line Interface (AWS CLI) y los SDK de AWS para cargar y administrar los objetos a través de los puntos de acceso.

Los siguientes ejemplos de AWS CLI y AWS SDK para Java muestran cómo cargar un objeto en un bucket de S3 en Outposts mediante un punto de acceso.

------
#### [ AWS CLI ]

**Example**  
En el siguiente ejemplo, se aplica un objeto denominado `sample-object.xml` en un bucket de S3 en Outposts (`s3-outposts:PutObject`) mediante la AWS CLI. Para usar este comando, sustituya `user input placeholder` por su propia información. Para obtener más información acerca de este comando, consulte [put-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html) en la *Referencia de AWS CLI*.  

```
aws s3api put-object --bucket arn:aws:s3-outposts:Region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point --key sample-object.xml --body sample-object.xml
```

------
#### [ SDK for Java ]

**Example**  
Para ver ejemplos de cómo cargar un objeto en un bucket de S3 Outposts con el AWS SDK para Java, consulte [PutObjectOnOutpost.java](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/outposts/PutObjectOnOutpost.java) en los *ejemplos de código del AWS SDK para Java 2.x*.

------

# Copia de un objeto en un bucket de Amazon S3 en Outposts utilizando AWS SDK para Java
<a name="S3OutpostsCopyObject"></a>

Los objetos son las entidades fundamentales almacenadas en Amazon S3 en Outposts. Cada objeto está almacenado en un bucket. Debe utilizar puntos de acceso para acceder a cualquier objeto de un bucket de Outpost. Cuando especifica el bucket para las operaciones de objetos, se utiliza el Nombre de recurso de Amazon (ARN) del punto de acceso o el alias del punto de acceso. Para obtener más información acerca de los alias de punto de acceso, consulte [Uso de un alias de estilo de bucket para su punto de acceso de bucket de S3 en Outposts](s3-outposts-access-points-alias.md).

En el siguiente ejemplo se muestra el formato ARN para los puntos de acceso de S3 en Outposts, que incluye el código Región de AWS de la Región a la que pertenece el Outpost, el ID de Cuenta de AWS, el ID de Outposts y el nombre del punto de acceso:

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

Para obtener más información acerca de S3 en Outposts, consulte [ARN de recursos para S3 en Outposts](S3OutpostsIAM.md#S3OutpostsARN).

Con Amazon S3 en Outposts, los datos de objeto siempre se almacenan en el Outpost. Cuando AWS instala un bastidor de Outpost, sus datos permanecen de manera local en su Outpost para cumplir los requisitos de residencia de datos. Sus objetos nunca salen de su Outpost y no están en una Región de AWS. Ya que la Consola de administración de AWS está alojada dentro de la región, no puede usar la consola para cargar o administrar objetos en su Outpost. Sin embargo, puede utilizar la API de REST, AWS Command Line Interface (AWS CLI) y los SDK de AWS para cargar y administrar los objetos a través de los puntos de acceso.

En los siguientes ejemplos, se muestra cómo obtener una lista de objetos de bucket de S3 en Outposts con AWS SDK para Java.

## Uso de AWS SDK para Java
<a name="S3OutpostsCopyObjectJava"></a>

En el siguiente ejemplo de S3 en Outposts, se copia un objeto a un objeto nuevo en el mismo bucket con el SDK para Java. Para utilizar este ejemplo, reemplace los `user input placeholders` con su propia información.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CopyObjectRequest;

public class CopyObject {
    public static void main(String[] args) {
        String accessPointArn = "*** access point ARN ***";
        String sourceKey = "*** Source object key ***";
        String destinationKey = "*** Destination object key ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Copy the object into a new object in the same bucket.
            CopyObjectRequest copyObjectRequest = new CopyObjectRequest(accessPointArn, sourceKey, accessPointArn, destinationKey);
            s3Client.copyObject(copyObjectRequest);
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

# Obtención de un objeto de un bucket de Amazon S3 en Outposts
<a name="S3OutpostsGetObject"></a>

Los objetos son las entidades fundamentales almacenadas en Amazon S3 en Outposts. Cada objeto está almacenado en un bucket. Debe utilizar puntos de acceso para acceder a cualquier objeto de un bucket de Outpost. Cuando especifica el bucket para las operaciones de objetos, se utiliza el Nombre de recurso de Amazon (ARN) del punto de acceso o el alias del punto de acceso. Para obtener más información acerca de los alias de punto de acceso, consulte [Uso de un alias de estilo de bucket para su punto de acceso de bucket de S3 en Outposts](s3-outposts-access-points-alias.md).

En el siguiente ejemplo se muestra el formato ARN para los puntos de acceso de S3 en Outposts, que incluye el código Región de AWS de la Región a la que pertenece el Outpost, el ID de Cuenta de AWS, el ID de Outposts y el nombre del punto de acceso:

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

Para obtener más información acerca de S3 en Outposts, consulte [ARN de recursos para S3 en Outposts](S3OutpostsIAM.md#S3OutpostsARN).

Con Amazon S3 en Outposts, los datos de objeto siempre se almacenan en el Outpost. Cuando AWS instala un bastidor de Outpost, sus datos permanecen de manera local en su Outpost para cumplir los requisitos de residencia de datos. Sus objetos nunca salen de su Outpost y no están en una Región de AWS. Ya que la Consola de administración de AWS está alojada dentro de la región, no puede usar la consola para cargar o administrar objetos en su Outpost. Sin embargo, puede utilizar la API de REST, AWS Command Line Interface (AWS CLI) y los SDK de AWS para cargar y administrar los objetos a través de los puntos de acceso.

Los siguientes ejemplos muestran cómo descargar (obtener) un objeto mediante AWS Command Line Interface (AWS CLI) y AWS SDK para Java.

## Uso de AWS CLI
<a name="S3OutpostsGetObjectCLI"></a>

En el siguiente ejemplo, se obtiene un objeto denominado `sample-object.xml` de un bucket de S3 en Outposts (`s3-outposts:GetObject`) mediante la AWS CLI. Para usar este comando, sustituya `user input placeholder` por su propia información. Para obtener más información acerca de este comando, consulte [get-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-object.html) en la *Referencia de AWS CLI*.

```
aws s3api get-object --bucket arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point --key testkey sample-object.xml
```

## Uso de AWS SDK para Java
<a name="S3OutpostsGetObjectJava"></a>

En el siguiente ejemplo de S3 en Outposts, se obtiene un objeto mediante el SDK para Java. Para utilizar este ejemplo, sustituya `user input placeholder` por su propia información. Para obtener más información, consulte [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) en la *Referencia de la API de Amazon Simple Storage Service*.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ResponseHeaderOverrides;
import com.amazonaws.services.s3.model.S3Object;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class GetObject {
    public static void main(String[] args) throws IOException {
        String accessPointArn = "*** access point ARN ***";
        String key = "*** Object key ***";

        S3Object fullObject = null, objectPortion = null, headerOverrideObject = null;
        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Get an object and print its contents.
            System.out.println("Downloading an object");
            fullObject = s3Client.getObject(new GetObjectRequest(accessPointArn, key));
            System.out.println("Content-Type: " + fullObject.getObjectMetadata().getContentType());
            System.out.println("Content: ");
            displayTextInputStream(fullObject.getObjectContent());

            // Get a range of bytes from an object and print the bytes.
            GetObjectRequest rangeObjectRequest = new GetObjectRequest(accessPointArn, key)
                    .withRange(0, 9);
            objectPortion = s3Client.getObject(rangeObjectRequest);
            System.out.println("Printing bytes retrieved.");
            displayTextInputStream(objectPortion.getObjectContent());

            // Get an entire object, overriding the specified response headers, and print the object's content.
            ResponseHeaderOverrides headerOverrides = new ResponseHeaderOverrides()
                    .withCacheControl("No-cache")
                    .withContentDisposition("attachment; filename=example.txt");
            GetObjectRequest getObjectRequestHeaderOverride = new GetObjectRequest(accessPointArn, key)
                    .withResponseHeaders(headerOverrides);
            headerOverrideObject = s3Client.getObject(getObjectRequestHeaderOverride);
            displayTextInputStream(headerOverrideObject.getObjectContent());
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        } finally {
            // To ensure that the network connection doesn't remain open, close any open input streams.
            if (fullObject != null) {
                fullObject.close();
            }
            if (objectPortion != null) {
                objectPortion.close();
            }
            if (headerOverrideObject != null) {
                headerOverrideObject.close();
            }
        }
    }

    private static void displayTextInputStream(InputStream input) throws IOException {
        // Read the text input stream one line at a time and display each line.
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        System.out.println();
    }
}
```

# Obtención de listas de objetos en un bucket de Amazon S3 en Outposts
<a name="S3OutpostsListObjects"></a>

Los objetos son las entidades fundamentales almacenadas en Amazon S3 en Outposts. Cada objeto está almacenado en un bucket. Debe utilizar puntos de acceso para acceder a cualquier objeto de un bucket de Outpost. Cuando especifica el bucket para las operaciones de objetos, se utiliza el Nombre de recurso de Amazon (ARN) del punto de acceso o el alias del punto de acceso. Para obtener más información acerca de los alias de punto de acceso, consulte [Uso de un alias de estilo de bucket para su punto de acceso de bucket de S3 en Outposts](s3-outposts-access-points-alias.md).

En el siguiente ejemplo se muestra el formato ARN para los puntos de acceso de S3 en Outposts, que incluye el código Región de AWS de la Región a la que pertenece el Outpost, el ID de Cuenta de AWS, el ID de Outposts y el nombre del punto de acceso:

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

Para obtener más información acerca de S3 en Outposts, consulte [ARN de recursos para S3 en Outposts](S3OutpostsIAM.md#S3OutpostsARN).

**nota**  
Con Amazon S3 en Outposts, los datos de objeto siempre se almacenan en el Outpost. Cuando AWS instala un bastidor de Outpost, sus datos permanecen de manera local en su Outpost para cumplir los requisitos de residencia de datos. Sus objetos nunca salen de su Outpost y no están en una Región de AWS. Ya que la Consola de administración de AWS está alojada dentro de la región, no puede usar la consola para cargar o administrar objetos en su Outpost. Sin embargo, puede utilizar la API de REST, AWS Command Line Interface (AWS CLI) y los SDK de AWS para cargar y administrar los objetos a través de los puntos de acceso.

En los siguientes ejemplos, se muestra cómo obtener una lista de objetos de un bucket de S3 en Outposts mediante AWS CLI y AWS SDK para Java.

## Uso de la AWS CLI
<a name="S3OutpostsListObjectsCLI"></a>

En el siguiente ejemplo, se muestran los objetos en un bucket de S3 en Outposts (`s3-outposts:ListObjectsV2`) mediante AWS CLI. Para usar este comando, sustituya `user input placeholder` por su propia información. Para obtener más información acerca de este comando, consulte [list-objects-v2](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/list-objects-v2.html) en la *Referencia de AWS CLI*.

```
aws s3api list-objects-v2 --bucket arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point
```

**nota**  
Al utilizar esta acción con Amazon S3 en Outposts a través de SDK de AWS, proporciona el ARN del punto de acceso de Outposts en lugar del nombre del bucket, en la siguiente manera: `arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-Outposts-Access-Point`. Para obtener más información acerca de S3 en Outposts, consulte [ARN de recursos para S3 en Outposts](S3OutpostsIAM.md#S3OutpostsARN).

## Uso de AWS SDK para Java
<a name="S3OutpostsListObjectsJava"></a>

En el siguiente ejemplo de S3 en Outposts, se muestran objetos en un bucket mediante el SDK para Java. Para utilizar este ejemplo, sustituya `user input placeholder` por su propia información. 

**importante**  
En este ejemplo se utiliza [ListObjectsV2](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html), que es la revisión más reciente de la operación de la API `ListObjects`. Recomendamos usar esta operación de API revisada para el desarrollo de aplicaciones. Para garantizar la compatibilidad con versiones anteriores, Amazon S3 aún es compatible con la versión anterior de esta operación de API. 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListObjectsV2Request;
import com.amazonaws.services.s3.model.ListObjectsV2Result;
import com.amazonaws.services.s3.model.S3ObjectSummary;

public class ListObjectsV2 {

    public static void main(String[] args) {
        String accessPointArn = "*** access point ARN ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            System.out.println("Listing objects");

            // maxKeys is set to 2 to demonstrate the use of
            // ListObjectsV2Result.getNextContinuationToken()
            ListObjectsV2Request req = new ListObjectsV2Request().withBucketName(accessPointArn).withMaxKeys(2);
            ListObjectsV2Result result;

            do {
                result = s3Client.listObjectsV2(req);

                for (S3ObjectSummary objectSummary : result.getObjectSummaries()) {
                    System.out.printf(" - %s (size: %d)\n", objectSummary.getKey(), objectSummary.getSize());
                }
                // If there are more than maxKeys keys in the bucket, get a continuation token
                // and list the next objects.
                String token = result.getNextContinuationToken();
                System.out.println("Next Continuation Token: " + token);
                req.setContinuationToken(token);
            } while (result.isTruncated());
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

# Eliminación de objetos en buckets de Amazon S3 en Outposts
<a name="S3OutpostsDeleteObject"></a>

Los objetos son las entidades fundamentales almacenadas en Amazon S3 en Outposts. Cada objeto está almacenado en un bucket. Debe utilizar puntos de acceso para acceder a cualquier objeto de un bucket de Outpost. Cuando especifica el bucket para las operaciones de objetos, se utiliza el Nombre de recurso de Amazon (ARN) del punto de acceso o el alias del punto de acceso. Para obtener más información acerca de los alias de punto de acceso, consulte [Uso de un alias de estilo de bucket para su punto de acceso de bucket de S3 en Outposts](s3-outposts-access-points-alias.md).

En el siguiente ejemplo se muestra el formato ARN para los puntos de acceso de S3 en Outposts, que incluye el código Región de AWS de la Región a la que pertenece el Outpost, el ID de Cuenta de AWS, el ID de Outposts y el nombre del punto de acceso:

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

Para obtener más información acerca de S3 en Outposts, consulte [ARN de recursos para S3 en Outposts](S3OutpostsIAM.md#S3OutpostsARN).

Con Amazon S3 en Outposts, los datos de objeto siempre se almacenan en el Outpost. Cuando AWS instala un bastidor de Outpost, sus datos permanecen de manera local en su Outpost para cumplir los requisitos de residencia de datos. Sus objetos nunca salen de su Outpost y no están en una Región de AWS. Ya que la Consola de administración de AWS está alojada dentro de la región, no puede usar la consola para cargar o administrar objetos en su Outpost. Sin embargo, puede utilizar la API de REST, AWS Command Line Interface (AWS CLI) y los SDK de AWS para cargar y administrar los objetos a través de los puntos de acceso.

En los siguientes ejemplos, se muestra cómo eliminar un solo objeto o varios objetos en un bucket de S3 en Outposts con AWS Command Line Interface (AWS CLI) y AWS SDK para Java.

## Uso de la AWS CLI
<a name="S3OutpostsDeleteObjectsCLI"></a>

En los ejemplos siguientes, se muestra cómo eliminar un solo objeto o varios objetos de un bucket de S3 en Outposts.







------
#### [ delete-object ]

En el siguiente ejemplo, se elimina un objeto denominado `sample-object.xml` de un bucket de S3 en Outposts (`s3-outposts:DeleteObject`) mediante la AWS CLI. Para usar este comando, sustituya `user input placeholder` por su propia información. Para obtener más información sobre este comando, consulte [delete-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html) en la *Referencia de AWS CLI*.

```
aws s3api delete-object --bucket arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point --key sample-object.xml
```

------
#### [ delete-objects ]

En el siguiente ejemplo, se eliminan dos objetos denominados `sample-object.xml` y `test1.text` de un bucket de S3 en Outposts (`s3-outposts:DeleteObject`) mediante la AWS CLI. Para usar este comando, sustituya `user input placeholder` por su propia información. Para obtener más información sobre este comando, consulte [delete-objects](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html) en la *Referencia de AWS CLI*.

```
aws s3api delete-objects --bucket arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point --delete file://delete.json

delete.json
{
  "Objects": [
    {
      "Key": "test1.txt"
    },
    {
      "Key": "sample-object.xml"
    }
  ],
  "Quiet": false
}
```

------

## Uso de AWS SDK para Java
<a name="S3OutpostsDeleteObjectsJava"></a>

En los ejemplos siguientes, se muestra cómo eliminar un solo objeto o varios objetos de un bucket de S3 en Outposts.

------
#### [ DeleteObject ]

En el siguiente ejemplo de S3 en Outposts, se elimina un objeto de un bucket mediante el SDK para Java. Para utilizar este ejemplo, especifique el ARN del punto de acceso para Outpost y el nombre de la clave del objeto que desea eliminar. Para obtener más información, consulte [DeleteObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html) en la *Referencia de la API de Amazon Simple Storage Service*.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.DeleteObjectRequest;

public class DeleteObject {
    public static void main(String[] args) {
        String accessPointArn = "*** access point ARN ***";
        String keyName = "*** key name ****";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            s3Client.deleteObject(new DeleteObjectRequest(accessPointArn, keyName));
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ DeleteObjects ]

En el siguiente ejemplo de S3 en Outposts, se cargan y luego, eliminan objetos de un bucket mediante el SDK para Java. Para utilizar este ejemplo, especifique el ARN del punto de acceso para Outpost. Para obtener más información, consulte [DeleteObjects](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html) en la *Referencia de la API de Amazon Simple Storage Service*.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.DeleteObjectsRequest;
import com.amazonaws.services.s3.model.DeleteObjectsRequest.KeyVersion;
import com.amazonaws.services.s3.model.DeleteObjectsResult;

import java.util.ArrayList;

public class DeleteObjects {

    public static void main(String[] args) {
       String accessPointArn = "arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point";
        

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Upload three sample objects.
            ArrayList<KeyVersion> keys = new ArrayList<KeyVersion>();
            for (int i = 0; i < 3; i++) {
                String keyName = "delete object example " + i;
                s3Client.putObject(accessPointArn, keyName, "Object number " + i + " to be deleted.");
                keys.add(new KeyVersion(keyName));
            }
            System.out.println(keys.size() + " objects successfully created.");

            // Delete the sample objects.
            DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest(accessPointArn)
                    .withKeys(keys)
                    .withQuiet(false);

            // Verify that the objects were deleted successfully.
            DeleteObjectsResult delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest);
            int successfulDeletes = delObjRes.getDeletedObjects().size();
            System.out.println(successfulDeletes + " objects successfully deleted.");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------

# Uso de HeadBucket para determinar si existe un bucket de S3 en Outposts y si tiene permisos de acceso
<a name="S3OutpostsHeadBucket"></a>

Los objetos son las entidades fundamentales almacenadas en Amazon S3 en Outposts. Cada objeto está almacenado en un bucket. Debe utilizar puntos de acceso para acceder a cualquier objeto de un bucket de Outpost. Cuando especifica el bucket para las operaciones de objetos, se utiliza el Nombre de recurso de Amazon (ARN) del punto de acceso o el alias del punto de acceso. Para obtener más información acerca de los alias de punto de acceso, consulte [Uso de un alias de estilo de bucket para su punto de acceso de bucket de S3 en Outposts](s3-outposts-access-points-alias.md).

En el siguiente ejemplo se muestra el formato ARN para los puntos de acceso de S3 en Outposts, que incluye el código Región de AWS de la Región a la que pertenece el Outpost, el ID de Cuenta de AWS, el ID de Outposts y el nombre del punto de acceso:

```
arn:aws:s3-outposts:region:account-id:outpost/outpost-id/accesspoint/accesspoint-name
```

Para obtener más información acerca de S3 en Outposts, consulte [ARN de recursos para S3 en Outposts](S3OutpostsIAM.md#S3OutpostsARN).

**nota**  
Con Amazon S3 en Outposts, los datos de objeto siempre se almacenan en el Outpost. Cuando AWS instala un bastidor de Outpost, sus datos permanecen de manera local en su Outpost para cumplir los requisitos de residencia de datos. Sus objetos nunca salen de su Outpost y no están en una Región de AWS. Ya que la Consola de administración de AWS está alojada dentro de la región, no puede usar la consola para cargar o administrar objetos en su Outpost. Sin embargo, puede utilizar la API de REST, AWS Command Line Interface (AWS CLI) y los SDK de AWS para cargar y administrar los objetos a través de los puntos de acceso.

En los siguientes ejemplos de AWS Command Line Interface (AWS CLI) y AWS SDK para Java, se muestra cómo usar la operación de la API HeadBucket para determinar si existe un bucket de S3 en Outposts y si tiene permiso para acceder a él. Para obtener más información, consulte [HeadBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html) en la *Referencia de la API de Amazon Simple Storage Service*.

## Uso de AWS CLI
<a name="S3OutpostsHeadBucketCLI"></a>

En el siguiente ejemplo de S3 en Outposts de AWS CLI, se utiliza el comando `head-bucket` para determinar si existe un bucket y si tiene permiso para acceder a él. Para usar este comando, sustituya `user input placeholder` por su propia información. Para obtener más información acerca de este comando, consulte [head-bucket](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/head-bucket.html) en la *Referencia de AWS CLI*.

```
aws s3api head-bucket --bucket arn:aws:s3-outposts:region:123456789012:outpost/op-01ac5d28a6a232904/accesspoint/example-outposts-access-point
```

## Uso de AWS SDK para Java
<a name="S3OutpostsHeadBucketJava"></a>

En el siguiente ejemplo de S3 en Outposts, se muestra cómo determinar si existe un bucket y si usted tiene permiso para acceder a él. Para utilizar este ejemplo, especifique el ARN del punto de acceso para Outpost. Para obtener más información, consulte [HeadBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html) en la *Referencia de la API de Amazon Simple Storage Service*.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.HeadBucketRequest;

public class HeadBucket {
    public static void main(String[] args) {
        String accessPointArn = "*** access point ARN ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            s3Client.headBucket(new HeadBucketRequest(accessPointArn));
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

# Ejecución y administración de una carga multiparte con el SDK para Java
<a name="S3OutpostsMPU"></a>

Con Amazon S3 en Outposts, puede crear buckets de S3 en recursos de AWS Outposts y almacenar y recuperar objetos en las instalaciones para las aplicaciones que requieren acceso local a los datos, procesamiento local de los datos y residencia de los datos. Puede utilizar S3 en Outposts a través de la Consola de administración de AWS, AWS Command Line Interface (AWS CLI), AWS SDK o la API de REST. Para obtener más información, consulte [¿Qué es Amazon S3 en Outposts?](S3onOutposts.md) 

En los siguientes ejemplos, se muestra cómo puede utilizar S3 en Outposts con AWS SDK para Java para realizar y administrar una carga multiparte.

**Topics**
+ [Realización de una carga multiparte de un objeto en un bucket de S3 en Outposts](#S3OutpostsInitiateMultipartUploadJava)
+ [Copia de un objeto grande en un bucket de S3 en Outposts con la carga multiparte](#S3OutpostsCopyPartJava)
+ [Obtención de una lista de las partes de un objeto en un bucket de S3 en Outposts](#S3OutpostsListPartsJava)
+ [Recuperación de una lista de cargas multiparte en curso en un bucket de S3 en Outposts](#S3OutpostsListMultipartUploadsJava)

## Realización de una carga multiparte de un objeto en un bucket de S3 en Outposts
<a name="S3OutpostsInitiateMultipartUploadJava"></a>

En el siguiente ejemplo de S3 en Outposts, se inicia, carga y finaliza una carga multiparte de un objeto en un bucket mediante el SDK para Java. Para utilizar este ejemplo, sustituya `user input placeholder` por su propia información. Para obtener más información, consulte [Carga de un objeto con la carga multiparte](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-upload-object.html) en la *Guía del usuario de Amazon Simple Storage Service*.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.ArrayList;
import java.util.List;

public class MultipartUploadCopy {
    public static void main(String[] args) {
        String accessPointArn = "*** Source access point ARN ***";
        String sourceObjectKey = "*** Source object key ***";
        String destObjectKey = "*** Target object key ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Initiate the multipart upload.
            InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(accessPointArn, destObjectKey);
            InitiateMultipartUploadResult initResult = s3Client.initiateMultipartUpload(initRequest);

            // Get the object size to track the end of the copy operation.
            GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(accessPointArn, sourceObjectKey);
            ObjectMetadata metadataResult = s3Client.getObjectMetadata(metadataRequest);
            long objectSize = metadataResult.getContentLength();

            // Copy the object using 5 MB parts.
            long partSize = 5 * 1024 * 1024;
            long bytePosition = 0;
            int partNum = 1;
            List<CopyPartResult> copyResponses = new ArrayList<CopyPartResult>();
            while (bytePosition < objectSize) {
                // The last part might be smaller than partSize, so check to make sure
                // that lastByte isn't beyond the end of the object.
                long lastByte = Math.min(bytePosition + partSize - 1, objectSize - 1);

                // Copy this part.
                CopyPartRequest copyRequest = new CopyPartRequest()
                        .withSourceBucketName(accessPointArn)
                        .withSourceKey(sourceObjectKey)
                        .withDestinationBucketName(accessPointArn)
                        .withDestinationKey(destObjectKey)
                        .withUploadId(initResult.getUploadId())
                        .withFirstByte(bytePosition)
                        .withLastByte(lastByte)
                        .withPartNumber(partNum++);
                copyResponses.add(s3Client.copyPart(copyRequest));
                bytePosition += partSize;
            }

            // Complete the upload request to concatenate all uploaded parts and make the copied object available.
            CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(
                    accessPointArn,
                    destObjectKey,
                    initResult.getUploadId(),
                    getETags(copyResponses));
            s3Client.completeMultipartUpload(completeRequest);
            System.out.println("Multipart copy complete.");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process 
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client  
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }

    // This is a helper function to construct a list of ETags.
    private static List<PartETag> getETags(List<CopyPartResult> responses) {
        List<PartETag> etags = new ArrayList<PartETag>();
        for (CopyPartResult response : responses) {
            etags.add(new PartETag(response.getPartNumber(), response.getETag()));
        }
        return etags;
    }
```

## Copia de un objeto grande en un bucket de S3 en Outposts con la carga multiparte
<a name="S3OutpostsCopyPartJava"></a>

En el siguiente ejemplo de S3 en Outposts se utiliza el SDK para Java para copiar un objeto en un bucket. Para utilizar este ejemplo, sustituya `user input placeholder` por su propia información. 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.ArrayList;
import java.util.List;

public class MultipartUploadCopy {
    public static void main(String[] args) {
        String accessPointArn = "*** Source access point ARN ***";
        String sourceObjectKey = "*** Source object key ***";
        String destObjectKey = "*** Target object key ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Initiate the multipart upload.
            InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(accessPointArn, destObjectKey);
            InitiateMultipartUploadResult initResult = s3Client.initiateMultipartUpload(initRequest);

            // Get the object size to track the end of the copy operation.
            GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(accessPointArn, sourceObjectKey);
            ObjectMetadata metadataResult = s3Client.getObjectMetadata(metadataRequest);
            long objectSize = metadataResult.getContentLength();

            // Copy the object using 5 MB parts.
            long partSize = 5 * 1024 * 1024;
            long bytePosition = 0;
            int partNum = 1;
            List<CopyPartResult> copyResponses = new ArrayList<CopyPartResult>();
            while (bytePosition < objectSize) {
                // The last part might be smaller than partSize, so check to make sure
                // that lastByte isn't beyond the end of the object.
                long lastByte = Math.min(bytePosition + partSize - 1, objectSize - 1);

                // Copy this part.
                CopyPartRequest copyRequest = new CopyPartRequest()
                        .withSourceBucketName(accessPointArn)
                        .withSourceKey(sourceObjectKey)
                        .withDestinationBucketName(accessPointArn)
                        .withDestinationKey(destObjectKey)
                        .withUploadId(initResult.getUploadId())
                        .withFirstByte(bytePosition)
                        .withLastByte(lastByte)
                        .withPartNumber(partNum++);
                copyResponses.add(s3Client.copyPart(copyRequest));
                bytePosition += partSize;
            }

            // Complete the upload request to concatenate all uploaded parts and make the copied object available.
            CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(
                    accessPointArn,
                    destObjectKey,
                    initResult.getUploadId(),
                    getETags(copyResponses));
            s3Client.completeMultipartUpload(completeRequest);
            System.out.println("Multipart copy complete.");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process 
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client  
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }

    // This is a helper function to construct a list of ETags.
    private static List<PartETag> getETags(List<CopyPartResult> responses) {
        List<PartETag> etags = new ArrayList<PartETag>();
        for (CopyPartResult response : responses) {
            etags.add(new PartETag(response.getPartNumber(), response.getETag()));
        }
        return etags;
    }
}
```

## Obtención de una lista de las partes de un objeto en un bucket de S3 en Outposts
<a name="S3OutpostsListPartsJava"></a>

En el siguiente ejemplo de S3 en Outposts se muestran las partes de un objeto en un bucket con el SDK para Java. Para utilizar este ejemplo, sustituya `user input placeholder` por su propia información. 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.List;

public class ListParts {
    public static void main(String[] args) {
        String accessPointArn = "*** access point ARN ***";
        String keyName = "*** Key name ***";
        String uploadId = "*** Upload ID ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            ListPartsRequest listPartsRequest = new ListPartsRequest(accessPointArn, keyName, uploadId);
            PartListing partListing = s3Client.listParts(listPartsRequest);
            List<PartSummary> partSummaries = partListing.getParts();

            System.out.println(partSummaries.size() + " multipart upload parts");
            for (PartSummary p : partSummaries) {
                System.out.println("Upload part: Part number = \"" + p.getPartNumber() + "\", ETag = " + p.getETag());
            }

        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

## Recuperación de una lista de cargas multiparte en curso en un bucket de S3 en Outposts
<a name="S3OutpostsListMultipartUploadsJava"></a>

En el siguiente ejemplo de Amazon S3 en Outposts, se muestra cómo recuperar una lista de cargas multiparte en curso desde un bucket de Outposts mediante el SDK para Java. Para utilizar este ejemplo, sustituya `user input placeholder` por su propia información.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListMultipartUploadsRequest;
import com.amazonaws.services.s3.model.MultipartUpload;
import com.amazonaws.services.s3.model.MultipartUploadListing;

import java.util.List;

public class ListMultipartUploads {
    public static void main(String[] args) {
                String accessPointArn = "*** access point ARN ***";

        try {
            // This code expects that you have AWS credentials set up per:
            // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .enableUseArnRegion()
                    .build();

            // Retrieve a list of all in-progress multipart uploads.
            ListMultipartUploadsRequest allMultipartUploadsRequest = new ListMultipartUploadsRequest(accessPointArn);
            MultipartUploadListing multipartUploadListing = s3Client.listMultipartUploads(allMultipartUploadsRequest);
            List<MultipartUpload> uploads = multipartUploadListing.getMultipartUploads();

            // Display information about all in-progress multipart uploads.
            System.out.println(uploads.size() + " multipart upload(s) in progress.");
            for (MultipartUpload u : uploads) {
                System.out.println("Upload in progress: Key = \"" + u.getKey() + "\", id = " + u.getUploadId());
            }
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

# Uso de URL prefirmadas para S3 en Outposts
<a name="S3OutpostsPresignedURL"></a>

Para conceder acceso por tiempo limitado a los objetos que se almacenan localmente en un Outpost sin actualizar su política de bucket, puede usar una URL prefirmada. Con las URL prefirmadas, usted, como propietario del bucket, puede compartir objetos con personas en su nube privada virtual (VPC) o concederles la capacidad de cargar o eliminar objetos. 

Cuando crea una URL prefirmada con el SDK de AWS o el AWS Command Line Interface (AWS CLI), asocia la URL a una acción específica. También puede conceder acceso por tiempo limitado a la URL prefirmada eligiendo un tiempo de caducidad personalizado que puede ser de tan solo 1 segundo y de hasta 7 días. Cuando comparte la URL prefirmada, la persona de la VPC puede realizar la acción incrustada en la URL como si fuera el usuario de firma original. La URL caducará y ya no funcionará cuando llegue a su hora de vencimiento.

## Limitación de las capacidades de URL prefirmadas
<a name="S3OutpostsPresignedUrlUploadObjectLimitCapabilities"></a>

Las capacidades de una URL están limitadas por los permisos del usuario que la creó. En esencia, las URL prefirmadas son tokens al portador que otorgan acceso a quienes las poseen. Por lo tanto, le recomendamos que los proteja adecuadamente. 

**AWS Signature Version 4 (SigV4)**  
Para aplicar un comportamiento específico cuando las solicitudes de URL prefirmadas se autentican mediante AWS Signature Version 4 (SigV4), puede usar claves de condición en las políticas de bucket y en las políticas de punto de acceso. Por ejemplo, puede crear una política de bucket que use la condición `s3-outposts:signatureAge` para denegar cualquier solicitud de URL prefirmada de Amazon S3 en Outposts en los objetos del bucket `example-outpost-bucket` si la firma tiene más de 10 minutos de antigüedad. Para utilizar este ejemplo, sustituya *`user input placeholders`* por su propia información.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Deny a presigned URL request if the signature is more than 10 minutes old",
            "Effect": "Deny",
            "Principal": {"AWS":"444455556666"},
            "Action": "s3-outposts:*",
            "Resource": "arn:aws:s3-outposts:us-east-1:111122223333:outpost/op-01ac5d28a6a232904/bucket/example-outpost-bucket/object/*",
            "Condition": {
                "NumericGreaterThan": {"s3-outposts:signatureAge": 600000},
                "StringEquals": {"s3-outposts:authType": "REST-QUERY-STRING"}
            }
        }
    ]
}
```

------

Para obtener una lista de claves de condición y políticas de ejemplo adicionales que puede usar para imponer un comportamiento específico cuando las solicitudes de URL prefirmadas se autentican mediante Signature Version 4, consulte [Claves de política de autenticación de AWS Signature Version 4 (SigV4)](s3-outposts-bucket-policy-s3-sigv4-conditions.md).

**Restricción de ruta de red**  
Si desea restringir el uso de direcciones URL prefirmadas y todo el acceso de S3 en Outposts a rutas de red concretas, puede escribir políticas que requieran una ruta de red determinada. Para establecer la restricción en la entidad principal de IAM que realiza la llamada, puede usar políticas de AWS Identity and Access Management (IAM) basadas en identidades (por ejemplo, políticas de usuario, grupo o rol). Para establecer la restricción en el recurso S3 en Outposts, puede usar políticas basadas en recursos (por ejemplo, políticas de bucket y punto de acceso). 

Una restricción de ruta de red en la entidad principal de IAM requiere que el usuario de esas credenciales realice solicitudes desde la red especificada. Una restricción en el bucket o en el punto de acceso requiere que todas las solicitudes a ese recurso se originen desde la red especificada. Estas restricciones también se aplican fuera del escenario de URL prefirmada.

La condición global de IAM que utilice depende del tipo de punto de conexión. Si está utilizando el punto de conexión público para S3 en Outposts, utilice `aws:SourceIp`. Si utiliza un punto de conexión de VPC en S3 en Outposts, utilice `aws:SourceVpc` o `aws:SourceVpce`.

La siguiente instrucción de política de IAM requiere que la entidad principal acceda a AWS solo desde el rango de red especificado. Con esta declaración de política, todo acceso debe originarse desde ese rango. Esto incluye el caso de alguien que usa una URL prefirmada para S3 en Outposts. Para utilizar este ejemplo, sustituya *`user input placeholders`* por su propia información.

```
{
    "Sid": "NetworkRestrictionForIAMPrincipal",
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
        "NotIpAddressIfExists": {"aws:SourceIp": "IP-address-range"},
        "BoolIfExists": {"aws:ViaAWSService": "false"}
    }
}
```

Para ver una política de bucket de ejemplo que usa la clave de condición global `aws:SourceIP` de AWS para restringir el acceso a un bucket de S3 en Outposts a un rango de red específico, consulte [Configuración de IAM con S3 en Outposts](S3OutpostsIAM.md).

## Quién puede crear una URL prefirmada
<a name="S3Outpostswho-presigned-url"></a>

Cualquiera que tenga credenciales de seguridad válidas puede crear una URL prefirmada. Sin embargo, para que un usuario de la VPC pueda acceder a un objeto correctamente, la URL prefirmada debe haber sido creada por alguien que tenga permiso para realizar la operación en la que se basa la URL prefirmada.

Puede usar estas credenciales para crear una URL prefirmada:
+ **Perfil de instancia de IAM**: válido hasta 6 horas.
+ **AWS Security Token Service**: válido hasta 36 horas cuando se firma con las credenciales permanentes, como, por ejemplo, las credenciales del usuario raíz de la Cuenta de AWS o un usuario de IAM.
+ **Usuario de IAM**: válido hasta 7 días cuando se utiliza AWS Signature Version 4.

  Para crear una URL prefirmada que es válida hasta 7 días, primero delegue las credenciales de usuario de IAM (la clave de acceso y la clave secreta) al SDK que está utilizando. A continuación, genere una URL prefirmada mediante AWS Signature Version 4.

**nota**  
Si creó una URL prefirmada con un token temporal, la URL caducará cuando caduque el token, incluso si creó la URL con un tiempo de vencimiento posterior.
Dado que las URL prefirmadas otorgan acceso a los buckets de S3 en Outposts a quien tenga la URL, recomendamos que los proteja adecuadamente. Para obtener más información sobre la protección de las URL prefirmadas, consulte [Limitación de las capacidades de URL prefirmadas](#S3OutpostsPresignedUrlUploadObjectLimitCapabilities).

## ¿Cuándo comprueba S3 en Outposts la fecha y hora de vencimiento de una URL prefirmada?
<a name="S3Outpostspresigned-url-when-checked"></a>

S3 en Outposts comprueba la fecha y hora de vencimiento de una URL firmada al realizarse la solicitud HTTP. Por ejemplo, si un cliente comienza a descargar un archivo grande inmediatamente antes de la fecha de vencimiento, la descarga continúa incluso si se sobrepasa la hora de vencimiento durante la descarga. Sin embargo, si la conexión se interrumpe y el cliente intenta reiniciar la descarga después de la hora de vencimiento, la descarga produce un error.

Para obtener más información sobre el uso de una URL prefirmada con objeto de compartir o cargar objetos, consulte los siguientes temas.

**Topics**
+ [Limitación de las capacidades de URL prefirmadas](#S3OutpostsPresignedUrlUploadObjectLimitCapabilities)
+ [Quién puede crear una URL prefirmada](#S3Outpostswho-presigned-url)
+ [¿Cuándo comprueba S3 en Outposts la fecha y hora de vencimiento de una URL prefirmada?](#S3Outpostspresigned-url-when-checked)
+ [Uso compartido de objetos con URL prefirmadas](S3OutpostsShareObjectPresignedURL.md)
+ [Generación de una URL prefirmada para cargar un objeto en un bucket de S3 en Outposts](S3OutpostsPresignedUrlUploadObject.md)

# Uso compartido de objetos con URL prefirmadas
<a name="S3OutpostsShareObjectPresignedURL"></a>

Para conceder acceso por tiempo limitado a los objetos que se almacenan localmente en un Outpost sin actualizar su política de bucket, puede usar una URL prefirmada. Con las URL prefirmadas, usted, como propietario del bucket, puede compartir objetos con personas en su nube privada virtual (VPC) o concederles la capacidad de cargar o eliminar objetos. 

Cuando crea una URL prefirmada con el SDK de AWS o el AWS Command Line Interface (AWS CLI), asocia la URL a una acción específica. También puede conceder acceso por tiempo limitado a la URL prefirmada eligiendo un tiempo de caducidad personalizado que puede ser de tan solo 1 segundo y de hasta 7 días. Cuando comparte la URL prefirmada, la persona de la VPC puede realizar la acción incrustada en la URL como si fuera el usuario de firma original. La URL caducará y ya no funcionará cuando llegue a su hora de vencimiento.



Cuando crea una URL prefirmada, debe proporcionar sus credenciales de seguridad y luego especificar lo siguiente: 
+ Un nombre de recurso de Amazon (ARN) de punto de acceso para el bucket de Amazon S3 en Outposts
+ Una clave del objeto
+ Un método HTTP (`GET` para descargar objetos)
+ Una fecha y hora de caducidad

Una URL prefirmada solo es válida para la duración especificada. Es decir, debe comenzar la acción permitida por la URL antes de la fecha y hora de vencimiento. Puede utilizar una URL prefirmada varias veces, hasta la fecha y hora de vencimiento. Si creó una URL prefirmada con un token temporal, la URL caducará cuando caduque el token, incluso si creó la URL con un tiempo de vencimiento posterior.

Los usuarios de la nube privada virtual (VPC) que tienen acceso a la URL prefirmada pueden acceder al objeto. Por ejemplo, si tiene un video en su bucket y tanto el bucket como el objeto son privados, puede compartir el video con otros generando una URL prefirmada. Dado que las URL prefirmadas otorgan acceso a sus buckets de S3 en Outposts a quien tenga la URL, recomendamos que las proteja adecuadamente. Para obtener más información acerca de la protección de direcciones URL prefirmadas, consulte [Limitación de las capacidades de URL prefirmadas](S3OutpostsPresignedURL.md#S3OutpostsPresignedUrlUploadObjectLimitCapabilities). 

Cualquiera que tenga credenciales de seguridad válidas puede crear una URL prefirmada. Sin embargo, la URL prefirmada debe haber sido creada por alguien que tenga permisos para realizar la operación en la que se basa la URL prefirmada. Para obtener más información, consulte [Quién puede crear una URL prefirmada](S3OutpostsPresignedURL.md#S3Outpostswho-presigned-url).

Puede generar una URL prefirmada para compartir un objeto en un bucket de S3 en Outposts mediante el SDK de AWS y la AWS CLI. Para obtener más información, consulte los ejemplos siguientes. 

## Uso de los AWS SDK
<a name="S3OutpostsShareObjectPreSignedURLSDK"></a>

Puede usar los SDK de AWS para generar una URL prefirmada que puede dar a terceros para que puedan recuperar un objeto. 

**nota**  
Cuando use los SDK de AWS para generar una URL prefirmada, el tiempo máximo de vencimiento de una URL prefirmada es de 7 días desde el momento de su creación. 

------
#### [ Java ]

**Example**  
El siguiente ejemplo genera una URL prefirmada que puede dar a terceros de modo que puedan recuperar un objeto desde un bucket de S3 en Outposts. Para obtener más información, consulte [Uso de URL prefirmadas para S3 en Outposts](S3OutpostsPresignedURL.md). Para utilizar este ejemplo, sustituya *`user input placeholders`* por su propia información.  

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.HttpMethod;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;

import java.io.IOException;
import java.net.URL;
import java.time.Instant;

public class GeneratePresignedURL {

    public static void main(String[] args) throws IOException {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String accessPointArn = "*** access point ARN ***";
        String objectKey = "*** object key ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new ProfileCredentialsProvider())
                    .build();

            // Set the presigned URL to expire after one hour.
            java.util.Date expiration = new java.util.Date();
            long expTimeMillis = Instant.now().toEpochMilli();
            expTimeMillis += 1000 * 60 * 60;
            expiration.setTime(expTimeMillis);

            // Generate the presigned URL.
            System.out.println("Generating pre-signed URL.");
            GeneratePresignedUrlRequest generatePresignedUrlRequest =
                    new GeneratePresignedUrlRequest(accessPointArn, objectKey)
                            .withMethod(HttpMethod.GET)
                            .withExpiration(expiration);
            URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);

            System.out.println("Pre-Signed URL: " + url.toString());
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process 
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

**Example**  
El siguiente ejemplo genera una URL prefirmada que puede dar a terceros de modo que puedan recuperar un objeto desde un bucket de S3 en Outposts. Para obtener más información, consulte [Uso de URL prefirmadas para S3 en Outposts](S3OutpostsPresignedURL.md). Para utilizar este ejemplo, sustituya *`user input placeholders`* por su propia información.   

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;

namespace Amazon.DocSamples.S3
{
    class GenPresignedURLTest
    {
        private const string accessPointArn = "*** access point ARN ***"; 
        private const string objectKey = "*** object key ***";
        // Specify how long the presigned URL lasts, in hours.
        private const double timeoutDuration = 12;
        // Specify your bucket Region (an example Region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            string urlString = GeneratePreSignedURL(timeoutDuration);
        }
        static string GeneratePreSignedURL(double duration)
        {
            string urlString = "";
            try
            {
                GetPreSignedUrlRequest request1 = new GetPreSignedUrlRequest
                {
                    BucketName = accessPointArn,
                    Key = objectKey,
                    Expires = DateTime.UtcNow.AddHours(duration)
                };
                urlString = s3Client.GetPreSignedURL(request1);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            return urlString;
        }
    }
}
```

------
#### [ Python ]

Los siguientes ejemplos generan una URL prefirmada para compartir un objeto mediante el SDK para Python (Boto3). Por ejemplo, utilice un cliente Boto3 y la función `generate_presigned_url` para generar una URL prefirmada que le permita `GET` un objeto.

```
import boto3
    url = boto3.client('s3').generate_presigned_url(
    ClientMethod='get_object', 
    Params={'Bucket': 'ACCESS_POINT_ARN', 'Key': 'OBJECT_KEY'},
    ExpiresIn=3600)
```

Con el objetivo de obtener más información acerca del uso de SDK para Python (Boto3) a fin de generar una URL prefirmada, consulte [Python](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_url) en la *Referencia de la API de AWS SDK para Python (Boto)*.

------

## Uso de AWS CLI
<a name="S3OutpostsShareObjectPresignedCLI"></a>

El siguiente ejemplo del comando de AWS CLI genera una URL prefirmada para un bucket de S3 en Outposts. Para utilizar este ejemplo, sustituya *`user input placeholders`* por su propia información.

**nota**  
Cuando use la AWS CLI para generar una URL prefirmada, el tiempo máximo de vencimiento de una URL prefirmada es de 7 días desde el momento de su creación. 

```
aws s3 presign s3://arn:aws:s3-outposts:us-east-1:111122223333:outpost/op-01ac5d28a6a232904/accesspoint/example-outpost-access-point/mydoc.txt --expires-in 604800
```

Para obtener más información, consulte [presign](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/presign.html) en la *Referencia de comandos de la AWS CLI*.

# Generación de una URL prefirmada para cargar un objeto en un bucket de S3 en Outposts
<a name="S3OutpostsPresignedUrlUploadObject"></a>

Para conceder acceso por tiempo limitado a los objetos que se almacenan localmente en un Outpost sin actualizar su política de bucket, puede usar una URL prefirmada. Con las URL prefirmadas, usted, como propietario del bucket, puede compartir objetos con personas en su nube privada virtual (VPC) o concederles la capacidad de cargar o eliminar objetos. 

Cuando crea una URL prefirmada con el SDK de AWS o el AWS Command Line Interface (AWS CLI), asocia la URL a una acción específica. También puede conceder acceso por tiempo limitado a la URL prefirmada eligiendo un tiempo de caducidad personalizado que puede ser de tan solo 1 segundo y de hasta 7 días. Cuando comparte la URL prefirmada, la persona de la VPC puede realizar la acción incrustada en la URL como si fuera el usuario de firma original. La URL caducará y ya no funcionará cuando llegue a su hora de vencimiento.

Cuando crea una URL prefirmada, debe proporcionar sus credenciales de seguridad y luego especificar lo siguiente: 
+ Un nombre de recurso de Amazon (ARN) de punto de acceso para el bucket de Amazon S3 en Outposts
+ Una clave del objeto
+ Un método HTTP (`PUT` para cargar objetos)
+ Una fecha y hora de caducidad

Una URL prefirmada solo es válida para la duración especificada. Es decir, debe comenzar la acción permitida por la URL antes de la fecha y hora de vencimiento. Puede utilizar una URL prefirmada varias veces, hasta la fecha y hora de vencimiento. Si creó una URL prefirmada con un token temporal, la URL caducará cuando caduque el token, incluso si creó la URL con un tiempo de vencimiento posterior. 

Si la acción permitida por una URL prefirmada consta de varios pasos, como una carga multiparte, todos los pasos deben comenzar antes de la hora de vencimiento. Si S3 en Outposts intenta comenzar un paso con una URL vencida, recibirá un error.

Los usuarios de la nube privada virtual (VPC) que tienen acceso a la URL prefirmada pueden cargar objetos. Por ejemplo, un usuario de la VPC que tenga acceso a la URL prefirmada puede cargar un objeto en su bucket. Dado que las URL prefirmadas otorgan acceso a su bucket de S3 en Outposts a cualquier usuario de la VPC que tenga acceso a la URL prefirmada, recomendamos que las proteja adecuadamente. Para obtener más información acerca de la protección de direcciones URL prefirmadas, consulte [Limitación de las capacidades de URL prefirmadas](S3OutpostsPresignedURL.md#S3OutpostsPresignedUrlUploadObjectLimitCapabilities). 

Cualquiera que tenga credenciales de seguridad válidas puede crear una URL prefirmada. Sin embargo, la URL prefirmada debe haber sido creada por alguien que tenga permisos para realizar la operación en la que se basa la URL prefirmada. Para obtener más información, consulte [Quién puede crear una URL prefirmada](S3OutpostsPresignedURL.md#S3Outpostswho-presigned-url).

## Genere una URL prefirmada para una operación de objeto de S3 en Outposts mediante los SDK de AWS
<a name="s3-outposts-presigned-urls-upload-examples"></a>

------
#### [ Java ]

**SDK para Java 2.x**  
En este ejemplo, se muestra cómo generar una URL prefirmada que puede usar para cargar un objeto en un bucket de S3 en Outposts durante un tiempo limitado. Para obtener más información, consulte [Uso de URL prefirmadas para S3 en Outposts](S3OutpostsPresignedURL.md).   

```
    public static void signBucket(S3Presigner presigner, String outpostAccessPointArn, String keyName) {

        try {
            PutObjectRequest objectRequest = PutObjectRequest.builder()
                    .bucket(accessPointArn)
                    .key(keyName)
                    .contentType("text/plain")
                    .build();

            PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
                    .signatureDuration(Duration.ofMinutes(10))
                    .putObjectRequest(objectRequest)
                    .build();

            PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(presignRequest);


            String myURL = presignedRequest.url().toString();
            System.out.println("Presigned URL to upload a file to: " +myURL);
            System.out.println("Which HTTP method must be used when uploading a file: " +
                    presignedRequest.httpRequest().method());

            // Upload content to the S3 on Outposts bucket by using this URL.
            URL url = presignedRequest.url();

            // Create the connection and use it to upload the new object by using the presigned URL.
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type","text/plain");
            connection.setRequestMethod("PUT");
            OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
            out.write("This text was uploaded as an object by using a presigned URL.");
            out.close();

            connection.getResponseCode();
            System.out.println("HTTP response code is " + connection.getResponseCode());

        } catch (S3Exception e) {
            e.getStackTrace();
        } catch (IOException e) {
            e.getStackTrace();
        }
    }
```

------
#### [ Python ]

**SDK para Python (Boto3)**  
En este ejemplo, se muestra cómo generar una URL prefirmada que pueda realizar una acción de S3 en Outposts durante un tiempo limitado. Para obtener más información, consulte [Uso de URL prefirmadas para S3 en Outposts](S3OutpostsPresignedURL.md). Para realizar una solicitud con la URL, utilice el paquete `Requests`.  

```
import argparse
import logging
import boto3
from botocore.exceptions import ClientError
import requests

logger = logging.getLogger(__name__)


def generate_presigned_url(s3_client, client_method, method_parameters, expires_in):
    """
    Generate a presigned S3 on Outposts URL that can be used to perform an action.

    :param s3_client: A Boto3 Amazon S3 client.
    :param client_method: The name of the client method that the URL performs.
    :param method_parameters: The parameters of the specified client method.
    :param expires_in: The number of seconds that the presigned URL is valid for.
    :return: The presigned URL.
    """
    try:
        url = s3_client.generate_presigned_url(
            ClientMethod=client_method,
            Params=method_parameters,
            ExpiresIn=expires_in
        )
        logger.info("Got presigned URL: %s", url)
    except ClientError:
        logger.exception(
            "Couldn't get a presigned URL for client method '%s'.", client_method)
        raise
    return url


def usage_demo():
    logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')

    print('-'*88)
    print("Welcome to the Amazon S3 on Outposts presigned URL demo.")
    print('-'*88)

    parser = argparse.ArgumentParser()
    parser.add_argument('accessPointArn', help="The name of the S3 on Outposts access point ARN.")
    parser.add_argument(
        'key', help="For a GET operation, the key of the object in S3 on Outposts. For a "
                    "PUT operation, the name of a file to upload.")
    parser.add_argument(
        'action', choices=('get', 'put'), help="The action to perform.")
    args = parser.parse_args()

    s3_client = boto3.client('s3')
    client_action = 'get_object' if args.action == 'get' else 'put_object'
    url = generate_presigned_url(
        s3_client, client_action, {'Bucket': args.accessPointArn, 'Key': args.key}, 1000)

    print("Using the Requests package to send a request to the URL.")
    response = None
    if args.action == 'get':
        response = requests.get(url)
    elif args.action == 'put':
        print("Putting data to the URL.")
        try:
            with open(args.key, 'r') as object_file:
                object_text = object_file.read()
            response = requests.put(url, data=object_text)
        except FileNotFoundError:
            print(f"Couldn't find {args.key}. For a PUT operation, the key must be the "
                  f"name of a file that exists on your computer.")

    if response is not None:
        print("Got response:")
        print(f"Status: {response.status_code}")
        print(response.text)

    print('-'*88)


if __name__ == '__main__':
    usage_demo()
```

------

# Amazon S3 en Outposts con Amazon EMR en Outposts local
<a name="s3-outposts-emr"></a>

Amazon EMR es una plataforma de clúster administrada que simplifica la ejecución de marcos de macrodatos, tales como Apache Hadoop y Apache Spark en AWS para procesar y analizar grandes cantidades de datos. Mediante el uso de estos marcos de trabajo y proyectos de código abierto relacionados, puede procesar datos para fines de análisis y cargas de trabajo de inteligencia empresarial. Además, Amazon EMR permite transformar y trasladar grandes cantidades de datos hacia y desde otros almacenes y bases de datos de AWS, como Amazon S3 en Outposts. Para obtener más información sobre Amazon EMR, consulte [Clústeres de EMR en AWS Outposts](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-outposts.html) en la *Guía de administración de Amazon EMR*. 

Para Amazon S3 en Outposts, Amazon EMR comenzó a admitir el conector S3A de Apache Hadoop en la versión 7.0.0. Las versiones anteriores de Amazon EMR no admiten S3 en Outposts localmente y tampoco son compatibles con el sistema de archivos de EMR (EMRFS).

**Aplicaciones compatibles**  
Amazon EMR con Amazon S3 en Outposts admite las siguientes aplicaciones: 
+ Hadoop
+ Spark
+ Hue
+ Hive
+ Sqoop
+ Pig
+ Hudi
+ Flink

Para obtener más información, consulte la [Guía de publicación de Amazon EMR](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-release-components.html).

## Creación y configuración de un bucket de Amazon S3 en Outposts
<a name="create-outposts-bucket"></a>

Amazon EMR utiliza el AWS SDK para Java con Amazon S3 en Outposts para almacenar datos de entrada y de salida. Los archivos de registro de Amazon EMR se almacenan en la ubicación regional de Amazon S3 que elija pero no se almacenan localmente en Outpost. Para obtener más información, consulte [Ver archivos de registro](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-view-web-log-files.html) en la *Guía de administración de Amazon EMR*. 

Los buckets de S3 on Outposts aplican ciertas restricciones y limitaciones de nomenclatura para cumplir con los requisitos de Amazon S3 y DNS. Para obtener más información, consulte [Creación de un bucket de S3 en Outposts](S3OutpostsCreateBucket.md).

Con la versión 7.0.0 y posteriores de Amazon EMR, puede usar Amazon EMR con S3 en Outposts y el sistema de archivos S3A.

**Requisitos previos**  
**Permisos de S3 en Outposts**: al crear el perfil de instancia de Amazon EMR, su rol debe incluir el espacio de nombres de AWS Identity and Access Management (IAM) para S3 en Outposts. S3 en Outposts tiene su propio espacio de nombres: `s3-outposts*`. Para ver un ejemplo de política que utiliza este espacio de nombres, consulte [Configuración de IAM con S3 en Outposts](S3OutpostsIAM.md).

**Conector S3A**: para configurar el clúster de EMR para que pueda acceder a los datos de un bucket de Amazon S3 en Outposts, debe utilizar el conector S3A de Apache Hadoop. Para usar el conector, asegúrese de que todos sus URI de S3 usen el esquema `s3a`. Si no es así, puede configurar la implementación del sistema de archivos que utiliza para el clúster de EMR para que sus URI de S3 funcionen con el conector S3A.

Para configurar la implementación del sistema de archivos para que funcione con el conector S3A, utilice las propiedades de configuración `fs.file_scheme.impl` y `fs.AbstractFileSystem.file_scheme.impl` del clúster de EMR, donde `file_scheme` equivale al tipo de URI de S3 que tenga. Para utilizar el ejemplo siguiente, sustituya *`user input placeholders`* con su propia información. Por ejemplo, para cambiar la implementación del sistema de archivos para los URI de S3 que utilizan el esquema `s3`, especifique las siguientes propiedades de configuración del clúster:

```
1. [
2.   {
3. "Classification": "core-site",
4.     "Properties": {
5.     "fs.s3.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem",
6.     "fs.AbstractFileSystem.s3.impl": "org.apache.hadoop.fs.s3a.S3A"
7.     }
8.   }
9. ]
```

Para usar S3A, defina la propiedad de configuración `fs.file_scheme.impl` en `org.apache.hadoop.fs.s3a.S3AFileSystem` y establezca la propiedad `fs.AbstractFileSystem.file_scheme.impl` en `org.apache.hadoop.fs.s3a.S3A`.

Por ejemplo, si accede a la ruta `s3a://bucket/...`, defina la propiedad `fs.s3a.impl` en `org.apache.hadoop.fs.s3a.S3AFileSystem` y establezca la propiedad `fs.AbstractFileSystem.s3a.impl` en `org.apache.hadoop.fs.s3a.S3A`.

## Introducción al uso de Amazon EMR con Amazon S3 en Outposts
<a name="getting-started-outposts"></a>

En los temas que siguen se explica cómo empezar a utilizar Amazon EMR con Amazon S3 en Outposts.

**Topics**
+ [Creación de una política de permisos](#create-permission-policy)
+ [Creación y configuración de un clúster](#configure-cluster)
+ [Información general sobre las configuraciones](#configurations-overview)
+ [Consideraciones](#considerations)

### Creación de una política de permisos
<a name="create-permission-policy"></a>

Antes de poder crear un clúster de EMR que utilice Amazon S3 en Outposts, debe crear una política de IAM para adjuntarla al perfil de instancia de Amazon EC2 para el clúster. La política debe tener permisos de acceso al Nombre de recurso de Amazon (ARN) del punto de acceso de S3 en Outposts. Para obtener más información acerca de la creación de políticas de IAM para S3 en Outposts, consulte [Configuración de IAM con S3 en Outposts](S3OutpostsIAM.md). 

En la siguiente política de ejemplo se muestra cómo conceder los permisos necesarios. Después de crear la política, adjúntela al rol de perfil de instancia que utilice para crear su clúster de EMR, tal y como se describe en la sección [Creación y configuración de un clúster](#configure-cluster). Para utilizar este ejemplo, sustituya *`user input placeholders`* por su propia información.

```
 1. {
 2. "Version":"2012-10-17",		 	 	  
 3.   "Statement": [
 4.         {
 5.   "Effect": "Allow",
 6.             "Resource": "arn:aws:s3-outposts:us-west-2:111122223333:outpost/op-01ac5d28a6a232904/accesspoint/access-point-name,
 7.             "Action": [
 8.                 "s3-outposts:*"
 9.             ]
10.         }
11.     ]
12.     
13.  }
```

### Creación y configuración de un clúster
<a name="configure-cluster"></a>

Para crear un clúster que ejecute Spark con S3 en Outposts, complete los siguientes pasos en la consola.

**Para crear un clúster que ejecute Spark con S3 en Outposts**

1. Abra la consola de Amazon EMR en[https://console.aws.amazon.com/elasticmapreduce/](https://console.aws.amazon.com/elasticmapreduce/).

1. En el panel de navegación izquierdo, elija **Clusters (Clústeres)**.

1. Elija **Create cluster**.

   

1. Para la **versión de Amazon EMR**, elija **emr-7.0.0** o posterior.

1. Para el paquete de aplicaciones, elija **Interactivo con Spark**. Seleccione cualquier otra aplicación que desee incluir en el clúster.

1. Para habilitar Amazon S3 en Outposts, realice la siguiente configuración.

**Ejemplo de configuración**  
Para usar esta configuración de ejemplo, sustituya `user input placeholders` por su información.

   ```
    1. [
    2.  {
    3.    "Classification": "core-site",
    4.    "Properties": {
    5.      "fs.s3a.bucket.DOC-EXAMPLE-BUCKET.accesspoint.arn": "arn:aws:s3-outposts:us-west-2:111122223333:outpost/op-01ac5d28a6a232904/accesspoint/access-point-name"
    6.      "fs.s3a.committer.name": "magic", 
    7.      "fs.s3a.select.enabled": "false"
    8.     }
    9.   },
   10.   {
   11.     "Classification": "hadoop-env",
   12.     "Configurations": [
   13.       {
   14.         "Classification": "export",
   15.         "Properties": {
   16.           "JAVA_HOME": "/usr/lib/jvm/java-11-amazon-corretto.x86_64" 
   17.           }
   18.        }
   19.      ],
   20.      "Properties": {}
   21.    },
   22.    {
   23.      "Classification": "spark-env",
   24.      "Configurations": [
   25.        {
   26.          "Classification": "export",
   27.          "Properties": {
   28.            "JAVA_HOME": "/usr/lib/jvm/java-11-amazon-corretto.x86_64"
   29.          }
   30.        }
   31.       ],
   32.       "Properties": {}
   33.      },
   34.      {
   35.       "Classification": "spark-defaults",
   36.       "Properties": {
   37.         "spark.executorEnv.JAVA_HOME": "/usr/lib/jvm/java-11-amazon-corretto.x86_64",
   38.         "spark.sql.sources.fastS3PartitionDiscovery.enabled": "false"
   39.       }
   40.      }
   41.   ]
   ```

1. En la sección **Redes**, elija una nube privada virtual (VPC) y una subred que estén en su bastidor de AWS Outposts. Para obtener más información sobre Amazon EMR en Outposts, consulte [Clústeres de EMR en AWS Outposts](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-outposts.html) en la *Guía de administración de Amazon EMR*.

1. En la sección **Perfil de instancia de EC2 para Amazon EMR**, elija el rol de IAM que tenga adjunta la [política de permisos que ha creado anteriormente](#create-permission-policy).

1. Configure los ajustes de clúster restantes y, a continuación, elija **Crear clúster**.

### Información general sobre las configuraciones
<a name="configurations-overview"></a>

En las siguientes tablas se describen las configuraciones de S3A y los valores que se deben especificar para los parámetros al configurar un clúster que utiliza S3 en Outposts con Amazon EMR.


| Parámetro | Predeterminado | Valor obligatorio para S3 en Outposts | Explicación | 
| --- | --- | --- | --- | 
|  `fs.s3a.aws.credentials.provider`  |  Si no se especifica, S3A buscará el bucket de S3 de la región con el nombre del bucket de Outposts.  |  El ARN del punto de acceso del bucket de S3 en Outposts  |  Amazon S3 en Outposts admite puntos de acceso únicamente de la virtual private cloud (VPC) como el único medio para acceder a los buckets de Outposts.  | 
|  `fs.s3a.committer.name`  | file |  `magic`  |  Magic es el único confirmador compatible con S3 en Outposts.   | 
|  `fs.s3a.select.enabled`  |  `TRUE`  |  `FALSE`  | S3 Select no es compatible con Outposts. | 
|  `JAVA_HOME`  |  `/usr/lib/jvm/java-8`  |  `/usr/lib/jvm/java-11-amazon-corretto.x86_64`  |  S3 en Outposts en S3A requiere la versión 11 de Java.  | 

En las siguientes tablas, se describen las configuraciones de Spark y los valores que se deben especificar para los parámetros al configurar un clúster que utiliza S3 en Outposts con Amazon EMR.


| Parámetro | Predeterminado | Valor obligatorio para S3 en Outposts | Explicación | 
| --- | --- | --- | --- | 
|  `spark.sql.sources.fastS3PartitionDiscovery.enabled`  |  `TRUE`  |  `FALSE`  |  S3 en Outposts no admite la partición rápida.  | 
|  `spark.executorEnv.JAVA_HOME`  |  `/usr/lib/jvm/java-8`  |  `/usr/lib/jvm/java-11-amazon-corretto.x86_64`  |  S3 en Outposts en S3A requiere la versión 11 de Java.  | 

### Consideraciones
<a name="considerations"></a>

Tenga en cuenta lo siguiente cuando integre Amazon EMR con los buckets de S3 en Outposts:
+ Amazon S3 en Outposts es compatible con la versión 7.0.0 y posteriores de Amazon EMR.
+ Se requiere el conector S3A para utilizar S3 en Outposts con Amazon EMR. Solo S3A tiene las características necesarias para interactuar con los buckets de S3 en Outposts. Para obtener información sobre la configuración del conector S3A, consulte el apartado [Requisitos previos](#s3a-outposts-prerequisites). 
+ Amazon S3 en Outposts solo admite el cifrado del servidor con claves administradas por Amazon S3 (SSE-S3) con Amazon EMR. Para obtener más información, consulte [Cifrado de datos en S3 en Outposts](s3-outposts-data-encryption.md).
+ Amazon S3 en Outposts no admite la escritura con el FileOutputCommitter de S3A. Al escribir con el FileOutputCommitter de S3A en los buckets de S3 en Outposts, se produce el siguiente error: InvalidStorageClass: The storage class you specified is not valid.
+ Amazon S3 en Outposts no es compatible con Amazon EMR sin servidor ni Amazon EMR en EKS.
+ Los registros de Amazon EMR se almacenan en la ubicación regional de Amazon S3 que haya elegido pero no se almacenan localmente en el bucket de S3 en Outposts.

# Almacenamiento en caché de autorización y autenticación
<a name="s3-outposts-auth-cache"></a>

S3 en Outposts almacena en caché localmente los datos de autenticación y autorización de forma segura en los bastidores de Outposts. La memoria caché elimina viajes de ida y vuelta a la Región de AWS principal por cada solicitud. Esto elimina la variabilidad que generan los viajes de ida y vuelta en la red. Con la caché de autenticación y autorización de S3 en Outposts, obtiene latencias consistentes que son independientes de la latencia de la conexión entre Outposts y la Región de AWS. 

Cuando realiza una solicitud a la API de S3 en Outposts, los datos de autenticación y autorización se almacenan en caché de forma segura. Luego, los datos en caché se utilizan para autenticar las solicitudes posteriores a la API de objetos de S3. S3 en Outposts solo almacena en caché los datos de autenticación y autorización cuando la solicitud se firma utilizando Signature Version 4A (SigV4A). La caché se almacena localmente en los Outposts dentro del servicio S3 en Outposts. Se actualiza de forma asíncrona cuando se realiza una solicitud a la API de S3. La caché se cifra y en Outposts no se almacena ninguna clave criptográfica en texto sin formato. 

La caché es válida durante un máximo de 10 minutos cuando el Outpost está conectado a la Región de AWS. Se actualiza de forma asíncrona cuando realiza una solicitud a la API de S3 en Outposts para garantizar que se utilicen las políticas más recientes. Si el Outpost se desconecta de la Región de AWS, la caché será válida durante un máximo de 12 horas. 

## Configuración de la caché de autorización y autenticación
<a name="config-auth-cache"></a>

S3 en Outposts almacena automáticamente en caché los datos de autenticación y autorización de las solicitudes firmadas con el algoritmo SigV4A. Para obtener más información, consulte [Firma de solicitudes de API de AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html) en la *Guía del usuario de AWS Identity and Access Management*. El algoritmo SigV4A está disponible en las versiones más recientes de los SDK de AWS. Puede obtenerlo a través de una dependencia en las [bibliotecas de AWS Common Runtime (CRT)](https://docs.aws.amazon.com/sdkref/latest/guide/common-runtime.html). 

Debe usar la versión más reciente del SDK de AWS e instalar la versión más reciente de CRT. Por ejemplo, puede ejecutar `pip install awscrt` para obtener la versión más reciente de CRT con Boto3.

S3 en Outposts no almacena en caché los datos de autenticación y autorización de las solicitudes firmadas con el algoritmo SigV4.

## Validación de la firma de SigV4
<a name="validate-SigV4A"></a>

Se puede utilizar AWS CloudTrail para validar que las solicitudes se hayan firmado con SigV4. Para obtener más información sobre la configuración de CloudTrail para S3 en Outposts, consulte [Monitoreo de S3 en Outposts con registros de AWS CloudTrail](S3OutpostsCloudtrail.md). 

Tras configurar CloudTrail, puede comprobar cómo se firmó una solicitud en el campo `SignatureVersion` de los registros de CloudTrail. Las solicitudes que se hayan firmado con SigV4A tendrán `SignatureVersion` establecido en `AWS4-ECDSA-P256-SHA256`. Las solicitudes que se hayan firmado con SigV4 tendrán `SignatureVersion` establecido en `AWS4-HMAC-SHA256`.