6

我在这里阅读了所有已回答的问题,其中 5 个。而且它们现在都已经过时了可用的 AWS 产品。

因此,作为 AWS 的新手,我想知道如何解决我的问题,或者仅使用 AWS 解决方案来解决我的问题的最佳方法是什么。我想避免任何第三方。我知道我将引用我在谷歌上搜索的一种方法,但只是参考它。

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

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

但是现在,我正在努力将我的 ETL 复制/创建我的表到 RDS 并写入数据。我在同一个 RDS VPC、子网和安全组下创建了我的胶水连接,我的安全组也有来自任何地方的所有 TCP 入站(我知道,我不会离开这个,它只是为了测试)并且我正在使用 JDBC,编写以下 JDBC URL:

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

我可以使用 AWS Glue 中的“测试连接”来测试我创建的连接,并且效果很好。但是在使用 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

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

4

1 回答 1

12

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

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

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

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

回顾文档我可以看到我做错了什么,实际上我试图设置一个中间安全组来保护我的数据库。但正如documentaion所说,我需要将“All TCP”权限授予我的数据库安全组,所以我确实按照以下步骤重置了它:

  1. 在 Amazon RDS 左侧导航窗格中,选择实例。
  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为与Group ID相同的安全组名的规则。 RDS 入站

  7. 还为出站流量添加规则。要么打开所有端口的出站流量,要么创建Type All TCP,Protocol为TCP,Port Range包括所有端口,Source为与Group ID相同的安全组名称的自引用规则。 在此处输入图像描述

在所有这些步骤之后,两个连接都工作正常。

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

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

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

我不知道为什么。我尝试了一切,然后打电话给 AWS Support。为了我的好运气,我有这样一个英雄作为支持,叫李H。这个女孩工作了很多,走遍了每一个角落,寻找发生了什么,询问了亚马逊的每一个人,经过4天的工作,同时我们分享了我的屏幕,自从 VPC、SG、DNS 以来,创建了很多次新环境来查找这个问题的原因,当我们绝望时,她头上顶着一个灯泡,要求将我的数据库名称更改为“测试”......

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

结论,您不能为数据库和实例使用相同的名称。它们必须是不同的名称。

Public tnx 对这个女孩 Li H 是特别的。很高兴有这么好的专业支持。还:

  • 连接上使用的用户名需要具有“创建表”权限。

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

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

于 2017-10-19T18:57:29.713 回答