如何不通过Airflow Admin->Connections UI配置访问AWS S3存储桶
Apache Airflow 完全支持不通过 Admin->Connections 的Web UI界面录入连接配置,即可访问AWS S3存储桶的需求,不存在强制依赖UI配置连接的限制。
代码内直接传入认证参数
Airflow 所有AWS相关的Hook、算子都支持直接传入认证参数初始化,无需依赖提前存储在Airflow元数据库中的连接条目。示例代码如下:from airflow.providers.amazon.aws.hooks.s3 import S3Hook # 初始化时直接传入认证信息,不读取元数据库内的连接配置 s3_hook = S3Hook( aws_conn_id=None, region_name="你的S3所在区域,比如us-east-1", aws_access_key_id="你的AWS访问密钥ID", aws_secret_access_key="你的AWS秘密访问密钥", # 使用临时凭证时额外传入aws_session_token参数即可 ) # 直接调用Hook方法操作S3,比如列举桶内对象、上传下载文件等 bucket_files = s3_hook.list_keys(bucket_name="你的目标存储桶名")如果使用S3ListOperator、S3CopyObjectOperator等S3相关算子,也可以直接在算子初始化时传入上述认证参数,不需要绑定提前配置的连接ID。
通过环境变量注入连接配置
Airflow原生支持从环境变量加载连接配置,全程不需要登录UI操作。环境变量命名规则为AIRFLOW_CONN_{连接ID全大写},值为Airflow标准连接URI格式。
比如你计划给S3连接设置ID为s3_prod,只需要在Airflow的scheduler、worker、webserver所有服务的运行环境中添加如下环境变量:# URI格式:aws://AK:SK@?region_name=S3区域 export AIRFLOW_CONN_S3_PROD='aws://你的AK:你的SK@?region_name=us-east-1'配置完成后,代码里正常传入该连接ID即可使用:
S3Hook(aws_conn_id="s3_prod"),Airflow会自动读取环境变量中的连接配置,不会要求你在UI中提前录入。如果使用临时凭证,只需要在URI的查询参数中追加aws_session_token=你的临时token即可。依托AWS默认认证链自动获取权限
如果你的Airflow服务本身运行在AWS资源上(比如EC2、ECS、EKS、Lambda),已经给对应资源绑定了拥有S3访问权限的IAM角色;或者你已经在Airflow运行环境中配置了~/.aws/credentials凭证文件、AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY系统级环境变量,那么你甚至不需要手动传入任何AK/SK信息,Airflow的AWS Provider会自动走boto3的默认凭证链拉取权限,直接初始化S3客户端即可:# 不需要传入任何凭证参数,自动从运行环境获取权限 s3_hook = S3Hook(region_name="us-east-1")
生产环境优先选择IAM角色绑定的默认认证链或者环境变量注入的方式,不建议把AK/SK硬编码在DAG代码中,避免凭证泄露。
内容的提问来源于stack exchange,提问作者Nikitha Singh

