首页 文章

创建与MS SQL Server RDS的Glue连接的问题

提问于
浏览
3

我在这里阅读了所有已回答的问题,其中5个 . 所有这些都是关于可用的AWS产品现已过时的 .

因此,作为AWS的新手,我想知道如何解决我的问题,或者仅使用AWS解决方案解决问题的最佳方法是什么 . 我想避开任何第三方 . 我知道我会引用我用Google搜索的一种方法,但只是引用它 .

无论如何,我有一个目标要实现,这基本上取代了我的SQL Server 2012集成服务,只使用AWS产品 . 现在我正在访问FTP服务器并将一堆CSV文件下载到我的驱动器,读取它们,将它们转换为我的数据集并将它们加载到我指定的表中 . 此过程计划每天执行3次 .

我最初的提议是将文件上传到S3,使用AWS Glue Crawlers抓取我的文件并填充我自己创建的AWS Glue数据目录,将它们ETL添加到我的RDS . 到目前为止,我可以实现我的Lambda函数连接我的FTP并上传到我的S3,我也可以使用AWS Athena检索我的数据,只是为了看看是否一切正常 .

但现在,我正努力让我的ETL复制/创建我的表到RDS并写入数据 . 我在相同的RDS VPC,子网和安全组下创建了My Glue Connection,我的安全组也有来自任何地方的All TCP(我知道,我不会离开它,它只是用于测试)而且我使用的是JDBC,编写以下JDBC URL:

jdbc:sqlserver://my-database-name.xsdfxsdsfsfsx.us-east-1.rds.amazonaws.com:1433;databaseName=my-database-name

我可以使用AWS Glue中的“Test Connection”来测试我创建的连接,它运行正常 . 但是在使用Job教程创建我的Job并运行它之后,在我的日志错误中我可以看到:

com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.conn.HttpHostConnectException: Connect to 167.254.77.1:8088 [/167.254.77.1] failed: Connection refused (Connection refused)

我尝试使用Amazon RDS选项创建连接,但在选择实例后的第二个屏幕上,我收到以下错误:

Unable to find a suitable security group. Change connection type to JDBC and retry adding your connection.

我检查了我的IAM,并且我确实在AWS服务中拥有AWSGlueServiceRoleDefault角色:粘贴可信赖的服务和用于AWS托管策略的AWSGlueServiceRole,如文档中所述 .

我想知道我错过了什么,或者如何修复它以使其工作 . 或者即使有更好的方法来实现我的目标 .

1 回答

  • 6

    好吧,我只有两个问题需要解决 . 我将展示我是如何解决这两个问题的 .

    1 - 使用“Amazon RDS”选项创建连接;

    我的JDBC连接工作正常,因为我明确指定了我想要使用的安全组,我称之为“sg-glue”,并且我的入站数据库安全组中允许使用这个“sg-glue”安全组,也是我的“ sg-glue“拥有”所有TCP“从允许入站的任何地方 .

    因此,当我尝试使用“Amazon RDS”创建连接时,我没有及时注意到这只是创建相同JDBC连接的简单方法,但您无法选择指定所需的安全组使用 . 通过这种方式将相同的数据库安全组应用于此连接,这就是我看到安全组错误的原因,因为我的数据库安全组没有允许“所有TCP” .

    回读documentation我可以看到我做错了什么,事实上我试图设置一个中途安全组来保护我的数据库 . 但正如文档说我需要将"All TCP"权限授予我的数据库安全组,所以我确实重置了它,执行以下步骤:

    • 在Amazon RDS左侧导航窗格中,选择Instances .

    • 选择要从AWS Glue访问的Amazon RDS Engine和数据库实例名称 .

    • 从“实例操作”中,选择“查看详细信息” . 在“详细信息”选项卡上,找到您将从AWS Glue访问的安全组名称 . 记录安全组的名称以供将来参考 .

    • 选择安全组以打开Amazon EC2控制台 .

    • 确认已选择Amazon RDS中的组ID,然后选择“入站”选项卡 .

    • 添加自引用规则以允许AWS Glue组件进行通信 . 具体来说,添加或确认存在Type All TCP规则,Protocol为TCP,Port Range包括所有端口,其Source与组ID的安全组名称相同 .
      RDS Inbound

    • 也为出站流量添加规则 . 打开所有端口的出站流量或创建Type All TCP的自引用规则,Protocol is TCP,Port Range包括所有端口,其Source与组ID的安全组名称相同 .
      enter image description here

    经过所有这些步骤,两者都有连接工作正常 .

    2 - 使用我创建的连接允许我将数据ETL到我的RDS;

    因此,我的连接成功运行,我试图让我的工作连接到我的RDS并创建我的表并写上ti . 但我不能,我收到一个错误:

    Py4JJavaError: An error occurred while calling o74.pyWriteDynamicFrame. java.lang.NullPointerException
    

    我不知道为什么 . 我尝试了一切,而不是我称之为AWS Support . 为了我的好运,我有一个HERO作为支持,称为Li H.这个女孩工作了很多,每个角落去找发生的事情,问亚马逊的每个人,工作4天后,同时我们分享了我的屏幕,创建了很多次新环境来找到这个问题的原因,因为VPC,SG,DNS,当我们无望时,她的头上有一个灯泡,并要求将我的数据库名称更改为“测试”......

    所以我创建了一个新连接 . 使用此新连接创建了一个新作业 . 它奏效了 .

    结论,数据库和实例不能具有相同的名称 . 他们需要有不同的名字 .

    公共tnx特别对这个女孩,李H.非常高兴有这么好的专业支持 . 也:

    连接上使用的

    • 用户名需要具有“创建表”权限 .

    • 如果您的作业写入Microsoft SQL Server表,并且该表的列定义为布尔类型,则必须在SQL Server数据库中预定义该表 .

    • 您的IAM角色需要附加AWS Glue政策

相关问题