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.

No se pueden encontrar las credenciales al configurar la conexión de Airflow a través de variables de entorno.

Entonces estoy tratando de configurar un S3Hook en mi dag de Airflow, configurando la conexión programáticamente en mi script, de esta manera

from airflow.hooks.S3_hook import S3Hook
from airflow.models import Connection
from airflow import settings

def s3_test_hook():

    conn = Connection(
        conn_id='aws-s3',
        conn_type='s3',
        extra={"aws_access_key_id":aws_key, 
                "aws_secret_access_key": aws_secret},
        )

Puedo ejecutar la línea conn sin problema, lo cual me indica que la conexión se puede establecer. aws_key y aws_secret se cargan mediante dotenv con un archivo .env que tengo en mi directorio local.

Sin embargo, cuando ejecuto las siguientes dos líneas en la función:

    s3_hook = S3Hook(aws_conn_id='aws-s3')
    find_bucket = s3_hook.check_for_bucket('nba-data')

para verificar si existe un bucket que sé que está ahí, obtengo el siguiente error:

NoCredentialsError: Unable to locate credentials

¿Alguna idea de cómo abordar esto?

¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el S3Hook no puede acceder correctamente a las credenciales. Una forma de abordar esto es crear un perfil separado de AWS con credenciales y especificar el nombre del perfil en el campo extra del objeto Connection. Aquí tienes un ejemplo:

    def s3_test_hook():
        conn = Connection(
            conn_id='aws-s3',
            conn_type='s3',
            extra={"aws_profile": "mi_perfil_aws"},
        )
        s3_hook = S3Hook(aws_conn_id='aws-s3')
        find_bucket = s3_hook.check_for_bucket('nba-data')
    

    Asegúrate de que mi_perfil_aws tenga claves de acceso y secretas válidas, así como los permisos necesarios para acceder al bucket de S3.

    Alternativamente, puedes intentar establecer las variables de entorno AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY directamente en tu script antes de crear el S3Hook. Aquí tienes un ejemplo:

    import os
    
    def s3_test_hook():
        os.environ['AWS_ACCESS_KEY_ID'] = aws_key
        os.environ['AWS_SECRET_ACCESS_KEY'] = aws_secret
        s3_hook = S3Hook(aws_conn_id='aws-s3')
        find_bucket = s3_hook.check_for_bucket('nba-data')
    

    Nuevamente, asegúrate de que aws_key y aws_secret tengan valores válidos.

Comments are closed.