Header Ads Widget

Ticker

6/recent/ticker-posts

Cómo integrar AWS S3 en su API REST


Este tutorial describe cómo convertir un módulo Boto3 Python en una API Flask para cargar y eliminar archivos en AWS S3.

Encontrar una forma de almacenar, distribuir y administrar sus datos es una tarea desafiante. La ejecución de aplicaciones, la entrega de contenido a los usuarios, el alojamiento de sitios web de alto tráfico o la realización de copias de seguridad de bases de datos requieren una gran cantidad de almacenamiento, y la necesidad de más almacenamiento sigue creciendo.

AWS S3 es uno de los servicios más populares ofrecidos por Amazon Web Services. Proporciona almacenamiento de objetos a través de un servicio de interfaz web. Utiliza la misma infraestructura que utiliza Amazon.com.

S3 tiene como objetivo proporcionar datos en forma de objeto, reduciendo la latencia y proporcionando alta disponibilidad y escalabilidad. S3 son las siglas de Simple Storage Service y le permite almacenar datos estáticos.

Dado que S3 ofrece una disponibilidad y durabilidad impresionantes, se ha convertido en un estándar para que las empresas almacenen datos como videos, audio, imágenes y archivos CSV. La estructura de carpetas es típica de lo que ve en Windows o macOS: tiene carpetas y subcarpetas, etc.

S3 también tiene redundancia incorporada con una durabilidad del 99,99999999999% (sí, ¡eso es 99 punto 11 veces 9!). Esto se debe a que S3 replica sus depósitos y todo su contenido en tres zonas de disponibilidad o tres ubicaciones físicas. Por lo tanto, la probabilidad de que S3 pierda un archivo cargado es extremadamente baja.

¿Por qué es útil S3?

  • Manera económica y confiable de almacenar objetos.
  • Acceso de baja latencia y alto rendimiento al contenido de sus depósitos.
  • Puede usarlo fácilmente para alojar sitios web estáticos.
  • Puede integrar fácilmente eventos en su bucket de S3 con SNS, SQS y Lambda para algunas aplicaciones muy potentes basadas en eventos.
  • Tiene un mecanismo para pasar de los datos antiguos al almacenamiento a largo plazo para reducir los costos.

¿Por qué no llamar a S3 directamente?

En este tutorial, crearemos API de S3 utilizando el paquete Boto3 en Python y Flask. Hay muchas razones por las que un desarrollador puede optar por utilizar Boto3 para trabajar con S3 en lugar de llamar directamente a la API REST de AWS.

Por ejemplo, cuando utiliza una API de proveedor, debe lidiar con dependencias agregadas y los códigos de error podrían introducir una complejidad adicional. Al usar un paquete personalizado, simplemente puede verificar una declaración if / else.

Otra razón es evitar escribir códigos más largos. Digamos que desea iniciar una carga. Cuando trabaja con un paquete local, simplemente puede realizar una llamada, como boto3.upload_file(), y pasar el nombre del archivo, y listo. Pero si desea hacer lo mismo con la API de AWS S3, debe lidiar con los encabezados y el cuerpo, y componer casi 20 líneas de código solo para cargar un archivo.

Además, cuando se usa una API o CDN que le brinda al usuario la funcionalidad para cargar archivos estáticos, un desarrollador puede preferir crear un sistema de autenticación usando su propia API REST (que usa el nombre de usuario y la contraseña de su organización). Hacer que el usuario use S3 a través de su aplicación, con un punto final como , puede ayudar a evitar exponer las claves de API de AWS.nordicapis.com/upload-to-s3

¿Qué es Boto3?

Boto3 es un paquete oficial de Python de Amazon para usar las funcionalidades de AWS S3. Le permite cargar, eliminar y actualizar objetos directamente en un depósito de S3.

Ahora, sigamos adelante con el tutorial.

Prerrequisitos

  • Conocimiento de Python
  • Matraz
  • Credenciales de la API de AWS
  • Firecamp para probar la API
  • Virtualenv

Paso 1: obtener las credenciales de la API de AWS

