如何在AWS Lambda中使用cx_Oracle通过SSL认证连接Oracle(证书存于S3)
在AWS Lambda中使用cx_Oracle通过SSL连接Oracle(证书存储于S3)
核心操作步骤
1. 从S3下载证书到Lambda临时目录
Lambda仅允许写入/tmp目录,因此首先需要将S3中的证书文件(如根证书rootCA.pem、客户端证书client-cert.pem、客户端密钥client-key.pem)下载到该路径。需确保Lambda执行角色拥有目标S3桶的对象读取权限。
示例代码:
import boto3 import os s3 = boto3.client('s3') bucket_name = '你的证书存储桶名称' cert_mapping = { 's3中的根证书路径': '/tmp/rootCA.pem', 's3中的客户端证书路径': '/tmp/client-cert.pem', 's3中的客户端密钥路径': '/tmp/client-key.pem' } for s3_key, local_path in cert_mapping.items(): s3.download_file(bucket_name, s3_key, local_path)
2. 配置cx_Oracle的SSL连接
cx_Oracle支持两种SSL配置方式,可根据习惯选择:
方式一:使用关键字参数连接(推荐)
import cx_Oracle # 数据库基础信息 db_user = '你的数据库用户名' db_password = '你的数据库密码' db_host = 'Oracle数据库主机地址' db_port = 1521 # 或自定义TCPS端口 db_service = '数据库服务名' # SSL参数配置 ssl_options = { 'ssl_ca': '/tmp/rootCA.pem', 'ssl_cert': '/tmp/client-cert.pem', 'ssl_key': '/tmp/client-key.pem', 'ssl_server_cert_dn': '' # 若需验证服务器DN则填写对应值,否则留空 } # 建立连接 conn = cx_Oracle.connect( user=db_user, password=db_password, dsn=cx_Oracle.makedsn(db_host, db_port, service_name=db_service), **ssl_options )
方式二:在DSN连接字符串中嵌入SSL参数
import cx_Oracle db_user = '你的数据库用户名' db_password = '你的数据库密码' db_host = 'Oracle数据库主机地址' db_port = 1521 db_service = '数据库服务名' # 构造带SSL参数的DSN dsn = f"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST={db_host})(PORT={db_port}))(CONNECT_DATA=(SERVICE_NAME={db_service}))(SECURITY=(SSL_ROOT_CERTIFICATE='/tmp/rootCA.pem')(SSL_CERTIFICATE='/tmp/client-cert.pem')(SSL_PRIVATE_KEY='/tmp/client-key.pem')))" # 建立连接 conn = cx_Oracle.connect(db_user, db_password, dsn)
关键注意事项
- 权限配置:Lambda执行角色需添加S3只读权限(如
AmazonS3ReadOnlyAccess),同时Lambda所在VPC需允许访问Oracle数据库的TCPS端口。 - 证书权限:若下载后证书文件出现权限问题,可通过
os.chmod('/tmp/xxx.pem', 0o600)调整文件权限。 - 版本兼容:确保使用的cx_Oracle版本支持SSL配置,且与Lambda的Python运行时版本兼容。
内容的提问来源于stack exchange,提问作者Sneha Nadar
相关产品推荐
相关产品推荐

