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.

Consultas de Athena, Lambda y SNS.

He creado un conjunto de métricas personalizadas que analizo utilizando una consulta de Athena, sin embargo, estoy tratando de automatizar el proceso y puedo ejecutar de forma segura la consulta utilizando una función de Lambda, pero necesito que el resultado de esa consulta se envíe a través de un tema de SNS para no tener que iniciar sesión manualmente en AWS para ver los resultados diariamente. Soy bastante nuevo en esto y necesito ayuda sobre cómo implementarlo, por favor.

Esta es la consulta que estoy ejecutando utilizando una función de lambda, se activa por un evento (programado en EventBridge). Lo que hace es obtener la utilización de disco de mis instancias, “custom_diskutilization” es una tabla con una columna llamada use%. Me gustaría ejecutar la consulta para obtener los resultados de use% > 70 y enviarlos a un tema de SNS.

Lambda Function: enlace

Resultado de la consulta cuando la ejecuto directamente en Athena: enlace

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para automatizar el proceso de enviar los resultados de la consulta a un tema de SNS, puede modificar su función de Lambda para incluir los siguientes pasos:

    1. Ejecute la consulta de Athena para obtener los resultados de use% > 70.
    2. Analice los resultados para extraer la información relevante (por ejemplo, ID de instancia, use%).
    3. Cree una carga útil de mensaje utilizando la información extraída.
    4. Publique la carga útil en un tema de SNS.

    Aquí hay un código de ejemplo para la función de Lambda:

    import boto3
    import json
    
    # Configure los clientes de Athena y SNS
    athena = boto3.client('athena')
    sns = boto3.client('sns')
    
    # Defina la consulta de Athena
    query = "SELECT instance_id, use% FROM custom_diskutilization WHERE use% > 70"
    
    def lambda_handler(event, context):
        # Ejecute la consulta de Athena
        response = athena.start_query_execution(
            QueryString=query,
            QueryExecutionContext={
                'Database': 'mi_base_de_datos'
            },
            ResultConfiguration={
                'OutputLocation': 's3://mi-bucket/resultados-athena/',
            }
        )
        query_execution_id = response['QueryExecutionId']
    
        # Espere a que se complete la consulta
        query_result = None
        while query_result == None or query_result['QueryExecution']['Status']['State'] == 'RUNNING':
            query_result = athena.get_query_execution(QueryExecutionId=query_execution_id)
    
        # Analice los resultados de la consulta
        results = athena.get_query_results(QueryExecutionId=query_execution_id)
        for row in results['ResultSet']['Rows']:
            instance_id = row['Data'][0]['VarCharValue']
            use_percent = row['Data'][1]['VarCharValue']
    
            # Formatee la carga útil del mensaje
            message = {
                'instance_id': instance_id,
                'use_percent': use_percent
            }
            message_json = json.dumps(message)
    
            # Publique el mensaje en el tema de SNS
            sns.publish(
                TopicArn='arn:aws:sns:us-east-1:123456789012:mi-tema',
                Message=message_json,
            )
    

    En este ejemplo, la función de Lambda primero ejecuta la consulta de Athena para obtener los resultados de use% > 70. Luego analiza los resultados y crea una carga útil de mensaje utilizando la información extraída. Por último, publica la carga útil en un tema de SNS.

    Tenga en cuenta que deberá reemplazar los marcadores de posición (por ejemplo, mi_base_de_datos, mi-bucket, 123456789012, mi-tema) con sus valores reales. Además, asegúrese de que el rol de IAM asignado a su función de Lambda tenga los permisos necesarios para acceder a Athena y SNS.

Comments are closed.