Generación de una URL prefirmada para cargar un objeto en un bucket de S3 en Outposts
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.
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.
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.
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. 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()