El primer paso es obtener la identificación de la clave de acceso y la clave de acceso secreta. Debe abrir la página de IAM ( https://console.aws.amazon.com/iam/home#/home ) y luego hacer clic en Users.

Luego haga clic en Add UsersProporcione un nombre de usuario y haga clic en Programmatic Accesspara que se puedan generar las credenciales.

Ahora, en la siguiente pantalla, verá los permisos. Entonces, cree un nuevo grupo de usuarios y seleccione AmazonS3FullAccess.

Una vez hecho esto, ahora puede ver las credenciales en la última página. Guarde esto en un bloc de notas, ya que lo necesitaremos para usar Boto3.

Paso 2: instalar dependencias

Ahora crea una carpeta con nombre aws-apiy abre tu terminal. Suponemos que ya ha instalado el virtualenvpaquete. Si no lo ha hecho, siga este tutorial para la instalación.

Ahora, intentemos inicializar una virtualenvinstancia usando el siguiente comando:

virtualenv .
source bin/activate

Una vez hecho esto, instalemos el paquete Boto3 y Flask usando el siguiente comando:

pip3 install boto3
pip3 install Flask

Ahora que hemos instalado las dependencias, centrémonos en la parte de codificación.

Paso 3: punto final de la API para cargar un archivo

En este paso, crearemos un punto final de API para cargar archivos en nuestro depósito S3. Antes de continuar con el código, primero creemos un depósito en nuestro AWS S3.

Creé un depósito vs-testcon el nombre de región us-east-2Asegúrese de anotar la región del depósito, ya que es un parámetro obligatorio.

Ahora cree un archivo app.py, ábralo en su IDE favorito y pegue el siguiente código:

import boto3, json, os
from botocore.exceptions import NoCredentialsError
from flask import Flask, request, jsonify
from werkzeug.utils import secure_filename
from werkzeug.datastructures import  FileStorage

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = os.getcwd()

@app.route('/')
def hello_world():
    return 'This is my first API call!'

@app.route('/upload-file', methods=["POST"])
def uploadFile():
     print("here")

     if 'secret_key' in request.form.keys() and 'key_id' in request.form.keys() and 'upload_file' in request.files.keys() and 'bucket_name' in request.form.keys() and 'region'  in request.form.keys():
          secret_key = request.form['secret_key']
          key_id = request.form['key_id']
          bucket_name = request.form['bucket_name']
          region = request.form['region']
          file_upload =  request.files['upload_file']
          print(file_upload.filename)
          file_upload.save(secure_filename(file_upload.filename))

          s3 = boto3.client('s3', aws_access_key_id=key_id, aws_secret_access_key=secret_key)
          s3.upload_file(app.config['UPLOAD_FOLDER']+"/"+file_upload.filename, bucket_name, file_upload.filename)

          return jsonify({"Status" : "File uploaded successfully"})   
     else:
          return jsonify({"error": "You're missing one of the following: app_secret, key_id"})

Explicación del código

En un primer momento, estamos importando todas las dependencias, tales como boto3FlaskFilestorage, y otros. Después de eso, hemos definido un punto final upload-file, que acepta form-submission.

Primero, verificamos si los campos obligatorios están allí o no en la solicitud y luego cargamos el archivo en nuestro servidor Flask. Una vez que se carga el archivo, nos autenticamos con AWS S3 y luego pasamos los parámetros requeridos como el nombre del depósito, la región, la clave, el secreto, etc.

Ahora intentemos probar nuestra API. Voy a usar Firecamp para probar la API. También puede elegir una de las herramientas mencionadas aquí, pero asegúrese de que sea compatible con la función de carga de archivos.

En la terminal, para ejecutar el servidor Flask, use el siguiente comando:

flask run

Ahora, hagamos una solicitud de API. En Firecamp, seleccione multipartdebajo del cuerpo y pase los siguientes campos:

  • secret_key
  • key_id
  • bucket_name
  • region
  • upload_file

En el campo URL, pase la siguiente URL:

http://127.0.0.1:5000/upload-file

Si ha pasado los detalles correctos, debería ver los archivos en AWS S3.

Otro punto a tener en cuenta es que para actualizar o reemplazar el mismo archivo, solo necesita cargar el archivo con el mismo nombre que desea reemplazar / actualizar y el resto será atendido por AWS S3.

Paso 4: punto final de la API para eliminar un archivo

Ahora intentemos eliminar un archivo en S3 usando Flask. Entonces, agregue el siguiente código en su app.pyarchivo:

@app.route('/delete-file', methods=["POST"])
def deleteFile():
     secret_key = request.form['secret_key']
     key_id = request.form['key_id']
     bucket_name = request.form['bucket_name']
     file_name = request.form['file_name']
     s3 = boto3.client('s3', aws_access_key_id=key_id, aws_secret_access_key=secret_key)
     s3.delete_object(Bucket=bucket_name, Key=file_name)
     return jsonify({"Success": "File Deleted"})

Explicación del código:

Hemos definido un punto final delete-fileque aceptará los siguientes formularios de envío:

  • secret_key
  • key_id
  • bucket_name
  • file_name

Después de eso, estamos creando una instancia de S3 y luego llamamos delete_objectpara eliminar el objeto de S3.

Paso 5: punto final de API para crear un bucket de S3

Una vez que haya terminado con todos los pasos anteriores, podemos intentar crear un nuevo depósito de S3 utilizando nuestra API. Para hacerlo, agregue el siguiente código en su app.py:

@app.route('/create-bucket', methods=["POST"])
def createBucket():
     secret_key = request.form['secret_key']
     key_id = request.form['key_id']
     bucket_name = request.form['bucket_name']
     s3 = boto3.client('s3', aws_access_key_id=key_id, aws_secret_access_key=secret_key)
     try:
          s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={
               'LocationConstraint': 'us-east-2'})
          return jsonify({"Success": "Bucket Created"})
     except:
return jsonify({"Error": "Something went wrong"})

Explicación del código:

Hemos definido un punto final create-bucket, que usaremos para crear un depósito en nuestro S3. La función createBucket()tomará todos los campos obligatorios, como secret_key,key_id ,bucket_name , andbucket_name`.

Después de crear las variables, estamos creando una instancia de S3 y usamos la create_bucketfunción para crear el depósito de S3.

En la aplicación Firecamp, puede intentar llamar al punto final de la API con las credenciales, y devolverá algo como esto:

¿No fue fácil convertir Boto3 en Flask API? La prueba se vuelve mucho más fácil con Firecamp, ya que admite de forma nativa la carga de archivos.

Ultimas palabras

Puede convertir un módulo Boto3 Python completo o incluso cualquier módulo en una API de Flask y probarlo usando Firecamp o cualquier otra herramienta de prueba de API. Esta conversión será muy útil cuando esté creando una aplicación web o móvil donde no desea que sus usuarios sean redirigidos a un sitio web de terceros.


 

Publicar un comentario

0 Comentarios