使用接口 VPC 端点连接到 Amazon Spark 会话
对于使用 Apache Spark 版本 3.5 的工作组,您可以使用 Virtual Private Cloud(VPC)中的接口 VPC 端点(AWS PrivateLink)直接连接到 Amazon Spark 会话,而不是通过互联网连接。当您使用接口 VPC 端点时,您的 VPC 和 Athena Spark 会话端点之间的通信完全在 AWS 网络内进行。
每个 VPC 端点都由您的 VPC 子网中一个或多个使用私有 IP 地址的弹性网络接口 (ENI) 代表。VPC 中的 ENI 不需要公有 IP 地址便可与 Athena Spark 会话端点进行通信。
要通过您的 VPC 使用 Athena Spark 会话端点,您必须从位于 VPC 中的实例进行连接,或者使用 (Site-to-Site VPN) 或 AWS Direct Connect 将您的专用网络连接到 VPC。
支持的端点
以下 Athena Spark 会话端点支持通过 AWS PrivateLink 进行私有访问:
| 端点 | 说明 | 服务名称 |
|---|---|---|
| Spark Connect | 用于远程执行 Spark 工作负载的 gRPC 端点 | com.amazonaws. |
| Live UI | 基于浏览器的实时 Spark 任务监控 | com.amazonaws. |
| Persistent UI | 用于已完成会话的 Spark 历史记录服务器 | com.amazonaws. |
注意事项
-
为确保只能从 VPC 内部访问会话端点 URL,您必须通过 Athena API VPC 端点调用
GetSessionEndpoint(Spark Connect) 或GetResourceDashboard(Live UI 和 Persistent UI)。Athena 将原始 VPC 嵌入访问令牌中,并强制从同一 VPC 访问端点。 -
从 VPC 内部生成的会话端点 URL 可以从同一 VPC 或公共互联网访问,但无法其他 VPC 访问。这支持常见的工作流程,即在 VPC 内部以编程方式生成令牌,然后在本地浏览器中打开所生成的控制面板 URL。
-
从公共互联网生成的会话端点 URL 无法从 VPC 内部进行访问。
-
Athena Spark Connect、Live UI 或 Persistent UI 端点不支持 VPC 端点策略。
-
RDS API 端点支持 VPC 端点策略。要控制哪些 IAM 主体可调用 Athena API 端点,需将 VPC 端点策略应用于您的 Athena API VPC 端点 (
com.amazonaws.)。region.athena
为 Athena Spark 会话端点创建 VPC 端点
您可以使用 AWS 管理控制台或 AWS CLI 创建接口 VPC 端点。
使用 AWS CLI 创建端点:
aws ec2 create-vpc-endpoint \ --vpc-id <your-vpc-id> \ --service-name com.amazonaws.<region>.athena.sessions \ --vpc-endpoint-type Interface \ --subnet-ids <subnet-id> \ --security-group-ids <security-group-id> \ --private-dns-enabled
在创建端点并启用私有 DNS 后,Spark Connect 会话 URL 会自动解析到 VPC 端点,无需更改 SparkConnect 客户端配置。有关更多信息,请参阅《AWS PrivateLink 文档》中的创建接口端点。
为 Athena Spark 会话端点创建 VPC 端点策略
Athena Spark Connect、Live UI 或 Persistent UI 端点不支持 VPC 端点策略。
要控制访问,可在 Athena API 端点 (com.amazonaws.) 上附加 VPC 端点策略。由于会话端点 URL 与生成它们的 VPC 绑定,因此通过 API 端点控制可以调用 region.athenaGetSessionEndpoint 或 GetResourceDashboard 的对象,即可有效控制对相应会话端点的访问。
有关更多信息,请参阅使用 VPC 端点控制对服务的访问。
以下示例仅允许特定 IAM 角色生成会话端点 URL:
{ "Statement": [ { "Action": [ "athena:GetSessionEndpoint", "athena:GetResourceDashboard" ], "Effect": "Allow", "Resource": "*", "Principal": { "AWS": "arn:aws:iam::<account-id>:role/<role-name>" } } ] }