Bienvenida

1

Creación de Aplicaciones Serverless Avanzadas en AWS

2

Mejorando Proyectos Serverless con Buenas Prácticas y Funcionalidades

Buenas prácticas en serverless

3

Integración de Servicios AWS en Proyectos Serverless Avanzados

4

Buenas Prácticas con Serverless Framework en AWS

Serverless no es solo lambda

5

Validación de Lógica de Negocio con API Gateway y JSON Schema

6

Integración de Servicios AWS en Arquitecturas Serverless

7

Subida Segura de Archivos a S3 usando URLs Firmadas

8

Creación y Configuración de Buckets S3 con CloudFormation

9

Generación de URLs firmadas con AWS Lambda y API Gateway

Lambda layers

10

Procesador de Imágenes Asíncrono con AWS Lambda y S3

11

Optimización de Lambda con Layers en AWS y Serverless Framework

12

Automatización de Lambda Layers con GitHub Actions y Serverless Framework

Asegurando nuestra app serverless

13

Seguridad en Aplicaciones Serverless con API Gateway y Custom Authorizers

14

Uso de API Keys en Serverless Framework y API Gateway

15

Creación de Custom Authorizers en AWS con Serverless Framework

16

Autorización Personalizada con AWS Lambda y Custom Authorizer

Conectando ApiGateway con SQS

17

Asincronismo y Lambda: Implementación en AWS Serverless

18

Suma de Likes Asíncrona con AWS Lambda y SQS

19

Implementación Asíncrona de Likes con AWS Lambda y DynamoDB

Bonus

20

Configuración de Dominios Personalizados en AWS API Gateway

21

Configuración de Dominios Personalizados con Serverless Framework

22

Experiencias y desafíos en el desarrollo con Serverless en AWS

Cierra del curso

23

Resumen del Curso Serverless en AWS

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Generación de URLs firmadas con AWS Lambda y API Gateway

9/24
Recursos

¿Cómo configurar una aplicación para subir imágenes a Amazon S3?

En el entorno de desarrollo actual, la implementación de aplicaciones serverless se ha vuelto una habilidad fundamental. En esta sección, exploraremos cómo crear una aplicación que permite almacenar imágenes en un bucket de Amazon S3 utilizando funciones lambda y API Gateway. Este proceso te permitirá generar URLs firmadas para que los usuarios puedan cargar imágenes de manera segura.

¿Cómo construir una función Lambda para firmar URLs?

La función Lambda es un componente crucial en este flujo, ya que genera la URL firmada que permite cargar imágenes al bucket de S3:

  • Importar SDK de Amazon: Asegúrate de incluir el SDK de Amazon para crear un cliente de S3.
  • Versión de firma: Utiliza el 'signature version 4'; permite firmar URLs, lo que es esencial para la seguridad de la aplicación.
  • Manejador (Handler): Define una función asíncrona que actúe como manejador, utilizando el objeto event y context.
  • Parámetros URL: Extrae el nombre del archivo del event dentro de queryStringParameters para que S3 reciba el nombre adecuado.
  • Generación de URL firmada: Usa el método putObject del cliente S3 para determinar el método que se empleará con esa URL, especificando el key, el bucket y el tiempo de expiración.
const AWS = require('aws-sdk');
const s3 = new AWS.S3({
  signatureVersion: 'v4',
});

exports.handler = async (event) => {
  const filename = event.queryStringParameters.filename;
  const signedURL = s3.getSignedUrl('putObject', {
    Bucket: process.env.BUCKET,
    Key: `upload/${filename}`,
    Expires: 300,
  });
  
  return {
    statusCode: 200,
    body: signedURL,
  };
};

¿Cómo configurar el archivo serverless.yaml?

El archivo serverless.yaml es fundamental para describir la infraestructura serverless de tu aplicación:

  • Variables de entorno: Define las variables dentro del proveedor con un nuevo key llamado environment donde se configurará, por ejemplo, el bucket.
provider:
  environment:
    BUCKET: nombreDelBucket
  • Definición de funciones Lambda: Crea una nueva función lambda en el archivo para firmar URLs, definiendo su handler y otros parámetros.
  • Eventos y parámetros HTTP: Usa un evento HTTP tipo GET en el que especifiques query strings necesarios, como filename.
functions:
  signedURL:
    handler: signedURL.handler
    events:
      - http:
          path: signedURL
          method: get
          request:
            parameters:
              querystrings:
                filename: true

¿Cómo otorgar permisos adecuados a las funciones?

Para asegurar que tu función pueda interactuar con S3:

  • Permisos IAM: Añade permisos al rol de la función lambda para interactuar con el bucket S3, asegurándote de especificar el ARN del bucket.
iamRoleStatements:
  - Effect: 'Allow'
    Action:
      - 's3:*'
    Resource: 
      - 'arn:aws:s3:::nombreDelBucket/*'

Esta configuración de permisos es básica para este tutorial, pero deberías ajustarla a solo los permisos necesarios para mejorar la seguridad.

¿Cómo probar la URL firmada con Postman?

