创建与 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" 权限,所以我确实按照以下步骤重置了它:
- 在 Amazon RDS 左侧导航窗格中,选择实例。
- 选择您要从 AWS Glue 访问的 Amazon RDS 引擎和数据库实例名称。
- 从实例操作中,选择查看详细信息。在详细信息选项卡上,找到您将从 AWS Glue 访问的安全组名称。记录下安全组的名称,以备后用。
- 选择安全组以打开 Amazon EC2 控制台。
- 确认已选择来自 Amazon RDS 的组 ID,然后选择入站选项卡。
添加自引用规则以允许 AWS Glue 组件进行通信。具体添加或确认有Type All TCP,Protocol为TCP,Port Range包括所有端口,其Source为与Group ID相同的安全组名的规则。
也为出站流量添加规则。要么开放所有端口的出站流量,要么创建一条自引用规则,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 策略
我在这里阅读了所有已回答的问题,其中 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" 权限,所以我确实按照以下步骤重置了它:
- 在 Amazon RDS 左侧导航窗格中,选择实例。
- 选择您要从 AWS Glue 访问的 Amazon RDS 引擎和数据库实例名称。
- 从实例操作中,选择查看详细信息。在详细信息选项卡上,找到您将从 AWS Glue 访问的安全组名称。记录下安全组的名称,以备后用。
- 选择安全组以打开 Amazon EC2 控制台。
- 确认已选择来自 Amazon RDS 的组 ID,然后选择入站选项卡。
添加自引用规则以允许 AWS Glue 组件进行通信。具体添加或确认有Type All TCP,Protocol为TCP,Port Range包括所有端口,其Source为与Group ID相同的安全组名的规则。
也为出站流量添加规则。要么开放所有端口的出站流量,要么创建一条自引用规则,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 策略