

# Uso de URL prefirmadas para S3 en Outposts
Uso de URL prefirmadas

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


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


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?


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
Uso compartido de objetos

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


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


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
Carga de un objeto

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


------
#### [ 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()
```

------