Después de desplegar tu aplicación, es importante verificar su funcionalidad:

  1. Crear un request GET: Usa Postman para enviar un request GET a tu endpoint de firma, asegurándote que incluya el parámetro filename.
  2. Verificar respuesta: Debe devolver una URL larga, lo que indica que fue firmada correctamente.
  3. Subir una imagen: Utiliza la URL firmada para un request PUT en Postman, adjuntando la imagen en el body -> Binary.

Conclusiones y recomendaciones de buenas prácticas

  • Seguridad de URLs: Las URLs firmadas proporcionan transacciones seguras y limitan el tiempo de accesibilidad, lo que aumenta la seguridad del bucket.
  • Documentación Serverless: Familiarízate con la documentación oficial de Serverless Framework para modelos de permisos más detallados.
  • Optimización de permisos: Ajusta los permisos del bucket S3 y de la función lambda para mantener la seguridad de tu aplicación siguiendo las mejores prácticas de AWS.

Estas instrucciones te permitirán construir una aplicación robusta que capitaliza los servicios serverless de AWS, proporcionando a tus usuarios una experiencia segura y eficiente al manejar almacenamiento de imágenes. ¡Continúa practicando y explorando para perfeccionar tus habilidades!

Aportes 10

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Se perdió la claridad del video después del minuto 12:00.

Para los que tengan dudas de cómo subir el archivo después de haber generado la URL que firma el objeto de S3, pueden utilizar Postman usando el método PUT, pegar la URL firmada, seleccionar en el body la opción binary, adjuntar el archivo y ejecutar la petición. Si la respuesta es 200 significará que el archivo ya se encuentra en el bucket de S3, por lo que procedemos a checkear que efectivamente así sea.

Hola a todos, gracias por los reportes con respecto a esta clase, estamos revisando el contenido y ajustandolo, pronto quedara actualizado nuevamente.
Muchas gracias.

En el minuto 12:00 , no se visualiza la prueba del signedURL en Postman 😦

Del minuto 3:09 al 4:00 en el video 11 “Creando y desplegando una lambda layer” se muestra la parte que se desfasa en este video!

Claro, vamos a cubrir cómo **firmar URLs** (presigned URLs) y **subir objetos a Amazon S3** usando AWS SDK. ¿Te interesa hacerlo desde Python, Node.js, o algún otro lenguaje? Aquí te muestro cómo hacerlo en **Python (boto3)**, que es bastante común. ## 🔐 Firmar una URL para subir un archivo a S3 (Presigned URL) Esto te permite darle a un cliente (como un navegador o una app) una URL temporal para subir un archivo directamente a S3 sin pasar por tu servidor. import boto3 from botocore.exceptions import NoCredentialsError import datetime s3\_client = boto3.client('s3') def generar\_presigned\_url(bucket, key, expiration=3600): try: url = s3\_client.generate\_presigned\_url( 'put\_object', Params={'Bucket': bucket, 'Key': key}, ExpiresIn=expiration ) return url except NoCredentialsError: print("Credenciales no configuradas") return None \# Uso bucket\_name = 'tu-bucket' file\_key = 'carpeta/nombre\_del\_archivo.txt' url = generar\_presigned\_url(bucket\_name, file\_key) print("URL para subir archivo:", url) ## 📤 Subir un archivo directamente desde Python a S3 def subir\_a\_s3(bucket, key, file\_path): try: s3\_client.upload\_file(file\_path, bucket, key) print("Archivo subido correctamente.") except Exception as e: print("Error al subir:", e) \# Uso subir\_a\_s3('tu-bucket', 'carpeta/archivo.txt', '/ruta/local/archivo.txt') ## 🧪 Bonus: Subida desde navegador usando la URL firmada (HTML/JS) \<input type="file" id="fileInput"> \<script> document.getElementById('fileInput').addEventListener('change', async function() { const file = this.files\[0]; const presignedUrl = "https://s3.amazonaws.com/tu-bucket/carpeta/archivo.txt?..."; // generado por tu backend await fetch(presignedUrl, { method: "PUT", body: file }).then(response => { if (response.ok) { alert("Archivo subido con éxito"); } else { alert("Error al subir"); } }); }); \</script>
Mi solución para aplicar el principio del mínimo privilegio usando el plugin <https://www.serverless.com/plugins/serverless-iam-roles-per-function> ```txt provider: name: aws ... iam: role: # default permissions statements: - Effect: Allow Action: - dynamodb:Query - dynamodb:putItem - dynamodb:updateItem - dynamodb:deleteItem Resource: !GetAtt usersTable.Arn ... get-signed-url: ... # override permissions iamRoleStatements: - Effect: Allow Action: s3:putObject Resource: !Join - "/" - - !GetAtt s3Bucket.Arn - "*" environment: BUCKET: !Ref s3Bucket package: patterns: ... events: - http: path: signed-url method: GET request: parameters: querystrings: filename: true ```
Después del minuto 14:20 cuando habla de AWS, creo que no mostraba la pantalla donde esta AWS, para ver la carpeta donde se había subido la imagen. Revisar! :-)
```js environment: BUCKET_NAME: !Ref MyS3Bucket ```
```js environment: BUCKET_NAME: ${MyS3Bucket} ```

5 meses que se reportó el problema con esta clase, y veo que se mantiene igual al día de hoy. Pero nada, se resuelve de una u otra forma.