es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para descargar archivos nuevos de un bucket de s3 a una instancia de ec2 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 de s3.

    Estos son los pasos a seguir:

    1. Cree una función AWS Lambda que se active cada vez que se cargue un archivo nuevo en el bucket de s3. Puede usar la biblioteca boto3 para descargar el archivo del bucket a la instancia de ec2.
    2. 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 de s3 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.

    3. Por último, asegúrese de que la instancia de ec2 tenga los permisos necesarios para acceder al bucket de s3 y de que la función Lambda tenga el rol IAM correcto asignado con acceso a s3 y ec2.

    Según su caso específico de uso, parece que recibirá nuevas imágenes png en el bucket de s3 cada pocos segundos o minutos, y desea descargarlas a la instancia de ec2 lo antes posible para el procesamiento de IA. En este caso, recomendaría usar AWS Lambda con un disparador de s3, ya que la función de Lambda se activará casi en tiempo real al subir un nuevo archivo, mientras que el uso de sns o sqs 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 con s3 y ec2.

    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 de ssm de su instancia de ec2 para ver si hay errores o problemas. También puede intentar ejecutar el comando aws s3 cp manualmente en su instancia de ec2 para ver si funciona como se espera.

Comments are closed.