URL Firmadas en AWS
Hoy veremos como acceder a nuestros archivos privados de AWS S3 desde CloudFront, tenemos un Bucket en S3 con archivos privados, es decir sin acceso publico.
Como puedo descargar el archivo desde una URL?
La solución que voy a compartir es mediante URL firmadas, este mecanismo permite a nuestro que archivo solo pueda ser accedido por la URL firmada e identificada, aplicando un tiempo para acceder y pasado ese periodo la URL quedará inaccesible.
Para ello vamos a ejecutar una serie de Pasos:
1: Crear un Bucket
Como primero paso vamos a crear un Bucket
Creamos nuestro Bucket "mybucket-ejemplo"
2: Cargar archivos al Bucket
Cargamos un archivo a nuestro buecket
Si intentamos acceder a nuestro archivo, vemos que no es posible, por que al subir un archivo por defecto es privado.
3: Crear una distribución a CloudFront
Ahora debemos dirigir al servicio CloudFront para crear una nueva distribución teniendo en cuenta cierta configuración.
Como podemos observar en la imagen adjunta, se ha enumerado 4 puntos en la primera sección del formulario, explico cada una.
- Seleccionar el Bucker creado anteriormente como fuente de la distribución
- Habilitar acceso restringido al Bucket, Para poder acceder desde la distribución a los archivos privados
- Crear un origen de identidad "access-identity-mybucket-ejemplo.s3.amazonaws.com"
- Actualizar la politica del Bucket con la Identidad del paso 3, esto permite que se actualize automaticamente, en caso no seleccionar el Paso 4, se debe realizar manualmente.
Ahora veremos la parte final del formulario de la distribución
Debemos seleccionar "YES" la opción "Restrict Viewer Access" y creamos la distribución.
Los pasos previos son suficiente para que nuestra distribución de CloudFront espere una URL firmada en cada petición.
Adicionalmente se requiere un CloudFront key par para poder firmar la URL desde el cliente Java, lo puedes obtener en
https://console.aws.amazon.com/iam/home?region=us-east-1#/security_credential
Apunta la clave generada y descarga el archivo .pem
4: Generar una url firmada con el cliente Java de CloudFront
En este paso lo que debemos hacer es crear un proyecto Java con Maven y agregar la siguiente dependencia.
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-cloudfront -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-cloudfront</artifactId>
<version>1.9.3</version>
</dependency>
Y el código para firmar nuestra URL desde Java se muestra a continuación.
public class MyTestCloudFrount {
public static void main(String[] args) throws Exception {
/**
* DNS de tu distribución CloudFront
*/
String distributionDomainName = "dnpu4fytk6zvf.cloudfront.net";
/**
* El Private key de CloudFront
*/
File cloudFrontPrivateKeyFile = new File("D:\\pk-APKAJTE3NCSEDSSSD.pem");
/**
* Access Key ID del CloudFront key par
*/
String cloudFrontKeyPairId = "APKAJTE3NCFTGLAPBXRA";
/**
* Nombre del archivo privado que se encuentra en el bucket
* "mybucket-ejemplo"
*/
String fileName = "Crear_bucket.png";
Date expirationDate = new Date(System.currentTimeMillis() + 60 * 1000);
String signedUrl = CloudFrontUrlSigner.getSignedURLWithCannedPolicy(
CloudFrontUrlSigner.Protocol.https,
distributionDomainName,
cloudFrontPrivateKeyFile,
fileName,
cloudFrontKeyPairId,
expirationDate
);
System.out.println(signedUrl);
}
}
Con eso ya podemos acceder a nuestro archivo privado
5: Acceder a nuestro archivo
Sin URL firmado
Con URL Firmado
Saludos.
0 comments:
Publicar un comentario