如何对 AWS Glue ETL 作业中的 AWS Marketplace 连接错误进行故障排除?

4 分钟阅读
0

我在 AWS Glue 中使用 AWS Marketplace 连接器,但在日志中收到错误。

解决方法

连接器未显示

您在 AWS Marketplace 中订阅了一个连接器,但在 AWS Glue Studio 的连接器页面中找不到该连接器。若要解决此问题,请完成以下步骤。

注意: 即使您之前订阅了连接器,也可以重复执行这些步骤。

  1. 打开 AWS Marketplace
  2. 选择发现产品,然后找到要使用的连接器。
  3. 选择继续订阅,然后,在系统提示时登录您的 AWS 账户。
  4. 选择继续配置。如果此选项显示为灰色且您无法选择,请务必阅读条款和条件。选择接受条款,然后等待直至继续配置按钮可用。
  5. 从下拉列表中选择交付方式软件版本。如果您不确定要选择哪个版本,请选择最新版本。
  6. 选择继续启动,然后选择使用说明
  7. 在出现的弹出窗口中,选择从 AWS Glue Studio 中激活 Glue 连接器
  8. (可选)若要仅安装连接器,请选择仅限活动连接器。有关此选项的详细信息,请参阅在 AWS Glue Studio 中使用连接器和连接。如果您改用自定义连接器,请参阅开发自定义连接器

AWS Identity and Access Management(IAM)角色相关问题

尝试在 AWS Marketplace 中订阅连接器时,会出现类似于以下的 IAM 权限错误:

"You do not have the right permissions to make this request.
Some controls have been disabled because you are missing the correct permission(s). The missing permission(s) are: aws-marketplace:Subscribe."

若要解决此问题,请向收到该错误的 IAM 用户添加 IAM 策略。若要使用 AWS Marketplace,请向您的 IAM 用户添加以下 IAM 策略:

  • 若要授予查看订阅而无法更改订阅的权限,请选择 AWSMarketplaceRead-only
  • 若要授予订阅和取消订阅的权限,请选择 AWSMarketplaceManageSubscriptions
  • 若要授予对订阅的完全控制权,请选择 AWSMarketplaceFullAccess

有关详细信息,请参阅控制对 AWS Marketplace 订阅的访问权限

AccessDeniedException 错误

您收到一个 AccessDeniedException 错误,类似于 AWS Glue 作业日志中的以下错误:

"An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/<IamRole>/GlueJobRunnerSession is not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action 
Glue ETL Marketplace - failed to download connector, activation script exited with code 1
LAUNCH ERROR | Glue ETL Marketplace - failed to download connector. Please refer logs for details."

如果与您的 AWS Glue 作业关联的 IAM 角色在尝试执行 GetAuthorizationToken 操作时权限不足,就会出现此错误。若要解决此问题,请向你的 AWS Glue 作业授予 ecr:GetAuthorizationToken 权限:

  1. 打开 IAM 控制台
  2. 选择您在 AWS Glue 作业中使用的 IAM 角色。
  3. 选择附加策略
  4. 筛选策略下输入 AmazonEC2ContainerRegistryReadOnly,然后选择此策略。
  5. 选择附加策略

将所需策略附加到 IAM 角色后,再次运行 AWS Glue 作业。

有关详细信息,请参阅 AmazonEC2ContainerRegistryReadOnly添加和删除 IAM 身份权限以及为 AWS Glue 设置 IAM 权限

网络问题 — 没有来自 VPC 的网络路径

您的网络设置可能不足以让 AWS Glue 连接器在 AWS Glue 作业中正常工作。

botocore.exceptions.ConnectTimeoutError: Connect timeout on endpoint URL: "https://api.ecr.us-east-1.amazonaws.com/"
Glue ETL Marketplace - failed to download connector, activation script exited with code 1
LAUNCH ERROR | Glue ETL Marketplace - failed to download connector.Please refer logs for details.
Exception in thread "main" 
java.lang.Exception: Glue ETL Marketplace - failed to download connector.

在此示例中,没有从包含作业组件的虚拟私有云(VPC)到 Amazon Elastic Container Registry(Amazon ECR)存储库的网络路径。Amazon ECR 存储库包含连接器的映像。AWS Glue 将所有连接器存储在 us-east-1 AWS 区域的 Amazon ECR 存储库中。如果 AWS Glue 作业想要使用连接器,则必须从该区域下载连接器。

将连接添加到 AWS Glue 作业时,必须建立网络路由。此网络路由允许流量流入或流出服务,在本例中为 Amazon ECR。AWS Glue 使用私有 IP 与作业和服务(例如Amazon ECR)的组件进行通信。如果您的连接使用路由表中有互联网网关的公有子网,则可能会出现此错误。

互联网网关的作业是路由流量。但它无法将 AWS Glue 使用的私有 IP 转换为 us-east-1 区域的 Amazon ECR 端点可以识别的公有 IP。您必须在连接子网中使用能够执行这些地址转换(私有到公有 IP)的 NAT 网关。

创建连接时,VPC、子网和安全组等网络信息是可选项。如果您仅使用连接器和密钥创建连接,那么 AWS Glue 作业将使用内部 NAT 网关。该作业不依赖于您账户中的 NAT 网关。

若要解决此问题,请选择以下一种解决方案,并将其纳入您的网络设计中。

方法 1: 创建 NAT 网关并将其附加到连接子网

