创建与 MS SQL 服务器 RDS 的粘合连接的问题

Issues Creating a Glue Connection to an MS SQL Server RDS

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

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

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

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

但是现在,我正在努力将我的 ETL copy/create 我的 table 放入 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 中使用 "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 角色:glue 可信服务和 AWSGlueServiceRole 对于文档中编写的 AWS 托管策略。

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

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

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

我的 JDBC 连接工作正常,因为我明确指定了我想使用的安全组,我称之为 "sg-glue",并且这个 "sg-glue" 安全组被允许我的入站数据库安全组,还有我的 "sg-glue" 从允许入站的任何地方 "All TCP"。

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

回读 documentation 我可以看出我做错了什么,事实上我试图设置一个中间安全组来保护我的数据库。但是正如文档所说,我需要向我的数据库安全组授予 "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相同的安全组名的规则。

  7. 也为出站流量添加规则。要么开放所有端口的出站流量,要么创建一条自引用规则,Type All TCP,Protocol 为 TCP,Port Range 包括所有端口,Source 为与 Group ID 相同的安全组名称。

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

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

因此,为了让我的连接成功运行,我尝试让我的工作连接到我的 RDS 并创建我的 table 并在 ti 上写入。但我做不到,我收到一个错误:

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

我也不知道为什么。我尝试了所有方法,而不是调用 AWS Support。为了我的好运,我得到了这样一位 HERO 的支持,她叫 Li H。这个女孩工作了很多,走到每个角落都在寻找发生了什么,问了亚马逊的每一个人,工作了 4 天后,同时我们分享了我的屏幕,创建了很多次新环境来查找这个问题的原因,因为 VPC、SG、DNS,当我们绝望时,她头上顶着灯泡,要求将我的数据库名称更改为 "testing"...

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

结论,数据库和实例不能重名。他们需要不同的名字。

Public 非常感谢这个女孩 Li H。很高兴有这么好的专业支持。还有:

  • 连接上使用的用户名需要有"create table"权限。

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

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