AWS Glue作业连接SAP OData时自定义SSL证书信任失败问题咨询
问题背景
我最近在运行AWS Glue作业连接SAP OData服务时遇到了SSL证书信任问题,具体情况如下:
作业代码片段
# 我运行的Glue作业代码片段 connection_type="sapodata", connection_options={ "ENABLE_CDC": "false", "connectionName": "sapodata-connection", "SELECTED_FIELDS": "MANDT,MATNR,VKORG,VTWEG,VMSTA,VMSTD,PRODH,MVGR1,MVGR2,MVGR3,MVGR4,MVGR5,ERDAT,AEDAT,DLTDT", "ENTITY_NAME": "/sap/opu/odata/sap/ZBI_WAREHOUSE_SRV/MVKESet", "FILTER_PREDICATE": f"{field_name_delta_1} >= '{delta_date}'", "JdbcEnforceSsl": "true", "CustomJdbcCert": f"s3://{s3_bucket}/cert/{cert}" }, transformation_ctx="sap_data"
报错信息
作业执行时触发以下SSL证书错误:
An error occurred while calling o106.getSource. Glue connector returned client exception. Please retry after some time, request failed with HTTP IO exception with the following message: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
已尝试的操作与观察
- 在AWS Glue控制台对
sapodata-connection执行“测试连接”时,完全正常,没有任何SSL相关报错 - 已经在连接配置中明确设置了:
"JdbcEnforceSsl": "true""CustomJdbcCert": f"s3://{s3_bucket}/cert/{cert}"
我的问题
为什么测试连接能成功,但Glue作业却抛出PKIX路径构建失败的错误?我是否需要额外配置才能让Glue作业信任SAP OData的自定义SSL证书?
分析与解决方案
这个问题的核心是AWS Glue控制台的测试连接环境与作业运行环境存在本质差异,我整理了几个最可能的原因和对应的解决方法:
1. 作业IAM角色缺少S3证书读取权限
Glue控制台的“测试连接”使用的是AWS Glue服务的内置权限集合,而你的Glue作业是用专属的IAM角色运行的。如果这个作业角色没有读取S3证书文件的权限,就会导致证书无法加载,进而触发SSL信任错误。
验证与修复:
- 打开IAM控制台,找到你的Glue作业所使用的IAM角色
- 检查该角色是否包含
s3:GetObject权限,目标资源为证书所在的S3路径(s3://{s3_bucket}/cert/{cert}) - 如果没有,添加如下权限策略片段:
{ "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-s3-bucket-name/cert/your-cert-file.pem" }
2. 证书路径的变量替换未生效
你在代码中用f-string动态生成了证书路径,但如果作业运行时s3_bucket或cert这两个变量没有被正确赋值(比如变量未定义、拼写错误),就会生成无效的S3路径,导致证书加载失败。
验证与修复:
- 在作业代码开头添加日志,打印最终的证书路径,确认是否正确:
import logging logger = logging.getLogger() logger.setLevel(logging.INFO) custom_cert_path = f"s3://{s3_bucket}/cert/{cert}" logger.info(f"CustomJdbcCert path being used: {custom_cert_path}") - 确保
s3_bucket和cert变量在作业代码的上下文里已经被正确定义(比如从作业参数传入,或在代码中显式赋值)
3. 连接器不支持直接读取S3路径的证书
部分SAP OData Glue连接器可能不支持直接使用S3路径作为证书参数——测试连接时Glue控制台会自动处理S3证书的下载与加载,但作业运行环境不会做这个自动处理。
修复方案:
在作业代码开头添加逻辑,将S3上的证书下载到Glue作业的临时目录(比如/tmp/),然后在连接配置中指定本地路径:
import boto3 import os # 初始化S3客户端 s3 = boto3.client('s3') # 定义证书本地存储路径 local_cert_path = '/tmp/sap-cert.pem' # 从S3下载证书到本地 s3.download_file(s3_bucket, f"cert/{cert}", local_cert_path) # 后续连接配置中修改为本地路径 connection_options={ # ... 其他原有配置 ... "CustomJdbcCert": local_cert_path }
4. 证书格式不符合要求
如果你的证书是DER二进制格式,而JDBC连接器要求PEM文本格式,也会导致证书无法被识别。测试连接可能自动完成了格式转换,但作业环境不会。
验证与修复:
- 检查证书格式:如果是DER格式,使用OpenSSL转换为PEM格式:
openssl x509 -in your-cert.der -out your-cert.pem -inform der -outform pem - 将转换后的PEM格式证书重新上传到S3,再在作业中使用
5. Glue作业版本的环境差异
不同版本的Glue作业(比如1.0、2.0、3.0)使用的JDK版本、JDBC驱动版本不同,证书加载的逻辑也可能有差异。比如Glue 1.0用Java 8,Glue 3.0用Java 11,信任库的路径和加载方式有区别。
修复方案:
- 尝试切换Glue作业的版本(比如从1.0升级到3.0),看是否能解决问题
- 或者在作业中手动将证书添加到Java信任库中(适合允许运行shell脚本的作业),示例代码:
import subprocess # 将证书添加到Java信任库 subprocess.run([ "keytool", "-importcert", "-file", local_cert_path, "-keystore", "/usr/lib/jvm/java-1.8.0/jre/lib/security/cacerts", "-storepass", "changeit", "-noprompt", "-alias", "sap-cert" ])
内容来源于stack exchange

