Отключить ParameterValidation в MWAA Airflow

В MWAA я использую следующий код для доступа к файлам в моей корзине S3. Ковш S3 имеет следующую форму:

aws s3 ls s3://example-bucket/incoming/driver-events/ingestDate=2021-05-26/

Приведенная выше команда работает нормально. Теперь я пытаюсь получить ту же информацию из S3_hook.S3Hook() вызова от Airflow. У меня есть следующий код:

bucket='s3://example-bucket/incoming/driver-events/ingestDate=2021-05-26/'
s3_handle = S3_hook.S3Hook(aws_conn_id='s3_default')
        key_list = s3_handle.list_keys(bucket_name=bucket)
        print(f"{len(key_list)} keys found in bucket")
        for keys in key_list:
            logging.info(keys)

Это приводит к ошибке от boto3:

botocore.exceptions.ParamValidationError: Parameter validation failed:
Invalid bucket name "s3://example-bucket/incoming/driver-events/ingestDate=2021-05-26/": Bucket name must match the regex "^[a-zA-Z0-9.\-_]{1,255}$" or be an ARN matching the regex "^arn:(aws).*:s3:[a-z\-0-9]+:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\-]{1,63}$|^arn:(aws).*:s3-outposts:[a-z\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\-]{1,63}$"

Я могу понять, что ошибка возникает, потому что boto3 пытается выполнить проверку некоторых параметров, а регулярное выражение слишком ограничивающее.

Как мне справиться с этим случаем в Airflow? Можно ли как-нибудь отключить проверку параметров? Я вижу, что можно установить «parameter_validation» на False в boto3 с помощью некоторых настроек конфигурации, но как мне это сделать при использовании S3Hook() в Airflow, который уже настроен по умолчанию и не может принять конфигурацию boto3? И еще сложнее то, что я должен делать это на MWAA, что не дает вам никакого контроля над папкой ~/.boto/.


person AnupamB    schedule 26.05.2021    source источник


Ответы (1)


Проблема в том, что ведро должно быть только example-bucket, а путь должен быть prefix, предоставленным вызову функции для вывода списка объектов. S3 не хранит данные в виде папок и файлов, вместо этого все они представляют собой пары ключ-значение. Таким образом, ключ представляет собой полную структуру каталогов пути.

Блок кода, который работает, выглядит следующим образом:

bucket_prefix = 'incoming/driver-events/ingestDate=2021-05-26/'
client = boto3.client('s3', 
        aws_access_key_id=Variable.get("AWS_ACCESS_KEY_ID"), 
        aws_secret_access_key=Variable.get("AWS_SECRET_ACCESS_KEY"))
        response = client.list_objects_v2(
            Bucket='example-bucket',
            Delimiter='/',
            Prefix=bucket_prefix,
            MaxKeys=1000,
        )
        print(response)
        contents = response["Contents"]  # These are the files
        common_prefixes = response["CommonPrefixes"] # These are the folders

person AnupamB    schedule 27.05.2021