能否修改GCP Cloud Composer环境配置?SQL Server连接问题求助
解决Cloud Composer连接SQL Server 2012的SSL协议不支持问题
问题背景
连接SQL Server 2012时触发如下错误:
pyodbc.OperationalError: ('08001', '[08001] [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol] (-1) (SQLDriverConnect)')
原因是SQL Server 2012仅支持旧版SSL/TLS协议(如TLS 1.0、TLS 1.1),而ODBC Driver 17默认禁用了这些协议,需要调整SSL配置以兼容。手动修改容器配置无法应对Cloud Composer自动扩缩容,需采用全局配置方案。
可行配置方案
方案1:通过Cloud Composer环境变量全局配置
在Cloud Composer环境中添加以下环境变量,强制启用旧版SSL/TLS协议:
- 变量名:
OPENSSL_ALLOW_PROTOCOLS,值:TLSv1,TLSv1.1,TLSv1.2 - 变量名:
SSL_CIPHERS,值:DEFAULT@SECLEVEL=1
配置步骤:
- 打开GCP控制台,进入Cloud Composer环境详情页
- 点击环境变量标签页
- 点击添加变量,分别添加上述两个环境变量
- 保存后,Cloud Composer会自动重启所有Worker和Web服务器,配置全局生效
方案2:使用自定义Pod模板挂载修改后的openssl.cnf
如果环境变量方案不生效,可通过自定义Pod模板挂载调整后的openssl配置文件:
- 准备修改后的
openssl.cnf,在[system_default_sect]段添加:MinProtocol = TLSv1 CipherString = DEFAULT@SECLEVEL=1 - 将文件上传到GCS存储桶(如
gs://your-composer-bucket/config/openssl.cnf) - 创建自定义Pod模板yaml文件,添加卷挂载配置:
apiVersion: v1 kind: Pod metadata: labels: component: worker tier: airflow spec: containers: - args: [] command: [] env: [] image: '' name: airflow-worker volumeMounts: - mountPath: /etc/ssl/openssl.cnf name: openssl-config subPath: openssl.cnf volumes: - name: openssl-config configMap: name: openssl-config - 通过GCP命令行创建ConfigMap:
kubectl create configmap openssl-config --from-file=openssl.cnf=gs://your-composer-bucket/config/openssl.cnf - 在Cloud Composer环境中配置自定义Pod模板:
- 进入环境详情页,点击编辑
- 在工作负载配置下的Pod模板中,选择刚才创建的模板文件
- 保存并等待环境更新完成
方案3:在Airflow任务中临时设置环境变量
如果仅需特定任务兼容,可在DAG中为任务设置环境变量:
from airflow import DAG from airflow.operators.python import PythonOperator from datetime import datetime import os import pyodbc def connect_sql_server(): # 临时设置SSL相关环境变量 os.environ['OPENSSL_ALLOW_PROTOCOLS'] = 'TLSv1,TLSv1.1,TLSv1.2' os.environ['SSL_CIPHERS'] = 'DEFAULT@SECLEVEL=1' # 建立连接 conn = pyodbc.connect( 'DRIVER={ODBC Driver 17 for SQL Server};' 'SERVER=your-sql-server;' 'DATABASE=your-db;' 'UID=user;' 'PWD=password' ) # 执行操作 cursor = conn.cursor() cursor.execute('SELECT 1') result = cursor.fetchone() print(result) conn.close() with DAG('sql_server_connection', schedule_interval=None, start_date=datetime(2023, 1, 1)) as dag: task = PythonOperator( task_id='connect_sql_server', python_callable=connect_sql_server )
内容的提问来源于stack exchange,提问作者JadenJelu
相关产品推荐
相关产品推荐

