Cómo descargar nuevos archivos subidos desde s3 a ec2 cada vez.
Tengo un cubo s3
que recibirá nuevos archivos a lo largo del día. Quiero descargar estos archivos a mi instancia ec2
cada vez que se cargue un nuevo archivo en el cubo.
He leído que es posible utilizar sqs
, sns
o lambda
. ¿Cuál es el más fácil de todos? Necesito que el archivo se descargue lo antes posible una vez que se cargue en el cubo.
EDITAR
Básicamente, obtendré imágenes png en el cubo cada pocos segundos o minutos. Cada vez que se cargue una nueva imagen, quiero descargarla en la instancia que ya está en ejecución. Realizaré algunos procesos de inteligencia artificial. Como las imágenes seguirán llegando al cubo, quiero seguir descargándolas constantemente en el ec2 y procesarlas lo antes posible.
Este es mi código en la función Lambda hasta ahora.
import boto3
import json
def lambda_handler(event, context):
"""Leer el archivo de s3 al activar."""
#print(event)
s3 = boto3.client("s3")
client = boto3.client("ec2")
ssm = boto3.client("ssm")
instanceid = "<strong>**</strong>"
if event:
file_obj = event["Records"][0]
#print(file_obj)
bucketname = str(file_obj["s3"]["bucket"]["name"])
print(bucketname)
filename = str(file_obj["s3"]["object"]["key"])
print(filename)
response = ssm.send_command(
InstanceIds=[instanceid],
DocumentName="AWS-RunShellScript",
Parameters={
"commands": [f"aws s3 cp {filename} ."]
}, # replace command_to_be_executed with command
)
# fetching command id for the output
command_id = response["Command"]["CommandId"]
time.sleep(3)
# fetching command output
output = ssm.get_command_invocation(CommandId=command_id, InstanceId=instanceid)
print(output)
return
Sin embargo, obtengo el siguiente error:
Nombre del evento de prueba:
prueba
Respuesta:
{
“mensaje de error”: “2021-12-01T14:11:30.781Z 88dbe51b-53d6-4c06-8c16-207698b3a936 El tiempo de espera de la tarea finalizó después de 3.00 segundos”
}
Registros de la función:
INICIAR RequestId: 88dbe51b-53d6-4c06-8c16-207698b3a936 Versión: $ ÚLTIMO
FIN RequestId: 88dbe51b-53d6-4c06-8c16-207698b3a936
INFORME RequestId: 88dbe51b-53d6-4c06-8c16-207698b3a936 Duración: 3003.58 ms Tiempo facturado: 3000 ms Tamaño de memoria: 128 MB Máximo uso de memoria: 87 MB Duración de la inicialización: 314.81 ms
2021-12-01T14:11:30.781Z 88dbe51b-53d6-4c06-8c16-207698b3a936 El tiempo de espera de la tarea finalizó después de 3.00 segundos
ID de solicitud:
88dbe51b-53d6-4c06-8c16-207698b3a936
Cuando elimino todas las líneas relacionadas con ssm, funciona bien. ¿Hay algún problema de permiso o hay algún problema con el código?
EDITAR2
Mi código está funcionando, pero no veo ninguna salida o cambio en mi instancia ec2. Debería ver un archivo de texto vacío en el directorio de inicio, pero no veo nada.
Código
import boto3
import json
import time
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
"""Leer el archivo de s3 al activar."""
#print(event)
s3 = boto3.client("s3")
client = boto3.client("ec2")
ssm = boto3.client("ssm")
instanceid = "<strong>**</strong>"
print("HI")
if event:
file_obj = event["Records"][0]
#print(file_obj)
bucketname = str(file_obj["s3"]["bucket"]["name"])
print(bucketname)
filename = str(file_obj["s3"]["object"]["key"])
print(filename)
print("envio")
try:
response = ssm.send_command(
InstanceIds=[instanceid],
DocumentName="AWS-RunShellScript",
Parameters={
"commands": ["touch hola.txt"]
}, # replace command_to_be_executed with command
)
# fetching command id for the output
command_id = response["Command"]["CommandId"]
time.sleep(3)
# fetching command output
output = ssm.get_command_invocation(CommandId=command_id, InstanceId=instanceid)
print(output)
except Exception as e:
logger.error(e)
raise e
davy.ai
Para descargar archivos nuevos de un bucket de
s3
a una instancia deec2
cada vez que se cargue un archivo nuevo en el bucket, la forma más sencilla es usar AWS Lambda con un disparador en el bucket des3
.Estos son los pasos a seguir:
s3
. Puede usar la bibliotecaboto3
para descargar el archivo del bucket a la instancia deec2
.Para activar la función de Lambda cada vez que se cargue un archivo nuevo en el bucket de
s3
, cree una configuración de notificación en el bucket des3
que envíe un evento cuando se cree un archivo nuevo. La notificación debe activar la función Lambda que creó en el paso 1.Por último, asegúrese de que la instancia de
ec2
tenga los permisos necesarios para acceder al bucket des3
y de que la función Lambda tenga el rol IAM correcto asignado con acceso as3
yec2
.Según su caso específico de uso, parece que recibirá nuevas imágenes
png
en el bucket des3
cada pocos segundos o minutos, y desea descargarlas a la instancia deec2
lo antes posible para el procesamiento de IA. En este caso, recomendaría usar AWS Lambda con un disparador des3
, ya que la función de Lambda se activará casi en tiempo real al subir un nuevo archivo, mientras que el uso desns
osqs
podría introducir cierta latencia.Respecto al error que está teniendo con su función de Lambda, el error
Task timed out after 3.00 seconds
indica que la función está tardando más de su límite de tiempo de espera especificado para ejecutarse. Puede aumentar el límite de tiempo de espera de la función a un valor más alto para permitir que complete el procesamiento previsto. Además, también puede verificar los permisos IAM para su función de Lambda y asegurarse de que tenga acceso suficiente para ejecutar los comandos e interactuar cons3
yec2
.Con respecto al segundo problema que está enfrentando, donde no ve ninguna salida o cambio en la instancia de
ec2
, debería verificar los registros de CloudWatch de su función de Lambda y los registros dessm
de su instancia deec2
para ver si hay errores o problemas. También puede intentar ejecutar el comandoaws s3 cp
manualmente en su instancia deec2
para ver si funciona como se espera.