Airflow S3ListOperator无法列出S3文件,请求排查原因
问题:Airflow S3ListOperator返回空数组但目标路径存在文件
代码片段
@task def list_outbound_file(): context = get_current_context() step_params = context['ti'].xcom_pull( task_ids='set_run_params', key='return_value') s3_root_dir = step_params['%s3_root_dir'] client_id = step_params['%client_id'] client_dataset_version = step_params['%client_dataset_version'] s3_file = S3ListOperator( task_id='list_outbound_file', bucket=bucket, prefix=f'{s3_root_dir}/outbound/client={client_id}/client_dataset_version={client_dataset_version}/', delimiter='/', aws_conn_id='aws_adaptive_retry_connection' ) return s3_file.execute(context)
任务日志
[2023-04-05, 13:52:20 UTC] {{s3.py:679}} INFO - Getting the list of files from bucket: paymentintegrity-chc-dev-dataplatform-us-east-1 in prefix: data/ecob/outbound/client=ecob_orxnv_wk-optumrx/client_dataset_version=2023-04-04-13-00-00-000000/ (Delimiter /) [2023-04-05, 13:52:20 UTC] {{base.py:68}} INFO - Using connection ID 'aws_adaptive_retry_connection' for task execution. [2023-04-05, 13:52:20 UTC] {{base_aws.py:100}} INFO - Retrieving region_name from Connection.extra_config['region_name'] [2023-04-05, 13:52:20 UTC] {{python.py:173}} INFO - Done. Returned value was: []
可能的原因及解决方法
- 前缀末尾斜杠与delimiter的组合问题:当前prefix末尾加了
/,同时设置delimiter='/',S3ListOperator只会返回该前缀下的子目录,不会返回文件。解决方法:要么去掉prefix末尾的/,要么删除delimiter参数,这样就能列出该前缀下的所有文件对象。 - AWS连接权限不足:检查
aws_adaptive_retry_connection对应的IAM角色是否拥有s3:ListBucket权限,且权限覆盖目标bucket及前缀路径。S3在权限不足时不会报错,只会返回空列表。 - 变量值存在隐藏字符:确认
step_params中的s3_root_dir、client_id、client_dataset_version是否包含空格、换行等不可见字符,导致生成的prefix与实际S3路径不匹配。可以在代码中添加打印语句输出生成的prefix,和实际路径对比验证。 - 文件处于归档状态:如果目标文件是Glacier等归档类存储,且未恢复到可读取状态,S3ListOperator无法列出这类对象,检查文件的存储状态是否正常。
- Airflow依赖包版本问题:部分旧版本的
apache-airflow-providers-amazon包中,S3ListOperator存在处理prefix或delimiter的bug,尝试升级到最新稳定版。
内容的提问来源于stack exchange,提问作者Craig Larson
相关产品推荐
相关产品推荐

