如何配置AWS Glue通过pyodata API及已有VPC访问SAP数据?
配置AWS Glue通过VPC访问SAP OData服务的步骤
1. 绑定Glue作业到目标VPC
- 创建或编辑Glue作业时,在网络配置模块选择已通过TGW与SAP连通的VPC。
- 分配该VPC下的私有子网(避免公有子网,确保流量走私有链路)。
- 配置安全组:允许Glue作业的安全组出站访问SAP OData服务的端口(通常是HTTPS 443或SAP自定义HTTP端口),同时确保SAP侧安全组允许该Glue安全组的入站请求。
2. 配置私有DNS解析(按需操作)
如果SAP服务使用私有域名:
- 确保VPC的Route 53私有托管区已配置对应域名的解析记录,或VPC的DNS服务器能解析SAP服务的私有IP。
- 若需指定自定义DNS,可在Glue作业的附加参数中添加:
--conf spark.driver.extraJavaOptions=-Ddns.server=<SAP_DNS_SERVER_IP> --conf spark.executor.extraJavaOptions=-Ddns.server=<SAP_DNS_SERVER_IP>
3. 引入pyodata依赖库
AWS Glue默认环境不含pyodata,可通过两种方式添加:
- S3库包上传:将pyodata及其依赖(如requests、urllib3)打包为.zip文件,上传至S3存储桶,在Glue作业的Python库路径中指定该S3地址。
- 自定义镜像:基于Glue官方镜像安装pyodata后构建自定义镜像,上传至ECR,创建作业时选择该镜像。
4. 编写Glue作业代码调用OData API
示例代码片段:
import sys import pyodata import requests from awsglue.utils import getResolvedOptions # 解析作业传入参数 args = getResolvedOptions(sys.argv, ['SAP_ODATA_URL', 'SAP_USER', 'SAP_PASSWORD']) # 配置请求会话,适配私有网络访问 session = requests.Session() session.auth = (args['SAP_USER'], args['SAP_PASSWORD']) # 若SAP使用自签名证书,生产环境建议导入可信证书,临时测试可禁用验证 # session.verify = False # 初始化OData服务客户端 service = pyodata.Client(args['SAP_ODATA_URL'], session) # 获取实体集数据 entity_data = service.entity_sets['TargetEntitySet'].get_entities().execute() # 转换为Spark DataFrame用于后续处理 df = spark.createDataFrame([item._as_dict() for item in entity_data]) # 示例:将数据写入S3 df.write.parquet('s3://your-bucket/output-path/')
5. 网络连通性排障(按需操作)
若出现连接失败,可在作业中添加测试代码:
import socket def test_sap_connection(host, port): try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) conn_result = sock.connect_ex((host, port)) if conn_result == 0: print(f"成功连接到 {host}:{port}") else: print(f"连接失败,错误码: {conn_result}") sock.close() except Exception as e: print(f"连接异常: {str(e)}") # 替换为SAP服务的私有IP和端口 test_sap_connection('sap-private-ip', 443)
内容的提问来源于stack exchange,提问作者Sam Richardson
相关产品推荐
相关产品推荐

