如何在Docker部署的Airflow中通过.env变量配置S3连接?
解决方案
方案1:直接在S3Hook实例化时传入环境变量中的凭证
- 操作逻辑:S3Hook原生支持初始化时传入
aws_access_key_id和aws_secret_access_key参数,直接读取操作系统环境变量传入即可,无需提前在UI配置连接 - 修改后的代码示例:
import os import traceback import airflow from airflow import DAG from airflow.exceptions import AirflowFailException from airflow.operators.python import PythonOperator from airflow.providers.amazon.aws.hooks.s3 import S3Hook def _download_s3_data(templates_dict, **context): # 包含返回值列表 data = templates_dict.get("sagemaker_autopilot_data") if any([not paths for paths in data]): raise AirflowFailException("部分路径未传入!") else: ( sagemaker_training, sagemaker_testing, ) = data # 直接从环境变量读取凭证初始化S3Hook s3hook = S3Hook( aws_access_key_id=os.environ.get("AWS_ACCESS_KEY_ID"), aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY") ) # 解析s3 url bucket_name, key = s3hook.parse_s3_url(s3url=sagemaker_training) try: file_name = s3hook.download_file(key=key, bucket_name=bucket_name) except: traceback.print_exc() raise AirflowFailException("下载s3文件出错")
方案2:通过Airflow连接环境变量自动配置(无需修改DAG代码)
- 操作逻辑:Airflow支持通过格式为
AIRFLOW_CONN_<连接ID>的环境变量自动注册连接,无需在UI手动添加。你可以直接定义AWS默认连接的环境变量,S3Hook默认会读取aws_default连接的凭证 - 配置方法:
- 在你的.env文件中添加如下变量(会自动读取你已经配置的AWS密钥):
AIRFLOW_CONN_AWS_DEFAULT=aws://${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}@- 在docker-compose.yml中确认该环境变量已经传递给Airflow的scheduler、worker服务,重启服务后生效
- 原有DAG代码无需修改,
S3Hook()默认会自动读取该连接的凭证
注意事项
- 两种方案都需要确保你在.env中配置的
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY已经正确传递到Airflow运行的容器中,可通过在DAG中打印os.environ验证环境变量是否生效 - 如果需要对接非AWS的S3兼容服务(比如MinIO、LocalStack),还可以在S3Hook初始化时额外传入
endpoint_url参数指定服务地址
内容的提问来源于stack exchange,提问作者yudhiesh
相关产品推荐
相关产品推荐

