Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Uso de Amazon Rekognition (REK) para detectar etiquetas de aplicaciones de marketing
Este tutorial le guía a través del proceso de creación de una aplicación Python de muestra que puede usarse para enviar correos electrónicos a las personas en función de las imágenes cargadas en un sitio web. La aplicación de muestra está diseñada para promover la participación de los usuarios en una campaña de marketing en las redes sociales mediante el envío a estos de correos electrónicos personalizados sobre ofertas de viajes si se reconocen referencias en sus fotos.
La solución integra varios AWS servicios, incluidos Amazon Rekognition, Amazon S3 CloudWatch, DynamoDB y Amazon SES. La aplicación utiliza Amazon Rekognition para detectar etiquetas en las imágenes cargadas por cuentas reconocidas en una base de datos de DynamoDB; después, se envía al titular de la cuenta un correo electrónico de marketing basado en las etiquetas detectadas en la imagen. La arquitectura completa de la solución es la siguiente:
-
Almacene los datos de los usuarios en la base de datos de DynamoDB.
-
El usuario carga metadatos (número de cuenta de usuario) y datos de las imágenes en Amazon S3.
-
Una función Lambda se invoca DetectLabelspara identificar y registrar las etiquetas de la imagen cargada, buscar el correo electrónico del usuario en DynamoDB y enviar un correo electrónico de marketing al usuario que ha subido la imagen.
-
Los resultados de la función Lambda se registran CloudWatch para su posterior revisión.
A continuación, se proporciona información general sobre todos los pasos del tutorial:
-
Crear y rellenar una tabla de DynamoDB
-
Escribir una función de Lambda con registro y notificación
-
Configurar la función de Lambda y los permisos
-
Cargar imágenes y metadatos con Amazon S3
-
CloudWatch Registros de encuestas.
Temas
Requisitos previos
Antes de comenzar este tutorial, necesita lo siguiente:
-
Una AWS cuenta y los permisos de IAM adecuados.
-
Python y Boto3 instalados en el entorno de desarrollo
-
Conocimientos básicos de Lambda, Amazon S3, DynamoDB, Amazon SES y. CloudWatch
-
Conocimientos básicos del uso de Lambda y Amazon SES
Cómo crear y rellenar una tabla de DynamoDB
Para comenzar este tutorial, crearemos una tabla de DynamoDB para almacenar los datos de los clientes, como la dirección de correo electrónico, la edad, el número de teléfono y el estado de la membresía, utilizando una variable AccountNumber «» como clave principal. También insertaremos algunos datos de muestra en la tabla.
Creación de la tabla de DynamoDB
En primer lugar, vamos a crear la tabla de DynamoDB. Aquí se indica cómo configurarla con Python y Boto3. Creamos una función llamada create_user_table
y nos conectamos al recurso de DynamoDB que contiene. En la muestra de código que aparece a continuación, sustituya el valor de “region_name” por el nombre de la región en la que opera su cuenta y, a continuación, ejecute la celda de código para crear la tabla.
import boto3 def create_user_table(dynamodb=None): if not dynamodb: dynamodb = boto3.resource('dynamodb', region_name='us-east-1') table = dynamodb.create_table( TableName='CustomerDataTable', KeySchema=[ { 'AttributeName': 'AccountNumber', 'KeyType': 'HASH' # Partition key }, ], AttributeDefinitions=[ { 'AttributeName': 'AccountNumber', 'AttributeType': 'S' }, ], ProvisionedThroughput={ 'ReadCapacityUnits': 10, 'WriteCapacityUnits': 10 } ) # Wait until the table exists. table.wait_until_exists() print("Table status:", table.table_status) # Create the DynamoDB table. create_user_table()
Al ejecutar este script, se ha configurado una tabla de DynamoDB llamada CustomerDataTable
con AccountNumber
como clave principal.
Inserción de datos de muestra
Ahora vamos a insertar algunos datos de muestra en la tabla. Estos datos de muestra nos ayudarán a probar la funcionalidad completa de la aplicación.
Crearemos una segunda función que agregue datos de muestra a la misma CustomerDataTable
que hemos creado anteriormente. Con el siguiente código se crean tres entradas de muestra y cada una incluye un número de cuenta, una dirección de correo electrónico, una edad, un número de teléfono y el estado de membresía. En la muestra de código que aparece a continuación, sustituya el valor de region_name
por el nombre de la región en la que opera su cuenta y, a continuación, ejecute la celda de código para crear la tabla. Si quiere probar la parte de entrega de correo electrónico de la aplicación, sustituya el valor de EmailAddress
en la primera entrada del cliente a continuación por una dirección de correo electrónico en la que pueda recibir correo de este tipo. Guarde y ejecute el código.
import boto3 def insert_sample_data(dynamodb=None): if not dynamodb: dynamodb = boto3.resource('dynamodb', region_name='us-east-1') table = dynamodb.Table('CustomerDataTable') # Sample data customers = [ { 'AccountNumber': 'ACC1000', 'EmailAddress': 'email-for-delivery-here', 'Age': 30, 'PhoneNumber': '123-456-7890', 'MembershipStatus': 'Active' }, { 'AccountNumber': 'ACC1001', 'EmailAddress': 'jane.doe@example.com', 'Age': 25, 'PhoneNumber': '098-765-4321', 'MembershipStatus': 'Inactive' }, { 'AccountNumber': 'ACC1002', 'EmailAddress': 'pat.candella@example.com', 'Age': 35, 'PhoneNumber': '555-555-5555', 'MembershipStatus': 'Active' } ] # Inserting data for customer in customers: print(f"Adding customer: {customer['AccountNumber']}") table.put_item(Item=customer) # Insert sample data into DynamoDB insert_sample_data()
Una vez que la tabla de DynamoDB se haya configurado y rellenado, podemos proceder a integrar esta recuperación de datos en la función de Lambda. Esto permite a nuestra aplicación recuperar los detalles del usuario en función del número de cuenta que se identificará en el próximo flujo de trabajo de procesamiento de imágenes.
Creación de una función de Lambda con registro y notificación
Ahora, podemos crear una función de Lambda. Queremos asegurarnos de que la función de Lambda, que se desencadena al cargar la imagen, pueda leer tanto los datos de imagen como los metadatos de la cuenta y usarlos para realizar una búsqueda en la tabla DynamoDB de los datos de usuario asociados. Esto significa que no solo tendremos que invocar la función de Amazon Rekognition, sino que también necesitaremos una DetectLabels función que la tome AccountNumber y la utilice para recuperar la dirección de correo electrónico asociada de DynamoDB. Asimismo, necesitamos una función que envíe un correo electrónico a la dirección correspondiente que utiliza Amazon SES. Por último, registramos la información sobre el proceso mediante un registrador. Estos datos se mostrarán mediante. CloudWatch
Creación de la función de Lambda
A continuación, se describe cómo puede gestionar una función de Lambda estos requisitos. En el siguiente ejemplo de código, asegúrese de que se ha especificado la tabla de DynamoDB correcta si ha utilizado algo CustomerDataTable distinto del nombre de la tabla. Además, en la función “send_marketing_email”, debe reemplazar el valor del argumento “Source” por una dirección de correo electrónico a la que tenga acceso y que funcione como correo electrónico de envío.
import json import boto3 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): s3_bucket = event['Records'][0]['s3']['bucket']['name'] s3_object_key = event['Records'][0]['s3']['object']['key'] print(s3_bucket) print(s3_object_key) s3 = boto3.client('s3') try: s3_response = s3.head_object(Bucket=s3_bucket, Key=s3_object_key) account_number = s3_response['Metadata']['account_number'] except Exception as e: logger.error(f"Failed to retrieve object or metadata: {str(e)}") raise e # Optionally re-raise to handle the error upstream or signal a failure rekognition = boto3.client('rekognition') try: labels_response = rekognition.detect_labels(Image={'S3Object': {'Bucket': s3_bucket, 'Name': s3_object_key}}) #logger.info(f"Detected labels: {json.dumps(labels_response['Labels'], indent=4)}") except Exception as e: #logger.info(f"Detected label: {label['Name']}") raise e #logger.info(f"Detected labels: {json.dumps(labels_response['Labels'], indent=4)}") landmark_detected = any(label['Name'] == 'Landmark' and label['Confidence'] > 20 for label in labels_response['Labels']) if landmark_detected: result = notify_user_based_on_landmark(account_number) print(result) #logger.info(f"Detected label: {label['Name']}") #logger.info(f"Notification sent: {result}") return { 'statusCode': 200, 'body': json.dumps('Process completed successfully!') } def notify_user_based_on_landmark(account_number): # Retrieve user data from DynamoDB dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('CustomerDataTable') user_info = table.get_item(Key={'AccountNumber': account_number}) # Send email if user is found if 'Item' in user_info: send_marketing_email(user_info['Item']['EmailAddress']) return "User notified with relevant travel information." def send_marketing_email(email): ses = boto3.client('ses') response = ses.send_email( Source='your-email@example.com', Destination={'ToAddresses': [email]}, Message={ 'Subject': {'Data': 'Explore New Destinations!'}, 'Body': { 'Text': {'Data': 'Check out our exclusive travel packages inspired by the landmark in your uploaded image!'} } } ) return f"Email sent to {email} with status {response['ResponseMetadata']['HTTPStatusCode']}" print("succeess")
Ahora que hemos escrito la función Lambda, necesitamos configurar los permisos para Lambda y crear una instancia de nuestra función Lambda en la consola de administración. AWS
Configuración de los permisos y la función de Lambda
Creación o actualización del rol de IAM
Para poder utilizar una función de Lambda a fin de gestionar cualquier imagen que hayan cargado los usuarios, antes debemos gestionar los permisos correspondientes a esta. La función Lambda necesita una función de IAM con un ámbito específico que tenga políticas que le permitan interactuar con Amazon S3, DynamoDB, Amazon SES, Amazon Rekognition y. CloudWatch
Para configurar el rol de IAM para la función de Lambda:
-
AWS Consola de administración abierta.
-
Vaya a IAM > Roles > Crear rol.
Elija “Crear rol”.
-
Seleccione Lambda como el servicio que va a usar este rol. Haga clic en “Siguiente”.
-
Adjunte las siguientes políticas (tenga en cuenta que estas políticas se seleccionan únicamente con fines de demostración; en un entorno de producción real, le interesa limitar los permisos solo a los que sean necesarios):
-
Amazon S3 ReadOnlyAccess
-
AmazonRekognitionReadOnlyAccess
-
AmazonDynamoDBFullAcceso
-
SESFullAcceso a Amazon
-
AWSLambdaEjecutar
-
AWSLambdaBasicExecutionRole (para CloudWatch registrar)
Haga clic en “Siguiente”.
-
-
Asigne un nombre y una descripción al rol y, a continuación, seleccione “Crear rol” para crearlo.
-
Una vez que hayamos configurado los permisos adecuados para Lambda, podemos crear una instancia de la función Lambda mediante la consola de administración. AWS
En la Consola de administración de AWS, vaya al servicio Lambda.
-
Haga clic en “Crear una función”. Elija “Crear desde cero”.
-
Escriba un nombre para la función y seleccione el entorno en tiempo de ejecución Python. En “Cambiar el rol de ejecución predeterminado”, seleccione “Uso de un rol existente” y, a continuación, elija el rol de IAM que ha creado anteriormente.
-
Ahora tiene que crear y actualizar el código en la pestaña de la función de Lambda. Vaya a la pestaña llamada “lambda_function” y reemplace el código que aparece en esta por la muestra de código de Lambda que proceda.
Guarde los cambios e impleméntelos.
-
Ahora tiene que configurar un evento de Amazon S3 como desencadenador de Lambda.
En la página o la pestaña de configuración de la función de Lambda, vaya a “Desencadenador” y haga clic en “Agregar desencadenador”.
-
Seleccione Amazon S3 en la lista de desencadenadores disponibles.
-
Para configurar el desencadenador, seleccione el bucket desde el que debe desencadenarse la función.
Elija el tipo de evento, PUT. De forma opcional, puede especificar un prefijo o un sufijo si solo quiere procesar archivos con determinados nombres o tipos.
-
Haga clic en “Agregar” para activar el desencadenador y guarde la configuración.
Verificación de direcciones de correo electrónico de Amazon SES
Para poder usar Amazon SES a fin de enviar mensajes de correo electrónico, antes debe verificar las direcciones de correo electrónico tanto del remitente como del destinatario. Para ello:
Vaya a la consola de Amazon SES. Vaya a “Administración de identidades” y, a continuación, a “Direcciones de correo electrónico”.
Haga clic en “Verificar una dirección de email nueva”. Escriba la dirección de correo electrónico que quiere verificar y, a continuación, elija “Verificar esta dirección de correo electrónico”. Recibirá un correo electrónico con un enlace de verificación. Haga clic en el enlace para completar el proceso de verificación.
-
Una vez que haya verificado las direcciones de correo electrónico de ambas cuentas, haya configurado la función de Lambda con los permisos correctos y haya creado algunos datos de clientes de muestra, puede probar la función de Lambda si carga una imagen de prueba en el bucket de Amazon S3 que elija.
Carga de imágenes en Amazon S3 con metadatos
Ahora podemos cargar una imagen de prueba en el bucket de Amazon S3 que hayamos elegido mediante la AWS consola o el script que preparamos anteriormente. Escriba un script que cargue una imagen en el bucket de Amazon S3 que ha especificado anteriormente en la función de Lambda. En el ejemplo de código que aparece a continuación, especifique la ruta de acceso de la imagen como primer argumento de “upload_image_to_s3”, el nombre del bucket como segundo argumento y el número de cuenta del usuario que carga la imagen como argumento final.
import boto3 def upload_image_to_s3(file_name, bucket, account_number): s3 = boto3.client('s3') try: with open(file_name, 'rb') as data: s3.upload_fileobj( Fileobj=data, Bucket=bucket, Key=file_name, ExtraArgs={ 'Metadata': {'account_number': account_number} } ) print("Image uploaded successfully with metadata.") except Exception as e: print("Failed to upload image") print(e) # Usage upload_image_to_s3('path-to-image-here', 's3-bucket-name-here', 'user-account-number-here')
En esta función, se utiliza el parámetro ExtraArgs
del método upload_fileobj
para incluir metadatos definidos por el usuario (account_number
) junto con la imagen. Estos metadatos se pueden utilizar posteriormente AWS para procesar la imagen en consecuencia.
Guarde y ejecute el script. Al hacerlo, se cargará la imagen.

Unos minutos después de cargar la imagen, debería recibir un correo electrónico en la dirección que ha asociado anteriormente a la cuenta especificada aquí.
CloudWatch Registros de sondeos del cliente
Compruebe los CloudWatch registros de la función Lambda para ver si se activó y ejecutó según lo previsto. Los registros se encuentran en > Registros > Grupos de registros CloudWatch >AWS/lambda/your_function_name. También puede escribir un script para acceder a los registros e imprimirlos. La siguiente muestra de código sondea los registros del grupo Lambda e imprime aquellos que se han generado en la última hora. Guarde y ejecute el código.
import boto3 import time def fetch_lambda_logs(log_group_name, start_time): client = boto3.client('logs') query = "fields @timestamp, @message | sort @timestamp desc | limit 20" start_query_response = client.start_query( logGroupName=log_group_name, startTime=int(start_time), endTime=int(time.time()), queryString=query, ) query_id = start_query_response['queryId'] response = None while response is None or response['status'] == 'Running': time.sleep(1) # Wait for 1 second before checking the query status again response = client.get_query_results(queryId=query_id) return response['results'] # Usage log_group = '/aws/lambda/RekMediaFunction' logs = fetch_lambda_logs(log_group, int(time.time()) - 3600) # Fetch logs from the last hour print("Retrieving logs") for log in logs: #print(log) print(log[1]['value'])
Al ejecutar el código, deberían imprimirse los registros y debería poder ver que el usuario ha recibido una notificación por correo electrónico con la información de viaje pertinente.

Ha creado correctamente una aplicación capaz de detectar etiquetas en las imágenes cargadas en un bucket de Amazon S3 y de enviar, después, por correo electrónico un mensaje promocional al usuario que ha cargado la imagen. Asegúrese de eliminar los recursos que ya no necesite para que no se le cobre por ellos.