您可以不使用互联网网关,而是创建一个 NAT 网关,并将其附加到连接子网:

  1. 为您的账户提供独立的弹性 IP 地址。确保将此 IP 地址与 NAT 网关关联。
  2. 创建 NAT 网关,然后选择公有子网和您为 NAT 网关配置的弹性 IP 地址。这将在公有子网中创建 NAT 网关。
  3. 创建私有子网(没有 Internet 网关路由)和相关的路由表。在路由表中,添加一条规则,使 0.0.0.0/0 指向您创建的 NAT 网关。或者,您可以编辑其中一个现有子网,以使用带有 NAT 网关路由的路由表。确保没有与 NAT 网关路由一起使用的互联网网关路由。
  4. 修改 AWS Glue 连接的子网,以使用您在步骤 3 中创建的私有子网。
  5. 再次运行 AWS Glue 作业并确认错误不会再次发生。

方法 2: 不要在连接中使用 VPC 信息

不要在连接中包含 VPC 信息。改用互联网 NAT 网关:

  1. 在 AWS Glue Studio 中为您的连接器创建新连接。
  2. 创建连接时,仅指定 Secrets Manager 密钥。不要添加任何 VPC 选项。这意味着 AWS Glue 使用内部 NAT,而不是依赖子网。
  3. 编辑 AWS Glue 作业以使用新连接,然后重新运行该作业。

方法 3: 对于私有网络设置,请创建一个 VPC 端点

如果您设置了私有网络,也可以使用 VPC 端点来代替 NAT 网关。

创建私有网络

  1. 登录 Amazon Virtual Private Cloud(Amazon VPC)控制台
  2. 在导航窗格中,选择子网,然后选择创建子网
  3. 选择您的 VPC ID,然后添加子网名称可用区IPV4 CIDR 块和标签。然后,选择创建子网
  4. 从导航窗格中选择路由表。为您的路由表添加一个名称,选择您的 VPC,然后选择创建路由表
  5. 打开您创建的路由表。在子网关联下,选择显式子网关联选项卡。
  6. 选择编辑子网关联,从列表中选择新创建的子网,然后选择保存。如果检查路由选项卡,现在可以看到无法访问互联网(0.0.0.0/0)。
  7. 从导航窗格中选择安全组。为您的安全组添加详细信息,然后选择 VPC。添加一条入站规则,允许源为 0.0.0.0./0 的端口 22 使用 TCP 协议。
  8. 添加第二条规则。对于协议,选择全部。对于,选择您创建的新安全组。如果在下拉列表中找不到新安全组的名称,请保存该组,然后再次编辑入站规则。

创建 VPC 端点

接下来,创建三个 VPC 端点:一个 Amazon ECR API 端点、一个 com.amazonaws.<region>.ecr.dkr 服务的 VPC 端点,以及一个 Amazon Simple Storage Service(Amazon S3)端点

首先,创建 Amazon ECR API 端点:

  1. 从导航窗格中选择端点
  2. 选择创建端点,然后为您的 Amazon ECR API 端点添加端点名称。
  3. 服务类别选择 AWS 服务
  4. 服务添加 ECR 筛选器,然后选择 com.amazonaws.<region>ecr.api
  5. VPC选择要在其中创建端点的 VPC。在其他设置下,选择启用 DNS 名称
  6. 子网选择在其中创建新子网的可用区。然后,从子网 ID 下拉列表中选择子网名称
  7. 安全组选择您创建的安全组。
  8. 策略选择完全访问权限,以允许所有主体在 VPC 端点上对所有资源执行所有操作。
  9. 添加可选标签,然后选择创建端点

使用相同的步骤,为名为 com.amazonaws.<region>.ecr.dkr 的服务创建另一个 VPC 端点。

然后,完成以下步骤,以创建 Amazon S3 端点:

  1. 从导航窗格中选择端点
  2. 选择创建端点,然后为您的 Amazon S3 端点添加端点名称。
  3. 服务类别选择 AWS 服务
  4. 服务添加类型:网关筛选器,然后选择 com.amazonaws.<region>.s3
  5. VPC选择要在其中创建端点的 VPC。
  6. 路由表选择您创建的路由表。
  7. 策略选择完全访问权限,以允许所有主体在 VPC 端点上对所有资源执行所有操作。
  8. 添加可选标签,然后选择创建端点

订阅和配置连接器

如果您已经在 AWS Glue 中订阅并配置了连接器,请继续前往创建 AWS Glue 连接部分。

如果您尚未在 AWS Glue 中订阅和配置连接器,请按照订阅 AWS Marketplace 连接器中的步骤进行操作。在出现的使用说明弹出窗口中,选择从 AWS Glue Studio 激活 Glue 连接器。这会将您转至创建 Glue 连接页面。

创建 AWS Glue 连接

如果您已经在 AWS Glue 控制台中添加了连接器,请导航到连接并选择您的连接器。然后,选择创建连接

如果您已经按照前面的步骤订阅和配置连接器,则创建 Glue 连接页面将打开。完成以下步骤以创建连接:

  1. 创建 Glue 连接页面上,添加连接名称
  2. 网络选项中,选择您的 VPC 以及您之前创建的子网和安全组。
  3. 选择创建连接并激活连接器

现在,您可以在 AWS Glue 作业中使用连接名称来控制连接器。

网络问题 — AWS Glue 作业中的连接太多

您在 AWS Glue 作业的日志中收到以下错误:

INFO - Glue ETL Marketplace - Start downloading connector jars for connection: <connection name>
test connection feature: "Caused by: com.amazonaws.services.glue.exceptions.InvalidInputException: Connection: does not exist"
LAUNCH ERROR | Glue ETL Marketplace - failed to download connector.Please refer logs for details.

AWS Glue 支持每个作业或开发端点使用一个连接。如果您在作业中指定多个连接,则 AWS Glue 仅使用第一个连接。如果您必须访问多个 VPC,请参阅使用专用 AWS Glue VPC 连接多个 VPC 并在多个 VPC 上运行 ETL 作业


相关信息

使用 AWS Glue Studio 创建 ETL 作业

AWS 官方
AWS 官方已更新 1 年前