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

时间:2017-10-16 12:21:46

标签: amazon-web-services jdbc amazon-s3 aws-glue

我在这里阅读了所有已回答的问题,其中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 角色:粘贴可信服务, AWSGlueServiceRole 用于AWS托管策略在文档中。

我想知道我缺少什么或如何修复它以使其工作。或者即使有更好的方法来实现我的目标。

1 个答案:

答案 0 :(得分:7)

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

1 - 使用" Amazon RDS"创建连接。选项;

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

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

回读documentation我可以看到我做错了什么,实际上我试图设置一个中途安全组来保护我的数据库。但正如文件所说,我需要提供所有TCP"权限进入我的数据库安全组,所以我确实重置了它,执行以下步骤:

  1. 在Amazon RDS左侧导航窗格中,选择Instances。
  2. 选择您要从AWS Glue访问的Amazon RDS引擎和数据库实例名称。
  3. 从“实例操作”中,选择“查看详细信息”。在“详细信息”选项卡上,找到您将从AWS Glue访问的安全组名称。记录安全组的名称以供将来参考。
  4. 选择安全组以打开Amazon EC2控制台。
  5. 确认已选择Amazon RDS中的组ID,然后选择“入站”选项卡。
  6. 添加自引用规则以允许AWS Glue组件进行通信。具体来说,添加或确认存在Type All TCP规则,Protocol为TCP,Port Range包括所有端口,其Source与组ID的安全组名称相同。 RDS Inbound

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

  8. 完成所有这些步骤后,两个连接都正常工作。

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

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

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

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

    所以我创建了一个新连接。使用此新连接创建了一个新作业。它起作用了。

    结论,您不能为数据库和实例使用相同的名称。他们需要有不同的名字。

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

    • 连接上使用的用户名需要"创建表"权限。

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

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