SSL适用于带胶Python Job和AWS SDK的RDS
#aws #python #glue #etl

此博客文章是最近与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数据库创建了连接。

这是通过控制台中的传统胶水连接屏幕完成的,因为这允许我们测试连接。

Glue Connection

您可以看到运行测试工作。

Glue Connection Test OK

问题

接下来,我们尝试在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的错误。试图调试代码的不同版本时,我遇到了几个不同的错误。

SSL Error

SSL Error

在来回加入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证书再次运行工作,我们将获得成功的执行。

Job Run Ok

Jon Run Logs