此博客文章是最近与AWS支持的互动的结果。与往常一样,他们在解决这个问题方面非常有帮助。
aws sdk for pandas
最近,AWS重命名为AWS Data Wrangler Python Library到AWS SDK for Pandas。这是AWS专业服务开源Python倡议,它将PANDAS库的功能扩展到连接数据范围和AWS数据相关服务的AWS。
建立在其他开源项目之上,例如熊猫,apache箭头和boto3,它提供了抽象的功能来执行常规的ETL任务,例如从数据湖泊,数据仓库和数据库中执行加载/卸载数据。
我希望将集成与AWS胶水使用在某些Python ETL代码中使用胶水连接。在我的情况下,连接是到Amazon RDS PostgreSQL数据库。
例如:
import sys
import awswrangler as wr
import pandas as pd
con_postgresql = wr.postgresql.connect(connection="My-RDS-PostgreSQL-Connection")
con_postgresql.close()
理论是可以用胶水定义连接,并由多个AWS胶水ETL
使用亚马逊RDS准备就绪 - 加密要求
Amazon Relational Database Service (RDS) Ready Program的目的是识别支持使用Amazon RDS数据库作为客户AWS帐户中部署或作为APN合作伙伴AWS AWS帐户中部署的SaaS提供的业务应用程序的后端的AWS合作伙伴产品。
此程序要求产品遵循AWS安全性,可用性,可靠性,性能和其他架构最佳实践,同时与Amazon RDS集成。
在CDL上,我们的软件已被认可为Amazon RDS,我们在开发新解决方案时应用了这些标准。专门针对数据加密Amazon RDS Ready状态:
dbConn -004-数据加密:
对于数据加密是安全合规性要求的业务应用程序,该产品必须支持静止和运输中的数据加密。
在CDL处,我们确保通过设置RDS.FORCE_SSL参数将数据加密到运输中。
尝试从胶水到RD的SSL连接
与具有RDS.FORCE_SSL SET的RDS数据库创建了连接。
这是通过控制台中的传统胶水连接屏幕完成的,因为这允许我们测试连接。
您可以看到运行测试工作。
问题
接下来,我们尝试在AWS胶水python中使用该连接,利用aws sdk for pandas。
import sys
import awswrangler as wr
import pandas as pd
con_postgresql = wr.postgresql.connect(connection="My-RDS-PostgreSQL-Connection")
con_postgresql.close()
运行该作业将返回有关SSL的错误。试图调试代码的不同版本时,我遇到了几个不同的错误。
在来回加入AWS支持后,试图调试问题团队确定以下内容。
当前,Awswrangler加载并使用默认的SSL配置来创建Boto3会话客户端。
从我们收到的错误中可以明显看出,此默认值不包括Amazon RD RootCa。
要覆盖默认配置,可以在Awswrangler中使用Connect()函数,允许通过SSL上下文。
我们需要下载RDS根证书并指向它。
import sys
import awswrangler as wr
import pandas as pd
import ssl
import os
import urllib.request
def download_rds_root_ca(filename: str):
print("Downloading RDS CA root cert…")
urllib.request.urlretrieve('https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem', filename=filename)
print("Downloaded RDS CA root cert.")
def create_rds_ssl_context():
cafile = '/tmp/rds-ca-2019-root.pem'
download_rds_root_ca(cafile)
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS);
ssl_context.verify_mode = ssl.CERT_REQUIRED;
ssl_context.load_verify_locations(cafile=cafile, capath=None, cadata=None)
return ssl_context
print("Connecting to RDS database…")
rds_ssl_context = create_rds_ssl_context()
con_postgresql = wr.postgresql.connect(connection="My-RDS-PostgreSQL-Connection", ssl_context=rds_ssl_context)
print("Successfully connected to RDS database.")
与SSL一起运行
使用正确的SSL证书再次运行工作,我们将获得成功的执行。