AWS代付、代实名
阿里云国际 | 腾讯云国际

Serverless is all you need: 在AWS上一键部署大模型API聚合管理平台OneHub

AWS账单代付阅读(46)

亚马逊AWS官方博客

Serverless is all you need: 在AWS上一键部署大模型API聚合管理平台OneHub

在AI 应用开发过程中, 开发者会使用到各大模型API, 只使用一家LLM provider 往往难以满足需求, 而在接入多家API时, 我们往往会遇到如下问题:

  • 各家LLM provider 的 认证凭据不同, 需要进行集中管理.
  • 不同 LLM provider 的API 调用方式有差别, 会提升业务代码的复杂度.
  • 各个 LLM provider 的调用量和消费情况需要进行统计.
  • 业务团队对不同模型API 的调用权限需要进行管理.

针对此类场景, 解决方法往往是增加一个 LLM Gateway 进行统一管理, 比较流行的有 LiteLLM、OpenRouter 和 Ollama 等, 我们测试下来, 针对大量终端客户做 API 分发的场景, 开源项目 One Hub 较为实用, 此项目以 one-api 为基础(one-api 已不再维护). 本文主要探讨如何在 AWS 上快速部署此项目且轻松实现弹性和高可用.

方案特点:

✅ AWS CloudFormation 一键部署.

✅ 绝大部分服务为 Serverless 服务, 几乎零运维负担.

✅ 高弹性架构, 闲时节约成本, 高峰时期可承载高并发.

✅ 存算分离, 高可用架构.

✅ 安全可靠, 源站资源全部私有化部署, CloudFront 自带抗DDOS. 所有网络防火墙规则可通过 WAF 统一管理.

注1: 本方案的所有项目分析和 CloudFormation 部署脚本皆由 AWS AI 工具 Kiro/Amazon Q Developer CLI 实现, 笔者辅助调节.

注2: 文中所提到的开源项目使用 Apache License Version 2.0, 本文仅探讨关于源码分析, 项目部署和功能使用层面的内容, 不涉及对原项目的代码或商标修改. 在实际使用中请遵守项目协议. 若涉及到二次开发请标明原项目出处, 若涉及到商标修改和发布, 请联系原作者.

方案架构

对于 AWS Globa Region 可以使用此处的 yaml文件 在 CloudFormation 中一键部署:

部署时务必将

DatabasePassword, SessionSecret, UserTokenSecret 这三个参数的默认值替换.

注意: 新 AWS 账号或没有创建过ECS 资源的账号在创建堆栈时可能会报错(提示缺少ECS服务链接角色, 此角色为首次使用 ECS 时AWS 自动创建), 删除堆栈再次尝试即可.

项目部署分析

对此项目进行单机部署很简单,在单机中直接运行 docker container 即可. 关于多机部署, 在项目部署文档中也有说明, 其中第三条提到了从服务器 slave 和主服务器 master 的概念, 但并没有详细说明这两种服务器类型的行为有什么区别, 而理清这一点对我们后续的部署策略和流量分发策略非常重要.

使用 Kiro/Amazon Q Developer 分析源码以明确部署策略

Kiro 和 Amazon Q Developer 是 AWS 发布的 AI IDE 和 AI Agent 工具, 可以自动读取项目代码文件和搜索整个代码仓库从而实现对项目源码的精准分析. 用户可以根据自己的喜好选择任意一款工具快速完成项目分析任务. 笔者这里在Visual Studio Code 中打开了 One Hub 项目并启用了命令行工具 Amazon Q Developer CLI 对整个项目进行了分析, 最终结论如下:

详细分析请见: NODE_TYPE_分析报告

由此报告我们可以总结出部署需要注意的事项:

  • 数据库连接:所有节点需要连接同一个数据库
  • 配置同步:Slave 节点会定期从数据库同步配置
  • 唯一性:建议只部署一个 Master 节点
  • 网络访问:确保 Slave 节点能访问数据库
  • ECS 集群部署规划

我们计划创建一个 ECS Cluster 并部署两个 Service.

创建两个 Task Definition 以为 Master 节点和 Slave 节点配置不同的环境变量.

Master Service

  • 使用 master-task-definition 启动 ECS Task.
  • 只启动一个 ECS task, 运行 Master 节点.
  • Slave Service

  • 使用 slave-task-definition 启动 ECS task.
  • 启动多个 ECS task, 运行 Slave 节点.
  • 在 Task Definition 中设置环境变量
  • 开启自动扩展, 以 CPU 或内存占用率为扩展指标.

ECS Service 开启 Availability Zone rebalancing,以确保 LLM API 服务始终高可用.

数据库

由上文可以明确,所有节点需要连接到同一个数据库, 而只有Master 节点会进行写入操作.

本文部署 Aurora Serverless V2 for MySQL, 具有如下特点:

  • 可以根据使用情况自动扩缩容,从 0.5 ACU(1 GiB 内存)到 256 ACU(512 GiB 内存), 最小扩展单位为 0.5 ACU.
  • 数据存储部分按实际使用量收费,无需预置存储容量.
  • 原生高可用, 自动故障转移.
  • ALB 流量分发策略

  • Master 节点:负责数据管理、定时任务和系统维护
  • Slave 节点:负责请求处理和服务扩展

我们可以使用 ALB 监听器规则将 LLM API 请求全部转发到 Slave Target Group, 将所有其他与前端页面操作(主要是管理动作)相关的请求转发到 Master Target Group. 示例如下:

注意这里设定的规则:

主要是为了匹配多种 LLM API 调用格式, 如

但实际上这个规则并不能覆盖市面上所有的调用格式,且易与其他 API path 冲突, 需要针对使用场景进行修改.

网络规划

该项目大多数场景是在互联网上提供服务, 为确保服务数据安全且长期稳定运行, 在网络规划方面我们有以下几个要点:

  • ECS task 全部运行于 VPC 私有子网, 通过公有子网的 NAT Gateway 实现公网访问.
  • 数据库 Aurora 运行于 VPC 私有子网, 配置安全组规则允许 ECS task 访问.
  • ALB 部署在 VPC 私有子网, 禁止公网访问.
  • CloudFront 采用 VPC origin 连接源 ALB.

通过此配置, 我们在没有额外配置 WAF 的情况下即可实现:

  • 源站无公有 IP, 所有公网入站流量只能通过 CloudFront, 极大降低了攻击面.
  • CloudFront 自带的 Standard Shield 可以抵御大部分 DDoS 攻击.
  • 通过 CloudFront 关联 WAF 规则, 可以在单一入口完成防护配置和流量分析, 运维简单.
  • 通过 CloudFront 全球 PoP 点快速接入 AWS 骨干网, 降低 API 访问延时.
  • 功能测试

部署完毕后,在 CloudFormation Stack Output 中找到 CloudFront URL, 根据此 使用说明 登陆系统进行 API 测试.

此处可配置 AWS Bedrock 可用模型以及自定义映射关系:

AWS Bedrock 相关模型的映射关系可以在此处找到.

配置完成后, 使用 Insomnia 进行 API 测试:

可观测性

  • Aurora 集群默认开启 RDS Data API, 可通过AWS 控制台 Query Editor 直接连接数据库并运行 MySQL, 无需额外配置堡垒机.
  • 所有 AWS ECS Task 产生的日志默认发送到 CloudWatch, 可实时查看和分析.
  • 可开启 ECS Exec 以直接登陆正在运行的 Container 进行问题排查.
  • 成本分析

本方案绝大部分服务为 Serverless 服务, 成本与应用实际承载流量正相关. 以本文中提供的一键部署文件配置为例, 费用主要包含如下部分:

  • AWS ECS Fargate 部署费用(共三个,单个配置为 256 CPU + 512 Memory, 表示 1/4 vCPU 和 512 MiB 内存)
  • AWS Aurora Serverless V2 部署和存储费用, 默认 0.5 ACU
  • ALB 部署费用.
  • NAT Gateway 部署费用.

在个人使用场景下,经测试每日成本在 3.7-5.4 美元之间(不含大模型 API 调用费用), 不同 Region 部署会有差别. 可以看出 Serverless 架构用于部署流量不确定或业务起步阶段的应用具有巨大成本优势.

总结与展望

在将此方案部署落地到产品时,我们有如下改进方向:

  • CloudFront 默认与源站的连接 Timeout 最高为60s, 可以通过提交工单提升到 180s, 以适应超长 prompt 或输出的 API 调用场景.
  • 配置关联到 CloudFront 的 WAF 规则, 启用实用托管规则比如限流规则以及 Layer 7 DDoS 防护规则.
  • ECS Cluster 支持 EC2 + Fargate 混合部署, 考虑到 Master 节点只需部署一台而不做扩缩容, 若需要长期提供服务, 可以将 Master Task Definition 改为 EC2 实例部署并购买预付实例.
  • 若需要提升接口响应速度, 可以考虑部署 Amazon ElastiCache Serverless for Redis. 同样不会增加运维压力.

通过充分利用 AWS 的 Serverless 服务,我们将基础设施运维的重担转移给了云服务商,让开发团队能够将更多精力集中在业务创新和产品迭代上. 与此同时,AI 工具的应用也极大提升了我们的工作效率,缩短了产品从开发到部署上线的周期。

人工智能和云计算的结合是当下科技发展的大趋势,我们期望通过这些前沿技术,不断优化产品交付模式,为客户提供更加卓越的解决方案和服务体验。

参考链接

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。


亚马逊云科技VPC多可用区keepalived配置指南

AWS账单代付阅读(44)

亚马逊AWS官方博客

亚马逊云科技VPC多可用区keepalived配置指南

前言

在上一篇博客中(亚马逊云科技VPC中的keepalived配置指南),我们介绍了在AWS VPC中配置keepalived需要考虑的问题,并提供了使用辅助IP作为keepalived VIP的配置方案。由于辅助IP仅允许绑定到同一子网的网络接口,因此这个方案要求keepalived集群成员的网络接口位于同一个子网,即这些节点必须创建在同一个可用区。

为了满足更高的可用性,有些客户希望能在多可用区创建keepalived集群。本文介绍在AWS VPC网络中创建多可用区keepalived集群所需要考虑的问题及配置方案。

您可以参考上一篇博客中我们介绍的keepalived的基本工作方式和AWS VPC的网络设计考虑,这些内容在本文中不再重复介绍。

AWS VPC的多可用区keepalived方案设计

在上一篇博客中我们描述了AWS VPC网络所遵循的行为。VPC网络按照路由表中的路由条目转发报文,路由查找规则使用最长前缀匹配 (LPM: Longest Prefix Match) 。路由表缺省预置本地网络路由,前缀为VPC CIDR,下一跳为local。本地网络路由不可修改。

在上一篇博客中,我们使用了辅助IP作为keepalived的VIP,就是利用了VPC本地网络路由。由于VPC中的子网创建后不能更改所在的可用区,这意味着任何一个内网IP地址都无法动态更改所在的可用区,所以仅利用本地路由机制无法实现在VPC内实现跨可用区的VIP漂移。如果想在VPC内实现跨可用区的VIP漂移,必须要使用本地路由以外的路由,即通过在路由表中添加新的路由条目来实现。

AWS VPC路由表简介

AWS VPC中的每个子网有且只有一个关联的路由表。子网中的节点发送的报文遵循路由表中的路由规则。

子网路由表预置目标为VPC CIDR的本地路由,并且不可修改(例如CIDR为

10.100.0.0/16的VPC内的所有路由表都预置前缀为

10.100.0.0/16,下一跳为local的路由)。VPC中通常包含多个路由表,每个路由表都可以和多个子网关联。通过配置路由表路由条目以及路由表与子网的关联关系,可以满足业务多样的网络拓扑需求。

子网路由表中可以添加多个路由条目,每一个路由条目由目标前缀(Prefix)和下一跳组成。目标前缀是网络数据去向的IP地址范围,使用

/的格式,例如

10.100.1.0/24。当所添加的路由条目中的目标前缀与VPC CIDR重叠时,仅允许添加与VPC中子网CIDR相同的目标前缀,这是AWS VPC网络的一个限制条件。与VPC CIDR无关的目标前缀没有限制。

子网路由表中路由条目的下一跳可以有多种类型,常见的有互联网网关 (IGW)、NAT网关、ENI等。在本文描述的方案中,将使用ENI作为路由条目的下一跳。路由条目中的下一跳可以通过API或者控制台修改,修改后立即生效。

作为一种安全机制,在缺省情况下,AWS VPC会限制EC2实例仅能使用已分配的子网IP地址进行报文收发,其余报文会被丢弃。已分配的IP地址包括ENI的主IP地址、辅助IP地址及ENI代理的IP地址前缀。EC2实例在某些场景下需要使用任意的IP地址来收发报文,例如EC2本身作为一个路由器、防火墙等网络中间节点来转发来自其它位置的流量。AWS EC2实例提供选项,允许用户对这些实例的特定ENI关闭报文的源/目的IP地址检查。

通过路由表更新支持keepalived VIP漂移的设计考虑

在上一篇博客中我们已经描述了keepalived的工作原理,本文不再重复。在keepalived集群进行故障切换时,VIP需要从原有的Master节点漂移到新选举的Master节点。这个过程包括两个主要的操作:

  • 新的Master节点内部绑定VIP;如果可能的话,原Master节点内部解绑VIP。这个操作由keepalived模块原生支持。
  • VPC路由表更新,将VIP路由到新的Master节点。

与上一篇博客不同,上述的第二个步骤没有采用绑定/解绑辅助IP的方案,而是使用更新路由表的操作以实现将VIP路由到不同可用区的实例。

我们推荐选择VPC CIDR以外的私有网络地址(RFC 1918)作为VIP [讨论2]。在本博客中我们选择了192.168.1.100这个IP地址作为示例。在实际的网络环境中,我们建议选择与网络中的其它节点不冲突的私有网络地址。推荐规划预留专门的网段,从该网段中分配VIP并管理VIP的使用记录。

由于VPC中可能存在多个路由表,在进行路由表更新时需要将所有访问VIP的子网路由表都进行更新。

使用弹性IP (Elastic IP, EIP) 实现面向公网访问的keepalived VIP

在上一篇博客中,在辅助IP解绑/绑定的同时,与辅助IP关联的EIP会一直保持关联,同步漂移到新的节点。通过这种方式,与辅助IP关联的EIP承担了面向互联网访问的VIP角色。

在本博客讨论的多可用区场景中,由于没有使用辅助IP,如果需要提供面向互联网的访问,我们需要在VIP漂移时增加EIP解绑/绑定的操作。

为了防止绑定/解绑EIP对实例原有公网IP的影响,我们可以为节点添加额外的ENI专门用于承载作为VIP的EIP。出于简化考虑,在本博客中EIP直接关联到实例的主网卡。

本博客中的VIP漂移触发机制沿用上一篇博客的做法,在keepalived中配置触发动作,当节点成为Master时调用AWS CLI,更新路由表,同时可选解绑/绑定EIP。

使用EC2基于路由表和EIP实现VIP漂移的配置流程

图1 基于路由表更新和EIP重新绑定实现keepalived

我们用一个最小环境来演示使用EC2实例在AWS VPC的多可用区中配置keepalived的具体操作。在这个例子里面,我们用两台处于不同可用区的EC2实例运行keepalived,分别作为主、备节点。我们在这两台实例上配置nginx提供一个简单的web页面,用于验证VIP是否成功漂移。在不同的可用区创建客户端来测试VIP的访问(本文仅描述了在一个可用区中创建客户端,其余可用区操作类似)。完整的配置包括以下几个部分:

  • 创建2个EC2实例用于运行keepalived和nginx web服务器,这两个实例位于不同可用区的公有子网
  • 为keepalived实例的instance profile添加IAM权限,用于操作路由表和EIP
  • 创建一个EC2实例用于模拟客户端
  • 创建安全组规则,用于keepalived实例之间互相通信和客户端访问keepalived实例web服务。将安全组绑定到各个实例
  • 启动keepalived服务,并触发主备切换。分别从客户端访问VIP,验证VIP绑定到了正确的节点

⚠️ 本文中所有示例基于

Amazon Linux 2023操作系统,其它发行版请根据实际情况调整相关命令。

一、环境准备

我们将启动两台t3.micro EC2实例,分别作为

MasterBackup节点,实现通过VIP的主备切换。这两台EC2实例需要创建在公有子网中,以验证使用EIP作为面向公网访问的VIP切换方案。

⚠️ 请确认两台实例位于不同可用区的公有子网。

安装keepalived, AWS CLI和nginx

在两台 EC2 实例上分别执行以下命令:

我们另外启动一台t3.micro实例,用于模拟

客户端。客户端使用的curl命令已经包含在Amazon Linux 2023系统镜像中,无需额外安装操作。

二、IAM权限配置

在本例中,我们使用EC2 instance profile来为keepalived实例配置修改路由条目的权限。您也可以使用其它方式来为keepalived实例提供必要的IAM权限,例如使用AK/SK。要使 EC2 实例具备修改路由条目的能力,需要为两台实例绑定一个包含以下权限的 IAM 角色:

该角色的信任关系需要包含EC2服务,才可以允许绑定到EC2实例上。我们为该角色添加如下信任关系:

⚠️ 请在AWS控制台为Master和Backup实例分别绑定该IAM角色。

三、添加安全组规则

keepalived集群节点之间需要使用VRRP协议进行通信。VRRP协议是独立于TCP/UDP的IP协议,IP协议号为112。我们可以添加安全组入站规则以放行相应的keepalived协议。在VPC中,我们也可以通过使用default安全组实现节点之间的无限制通信,这也是我们在本文中所使用的方式。在VPC中的default安全组中包含一条入站规则,该规则允许来自本安全组的所有流量。这意味着绑定了default安全组的所有网络接口之间的通信不受限制,同时并未开放来自其它源地址或其它安全组的访问。default安全组的这个设计特别适用于集群节点间的相互通信。

⚠️ 我们为Master、Backup节点和客户端节点分别添加绑定default安全组,

同时保留原有安全组

四、创建 VIP 分配脚本

在replace route操作之前,需要路由表中预先创建相应的路由条目。在所有需要访问VIP的子网路由表里分别创建一条路由:目标为192.168.1.100/32,下一跳为Master或Backup节点的ENI ID。

在两台 EC2 实例上分别执行以下命令:

sudo mkdir -p /etc/keepalived/scripts

执行以下脚本生成修改路由条目的脚本文件,并根据你实际的VIP、ENI ID、Route table ID修改,循环更新所有要访问VIP的子网路由表中的路由条目:

赋予脚本可执行权限:

sudo chmod +x /etc/keepalived/scripts/rt_vip_master.sh

⚠️ keepalived Master、Backup节点上都需要执行上述操作,并替换ENI ID为该节点的ENI ID

五、创建keepalived配置文件

Master节点配置

执行脚本内容如下:

Backup 节点配置

执行脚本内容如下:

分别在keepalived Master和Backup节点启动keepalived服务和nginx服务:

sudo systemctl enable keepalived –now

sudo systemctl enable nginx –now

systemctl status keepalived.service

systemctl status nginx.service

六、验证VIP漂移

验证 VIP** **当前绑定在 Master** **节点

在 Master 节点上执行以下命令,确认 VIP

192.168.1.100 已绑定到网卡

ens5:

ip addr show ens5 | grep 192.168.1.100

输出如下,表示 VIP 当前处于 Master 节点:

inet 192

.**168.1.100/32 scope global ens5 **创建简单的web** **页面

在Master节点创建一个简单的页面:

在Backup节点创建一个简单的页面:

验证服务访问正常

在客户端节点,使用curl命令向两个keepalived节点分别发起HTTP请求:

curl 10.0.1.100 10.0.2.100

输出如下:

Hello from node 1

Hello from node 2

在客户端节点使用curl命令向VIP发起HTTP请求前,如上文所述我们需要关闭keepalived所有节点的源/目的IP地址检查:

curl 192.168.1.100

输出如下:

Hello from node 1

以上输出表明VIP目前绑定在节点1上,即Master节点。

模拟主节点故障切换

我们可以有多种方式模拟Master节点的故障。keepalived提供多种配置选项用于监控系统的健康情况,比如使用track_script自定义健康检查脚本。本文中通过停止Master节点的 keepalived服务来模拟Master节点的故障。

在 Master 节点执行:

sudo systemctl stop keepalived

在客户端节点,使用curl命令再次向EIP的private IP发起HTTP请求:

curl 192.168.1.100

输出如下:

Hello from node 2

以上输出表明VIP已经成功漂移,目前绑定在节点2上,即Backup节点。

通过以上步骤,成功验证了keepalived在Master节点故障时,能够将VIP漂移到Backup节点,确保服务高可用。

七、公网访问VIP

以上实验都是在VPC内部的client实例上去访问VIP。如果需要从互联网访问VIP,则需要增加配置,使用EIP关联到Master节点的ENI上。

首先要给keepalived的两个实例附加的role增加associate address的权限,具体配置如下:

另外,在某个节点成为主节点时需要把EIP关联到该节点的ENI上。在notify master的脚本rt_vip_master.sh里增加associate address操作:

最后,需要更新Master和Backup节点的安全组,以允许从公网访问HTTP端口。具体做法是在安全组中添加Inbound规则,类型为HTTP (或TCP端口80), 来源为您电脑所使用的公网IP(或0.0.0.0/0)。之后,我们就可以在本地电脑使用curl或者浏览器去访问VIP了。

总结与讨论

本博客讨论了如何使用AWS VPC子网路由表中的路由条目更新实现keepalived的VIP漂移,从而实现多可用区keepalived集群节点的主备切换。结合弹性公网IP的重新绑定,同时可以支持面向公网的keepalived服务。

讨论

通过VPC** **对等连接 (VPC Peering)** **、VGW** **和TGW** **从VPC** **外部访问keepalived VIP

由于方案中VIP是任意选择的一个IP地址,并未由VPC管理和分配,该VIP无法从VPC对等连接、VGW和TGW从VPC外部访问。如果需要从VPC外部访问VIP,需要在VPC内创建虚拟网络设备(VNF),通过TGW的connect attachment使用GRE隧道通信,并且使用BGP动态路由实现虚拟网络设备自身的高可用配置。相关配置可参见AWS网络博客文章。

使用VPC** **内的IP** **地址作为VIP

一个常见的考虑是使用VPC内的未分配IP作为VIP,但是需要注意VPC路由表限制只能以子网CIDR作为路由条目的目标。虽然我们可以创建一个空的子网并在路由表中添加以该子网为目标的路由条目,然后选择该子网中的一个IP地址作为VIP,但是创建这个子网增加了方案的复杂度,与使用VPC外的IP相比而并没有带来额外的价值。

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。


新一代SageMaker+Databricks统一目录:机器学习与数据分析工作流打通方案

AWS账单代付阅读(45)

亚马逊AWS官方博客

新一代SageMaker+Databricks统一目录:机器学习与数据分析工作流打通方案

前言

在数据驱动决策的时代,企业正面临着两大核心挑战:

如何打破数据孤岛实现跨平台协作,以及 如何在复杂技术栈中保持治理一致性。这些挑战直接影响着企业从数据中获取价值的能力和速度。

Databricks作为领先的数据分析和机器学习平台,已经帮助众多企业实现了大规模数据处理和分析。与此同时,许多企业在AWS云上构建了完整的业务系统和机器学习工作流。如何让这两个强大的生态系统无缝协作,成为了释放数据价值的关键所在。

本文提出的解决方案**:通过SageMaker Unified Studio与Databricks Unity Catalog的深度集成,企业既能充分利用Databricks强大的数据分析能力,又能与AWS上现有的业务系统深度融合,真正实现数据价值的最大化。这不是简单的技术对接,而是一种全新的数据协作范式。 **本文将以真实业务场景为锚点,深度解析两大平台的协同价值:** **技术融合性 – 零摩擦的数据访问

通过SageMaker Unified Studio中的托管JupyterLab环境,借助EMR Serverless的强大计算能力,直接访问Databricks Unity Catalog中的受治理数据。这种架构彻底

消除了传统ETL的冗余**,让数据科学家能够实时访问最新的业务数据,显著提升模型开发效率。 **治理穿透力 – 企业级安全合规保障

在新一代SageMaker工作流中无缝继承Databricks预设的

数据血缘追踪、细粒度访问控制和完整审计策略。这意味着企业无需重复构建治理体系,即可确保跨平台的数据安全性和合规性,大幅降低治理成本和风险。

实战导向的技术指南

我们不仅会深入剖析架构设计的核心要点,更重要的是分享在实际项目落地中积累的宝贵经验和避坑指南:

关键技术挑战与解决方案跨平台安全访问:如何在保证数据安全的前提下实现平台间的身份认证和授权 混合云网络配置:企业混合云环境下的网络连通性最佳实践 性能优化策略:大规模数据查询的性能调优技巧 生产级部署考量:从POC到生产环境的平滑过渡路径

通过本文,您将获得一份经过实践验证的完整集成方案,帮助您的团队快速构建一个安全、高效、可扩展的跨平台数据科学工作流。

架构解析

此架构旨在整合 AWS SageMaker Notebook和Databricks Unity Catalog 的功能,以实现高效的数据处理、机器学习模型开发以及跨平台的数据共享和协作。

亚马逊云科技 Side

SageMaker Unified Studio: 作为AWS的核心组件之一,Sagemaker Unified Studio为数据科学家和开发者提供了一个集成的开发环境,用于构建、训练和部署机器学习模型。它支持多种编程语言和框架,并且可以无缝地与AWS其他服务进行集成。

EMR Studio Notebook: EMR Studio Notebook是Amazon EMR的一部分,它允许用户在云端运行交互式数据分析任务。通过EMR Studio Notebook,用户可以利用Apache Spark等大数据处理框架来处理大规模数据集。

Databricks Side

Open API: Databricks提供了丰富的API接口,使得外部系统能够与其进行通信和数据交换。这些API包括但不限于REST API,它们允许用户执行各种操作,如创建和管理集群、运行作业、查询数据等。

Unity Catalog: Databricks的 Unity Catalog是一个元数据管理解决方案,它帮助组织管理和治理其数据资产。通过 Unity Catalog,用户可以定义和应用细粒度的数据访问控制策略,确保数据的安全性和合规性。

Delta Lake: Delta Lake是Databricks推出的一个开源存储层,它提供了ACID事务、统一的数据治理和高性能的数据处理能力。Delta Lake可以存储结构化和半结构化的数据,并支持实时分析和批处理等多种工作负载。

Databricks 数据共享方式

Databricks提供了多种数据共享的方式,下面是一个列表,我们可以根据自己的需求来进行选择.

|A

|B

|C

|D

|E

|1

|

Option |

Cost |

Limitations |

Simplicity |

When to use?

|2

|Delta Sharing

|$

|🔴

|🟠

|只读模式:适用于小数据且由工作区管理员进行设置

|3

|Databricks Connect

|$$

|🟢

|🟢

|任何需要使用 Databricks 计算能力的情况

|4

|Databricks SQL client

|$$

|🟢

|🟢

|类似于 Databricks Connect,但仅适用于 SQL 用户。

|5

|Unity Catalog Open APIs

|$

|🟠

|🟢

|目前适用于只读用例,具有简单的设置,并且可以使用您选择的引擎。

本案例中我们使用 Unity Catalog Open APIs 来实现 Databricks 和 SageMaker Unified Studio的数据共享, 下面我们将逐步带大家完成所有的配置.

Databricks 侧配置

  • 首先我们需要开启Databricks的Catalog External Access, 配置步骤如下.

Enable

External data access

  • 配置Databricks用户可以在外部访问Catalog的权限,使用以下示例语句.

GRANT EXTERNAL USE SCHEMA ON SCHEMA . TO [已去除邮箱]

  • 配置对用Databricks 用户Personal Access Token,点击用户

Settings选项

一定要记录下来生成好的access token,它只能被记录一次,至此我们在 Databricks上配置就可以了.

Sagemaker Unified Studio 配置

在 Amazon SageMaker Unified Studio 中,域是用于连接您的资产、用户及其项目的组织实体。域代表组织内业务线 (LOB) 或业务领域的独特边界,这些业务领域可以管理自己的数据,包括自己的数据资产、自己的数据或业务术语定义,并可能有自己的治理标准。管理员创建域并与用户或组共享 URL。首次开始使用 Amazon SageMaker Unified Studio 时,首先要创建域以及域中存在的所有核心组件。

设置 Amazon SageMaker 统一工作室域

  • 要开始创建域,请在 Amazon SageMaker 控制台上点击

创建统一工作室域按钮。

  • 选择

快速设置功能,在 快速设置功能的设置页面上,修改域名。在 虚拟私有云(VPC)中请选择有私有子网存在的VPC,选择三个不同AZ的私有子网,私有子网必须配置 Nat Gateway,否则会影响后续功能使用。其他保持默认值。

  • Amazon SageMaker Unified Studio 域默认支持 IAM 用户身份验证。在此输入IAM Identity Center中用户电子邮箱地址。
  • 创建成功后通过url或者“打开统一工作室”按钮登陆Amazon SageMaker Unified Studio。点击后选择 SSO 方式登陆。输入在IAM 身份中心设置的用户名和密码。
  • 创建项目

  • 登陆后点击

创建项目,在 Amazon SageMaker Unified Studio 中,通过项目汇集人员、数据和工具,使数据用户群体能够协作解决特定的业务用例。

  • 修改项目名称,选择合适的项目配置文件。项目配置文件是用于创建项目的配置蓝图的集合。蓝图定义了项目成员在处理 Amazon SageMaker 目录中的数据时可以使用哪些 AWS 工具和服务。这里选择的是

所有功能,选择后点击 继续

  • 可以按需更改日志保留期等配置,由于在此场景下已经禁用了glue catalog,可以忽略lakehouse database中的glue database name更改,这里保持默认设置。点击

继续。跳转到下一页后再选择 创建项目。创建成功后,您将被重定向到项目主页。

  • 下一步我们来添加EMR Serverless 计算资源。进入项目后,在左侧概览下选择
  • compute**,点击 **Data processing**,点击 **add compute。

  • 您可以选择连接到现有计算资源。如果您为创建资源,可以选择
  • Create new compute resources**,点击 **next

  • 关于计算资源种类,我们选择
  • EMR Serverless**, 点击 **next,**修改 **compute name**,其他保持默认值,点击 **add compute

    项目角色权限配置

最后我们还需要为项目角色添加权限,使其可以访问Databricks存储在S3的数据。

  • 我们先在左侧概览下选择

Project overview,在 Project details找到 Porject role arn,从 datazone_user字段开始复制

  • 进入

IAM服务控台页面,点击左侧 角色,搜索复制的project role,点击查询结果查看角色详情。

  • 为项目角色创建内联策略。输入以下策略,将

*amzn-s3-demo-bucket*替换成您的存储桶名称

至此我们在Sagemaker Unified Studio上的开发环境已经Ready了.

EMR Serverless 配置

下面我们需要修改 EMR Serverless Application 的配置, 为了保证后面我们在 Sagemaker Unified Studio 中的配置一致,我们需要修改Application的

Application configuration **和 **Additional configurations. **修改的内容如下 **Application configuration

  • Disable Glue Catalog
  • Sagemaker Unified Studio JupyterLab配置

下面我们开始配置Sagemaker Unified Studio → JupyterLab, 如下图所示

在我们创建Sagemaker Unified Studio的时候,会默认选上Glue Catalog作为Catalog的默认选项,如何我们想在Notebook内使用Databricks Unified Catalog, 我们需要覆盖原有Glue Catalog配置信息,注意下面的catalog信息.

创建Spark session,

下面步骤中一定要注意Compute的信息

验证当前的 Spark Context Configuration

如果想使用emr serverless计算资源,请在每个单元格上方进行选择,左侧选择pyspark,右侧选择创建好的emr serverless资源

查询当前Spark中的catalog List

可以看到此时已经有 sean2 的catalog.

下面我们查询该catalog下的schema数据.

spark.sql(“select * from sean2.myorder.sample_orders limit 1”).show()

此时可以看到我们已经可以查询到数据了.

总结与展望

方案价值回顾

通过本文介绍的集成方案,我们成功打通了AWS 新一代SageMaker与Databricks两大平台的数据通道,实现了真正意义上的统一数据湖仓架构。这不仅是技术层面的集成,更是企业数据战略的重要布局。

关键收益总结

直接收益**: **开发效率提升**:消除重复的ETL开发工作 **数据延迟降低**:从批处理ETL到实时查询的转变 **治理成本降低**:统一的权限管理和审计体系 **资源利用率提升**:EMR Serverless的弹性计算能力 **战略价值**: **打破组织壁垒**:让数据工程师和数据科学家在各自熟悉的平台上协同工作 **加速AI落地**:从数据洞察到模型部署的端到端流程优化 **降低合规风险**:统一的数据治理框架确保合规性 **提升创新能力**:释放团队精力专注于业务价值创造 **适用场景

本方案特别适合以下场景:

  • 已有Databricks数据平台,需要扩展ML能力的企业
  • 需要在AWS生态系统中利用Databricks数据资产的团队
  • 对数据治理有严格要求的游戏、金融、医疗等行业
  • 追求成本优化的中大型数据团队
  • 未来展望

随着Unity Catalog生态的不断完善和AWS对开放标准的持续支持,我们预见:

更深度的集成:期待看到新一代SageMaker与Databricks的直接集成,互为数据的生产者与消费者。在数据发现,可读可写和数据治理方面更加无缝 性能优化:通过缓存、预计算等技术进一步提升查询性能 智能化治理:基于ML的自动化数据分类和权限推荐 多云扩展:将这种集成模式扩展到其他云平台

参考文档

https://community.databricks.com/t5/technical-blog/how-to-access-data-in-databricks-from-amazon-sagemaker-notebooks/ba-p/83638

https://aws.amazon.com/blogs/big-data/run-interactive-workloads-on-amazon-emr-serverless-from-amazon-emr-studio/

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。


使用 Apache SeaTunnel 快速集成数据到S3 Tables

AWS账单代付阅读(49)

亚马逊AWS官方博客

使用 Apache SeaTunnel 快速集成数据到S3 Tables

业务技术背景

在当今数字化转型浪潮下,企业正面临着海量数据的爆炸式增长,尤其在构建数据湖业务、BI分析以及AI/ML数据准备等关键场景中,需要高效、可扩展的大规模大数据存储解决方案。这些场景往往要求数据存储系统不仅能处理PB级甚至EB级的数据规模,还必须支持事务性操作,以确保数据一致性、原子性和隔离性,从而避免数据混乱或丢失的风险。正因如此,Apache Iceberg作为一种先进的开源数据湖格式,应运而生并迅速崛起。它提供了可靠的元数据管理、快照隔离和模式演化功能,被众多科技巨头如Netflix、Apple和Adobe广泛采纳,已然确立了在数据湖领域的领导地位。根据行业报告,Iceberg的采用率在过去几年内持续攀升,成为构建现代数据基础设施的首选标准。

尽管Iceberg本身强大,但企业在实际部署中往往面临运维复杂性、扩展管理和资源开销的挑战,这就需要托管解决方案来简化操作。亚马逊云科技在2024年re:Invent推出的S3 Tables特性,进一步强化了Iceberg的托管能力。这一创新功能允许用户直接在Amazon S3上构建和管理Iceberg表,可以将Iceberg表直接构建和管理在云存储上,无需额外的基础设施投资,从而显著降低运维成本和复杂度,同时充分利用云平台的全球可用性、耐久性和无限扩展性,提升数据处理的弹性和性能。这种托管方式特别适用于需要高可用性和无缝集成的场景,为企业提供云原生数据湖体验,确保数据湖在高并发读写下的稳定性。

在众多业务场景中,数据同步尤其是CDC(Change Data Capture)扮演关键角色,它支持实时捕获源数据库的变化并同步到目标系统,如数据湖或仓库。实时数据同步适用于对时效性要求高的场景,例如金融交易平台的欺诈检测、零售库存实时更新或医疗系统的患者记录即时共享,确保决策基于最新数据;而离线(或批量)数据同步则更适合非实时需求,如日常备份、历史数据归档或定时报表生成,避免资源浪费并处理大批量数据。通过这些同步机制,企业能高效实现CDC数据摄入和批量同步,满足从实时分析到离线处理的多样化需求。本文将介绍,如何使用 Apache SeaTunnel ,一个高性能、分布式的大规模数据集成工具,通过兼容 Iceberg rest catalog 的实现对接 S3 Tables 实现实时和批量数据集成。

架构及核心组件

SeaTunnel 原生实现对 Apache Iceberg REST Catalog 的接入能力。Iceberg 的 REST Catalog 允许以标准化接口对元数据进行读写和管理,极大简化了客户端与 Catalog 交互的复杂度。通过对 REST Catalog 的兼容,SeaTunnel 可以直接、无缝地将作业产出的表元数据同步注册到 Iceberg Catalog,而无需研发自定义插件或手动维护元数据同步流程。这为数据湖的自动化运维和架构解耦创造了技术基础。** **通过SeaTunnel 支持 Iceberg REST Catalog 对接,** **云原生数据湖能力:S3 Tables + REST Endpoint ,**随着 S3 Tables的发布,S3 Tables 内置提供了 Iceberg REST Catalog Endpoint。SeaTunnel 能够直接对接S3 Tables,无需额外改造,即可将批量或流式数据流动写入到 S3 上的 Iceberg 表,并通过 S3 Tables 的 REST Endpoint 管理元数据和表结构。这种原生对接极大降低了云上数据湖落地和扩展成本,实现了云原生、Serverless 的数据湖架构,管理和查询端都变得标准化、敏捷和易于演化。 **如图所示,数据同步链路基于 SeaTunnel 完成整合:无论是数据库(如OLTP/OLAP)、S3 离线分区还是流式变更(CDC 数据),都先统一接入 SeaTunnel,通过 SeaTunnel Sink 能力实时或批量写入 S3 Table Bucket。与此同时,Iceberg 表的元数据通过 REST Catalog 即时注册到 Data Catalog 服务(如 Lake Formation),实现业务表、元数据、访问权限等一站式协同。CDC 实时场景下,数据库的变更可以低延迟同步,保证数据的鲜活性;而在批量同步或历史归档场景,也能稳定高效地将数据注入 S3 Table,并由统一 Catalog 发现和管理,适配数据湖/数据仓库混合查询模式。综上,该架构的核心创新在于,SeaTunnel 通过 Iceberg REST Catalog 标准化了数据与元数据的流转方式,AWS S3 Tables 的 REST Endpoint 实现云原生、托管化部署,而 CDC 与离线数据同步能力让大规模数据湖具备了高效、灵活、实时的一站式数据流通机制。** **数据与 Catalog 的流转闭环,高效支持 CDC 及全量离线同步,

数据集成演示

  • 离线数据集成

1. 以SeaTunnel 提供的fake 数据源测试批量数据写入 S3 Tables,首先编辑 SeaTunnel任务配置文件,Sink 配置为 Iceberg 连接器的 rest catalog,认证方式选择

aws ,配置 rest uri 及 warehouse为 S3 Tables 的 endpoint 。如下示例:

2.启动SeaTunnel 任务

3.查看任务运行日志

4.在 S3 Tables bucket 查看表,在 Athena 进行数据查询

  • 实时 CDC 数据集成

1.以MySQL cdc 数据源测试流式量数据写入 S3 Tables,首先编辑 SeaTunnel任务配置文件,Sink 配置为 Iceberg 连接器的 rest catalog,认证方式选择

aws ,配置 rest uri 及 warehouse为 S3 Tables 的 endpoint 。如下示例:

2.启动SeaTunnel 任务

3.查看任务运行日志,可以看到 cdc 完成一次快照拉取数据后在监听数据并进行数据摄入

4.同样可以在 Athena 查看数据

总结展望

随着Apache SeaTunnel对Iceberg和AWS S3 Tables的深度集成,企业数据湖架构将迎来更广阔的应用前景。未来,在数据湖构建过程中,生产环境可以引入SeaTunnel的监控措施,如集成Prometheus和Grafana进行实时指标监控(包括任务执行状态、数据吞吐率和错误日志),确保及时发现并响应潜在问题。同时,通过Kubernetes或Docker Swarm的弹性部署策略,实现SeaTunnel作业的自动缩放和故障转移,支持动态资源分配(如基于负载的Pod扩展),从而保证数据ETL流程的稳定性和高可用性。这不仅能减少手动干预,还能应对突发数据峰值,维持生产级别的可靠运行。此外,结合AWS的高级功能如Athena查询引擎或Glue Crawler的自动化发现,企业可以进一步优化Iceberg表的查询性能,例如启用S3的智能分层存储来降低成本,或集成Lake Formation的安全治理来强化数据访问控制。这些优化将使数据湖在BI分析和AI/ML准备中更具弹性,支持PB级数据的低延迟查询和模型训练。

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。


通过Amazon Q CLI 集成DynamoDB MCP  实现游戏场景智能数据建模

AWS账单代付阅读(40)

亚马逊AWS官方博客

通过Amazon Q CLI 集成DynamoDB MCP  实现游戏场景智能数据建模

前言

Amazon DynamoDB 是一项完全托管的 NoSQL 数据库服务,提供快速、可预测且可扩展的性能。作为一种无服务器数据库,DynamoDB 让开发者无需担心服务器管理、硬件配置或容量规划等基础设施问题,可以专注于应用程序开发。对于游戏行业而言,DynamoDB 的设计特性尤为适合:其低延迟数据访问(通常以个位数毫秒计)能够支持游戏中的实时交互;自动扩展功能可以轻松应对游戏上线或特殊活动期间的流量高峰;全球表功能支持多区域部署,为全球玩家提供一致的低延迟体验,而按需容量模式则使游戏开发商能够根据实际使用量付费,有效控制成本,这些特性使 DynamoDB 成为众多游戏公司使用 DynamoDB 作为游戏主数据库,来存储关键游戏数据。

在现代游戏开发中,数据架构设计往往是非常重要环节。传统的关系型数据库思维在面对DynamoDB这样的NoSQL数据库时,由于不熟悉可能会设计出性能低下、成本高昂的方案。本博客我们将通过一个完整的游戏项目案例,展示如何使用通过Amazon Q CLI 集成DynamoDB MCP (Model Context Protocol)工具,从客户需求出发,通过调研流程,最终生成高效的DynamoDB数据模型。

DynamoDB MCP是一个基于Model Context Protocol的智能数据建模工具,该工具作为 DynamoDB MCP服务器的一部分提供。DynamoDB MCP 数据建模工具与支持 MCP 的 AI 助手集成,提供结构化的自然语言驱动工作流,将应用程序需求转换为 DynamoDB 数据模型。该工具基于专家工程化的上下文构建,使用最新的推理模型指导用户掌握高级建模技术,它集成了AWS DynamoDB的最佳实践和专家经验,能够实现:

  • 通过专业调研表系统性收集业务需求
  • 基于访问模式自动识别聚合边界
  • 在性能和成本间找到最优平衡点 创建高效DynamoDB数据模型

通过将专家上下文与最新推理模型相结合,这种方法大大缩短了开发初始 DynamoDB 设计所需的时间。以前需要数天甚至数周的研究和迭代工作,现在可以加速到几十分钟内完成。

快速配置Q CLI 集成DynamoDB MCP

什么是 Amazon Q CLI?

Amazon Q CLI 是一款命令行工具,它将 Amazon Q 的强大功能引入命令行界面。借助 Amazon Q CLI,用户可以完成以下或更多工作:

  • 获取 AWS 服务的帮助与推荐建议
  • 诊断并解决 AWS 资源问题
  • 生成并解析 AWS CLI 命令
  • 以对话方式与 AI 助手交互
  • 使用前提

开始实验前,请确保已经在本地电脑安装了必要的工具

  • Amazon Q CLI is installed, instructions: 安装适用于命令行的 Amazon Q
  • AWS CLI 已安装并配置,操作说明:安装或更新最新版本的 AWS CLI

您拥有适当的 AWS 权限,可以创建和管理实验中使用到的资源。

开始和 Q CLI 进行对话

在终端会话中,使用以下命令开始与 Q CLI 进行对话:

q chat –trust-tools=fs_read,fs_write

集成DynamoDB MCP

  • 需要安装uvx 软件 安装请参考:安装uvx
  • 需要配置dynamoDB使用的环境变量:AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 配置请参考:配置dynamodb mcp server
  • 修改Q CLI MCP 配置文件:
  • 重新运行** **Q CLI (q chat) MCP ** **Server** **已经成功集成到** **Q CLI(** **如下图** **):

    通过Q CLI 集成DynamoDB MCP 实现游戏场景智能数据建模

    游戏场景介绍

移动游戏平台服务超过500万注册用户,其中50万为日活跃用户。在正常时段,平台处理约20,000 RPS的请求,但在热门赛事或新英雄发布期间,流量可能在几分钟内激增至50,000 RPS,同时仍需支持各种具有不同性能要求的访问模式。每天产生约25万场游戏对局,这种规模引入了几个关键的数据建模挑战:

流量波动性 – 热门赛事可能瞬间使负载增加三倍。传统数据库往往难以应对这种变化,但当数据模型设计时考虑到最优分区时,DynamoDB 的按需扩展能够吸收突然的流量峰值。

多样化访问模式 – 在我们的示例中,用户可以通过多种方式进行查询,如按玩家排名、按游戏历史,需要满足每种模式都有不同的性能特征。

建模需求采集和智能建模

步骤** **1:** **输入建模需求:

ddb_mcp_blog 目录作为工作目录,从该路径启动 Q CLI 对话窗口,输入提示词:

>使用我的数据建模 MCP 工具来帮助设计 DynamoDB 数据模型

可以看到 Q CLI 开始思考并提出建模相关的调研问题- 需要了解您的应用程序详情和访问模式需求:

输入y

步骤** **2:** **输入建模调研问题回答:

>

## ** **项目背景

我正在为一个高流量的移动MOBA游戏平台, 设计DynamoDB数据模型。目前使用MySQL,但希望迁移到DynamoDB来更好地处理极端规模和流量。

## ** **用户规模 ** **## ** **核心业务实体** **## ** **主要访问模式** **## ** **数据访问关联性** **## ** **特殊需求** **步骤** **3:** **DynamoDB MCP ** **会基于输入的调研信息** **创建模型需求文档** ** dynamodb_requirement.md

输入y

DynamoDB MCP ** **会基于以上输入的调研信息** **创建** **dynamodb_requirement.md** **备注:** **DynamoDB MCP ** **可能会提示更多的调研问题** ** :** **这时请输入:

>请基于以上输入信息建模 目前还不能提供更详细信息

步骤** **4:DynamoDB MCP ** **基于需求文档** ** dynamodb_requirement.md ** **智能建模** **生成** **dynamodb_data_model.md

输入y

DynamoDB MCP ** **会基于以上生成的需求文档** **dynamodb_requirement.md ** **创建** **dynamodb_data_model.md ** **同时总结核心设计亮点

采用** **DynamoDB MCP ** **生成的** **dynamodb_data_model.md ** **有以下几部分组成:** **设计理念与方法

核心原则:

  • 基于访问模式驱动的聚合设计
  • 根据数据访问相关性(95%、30%、90%)进行整合
  • 针对高流量MOBA游戏平台优化(峰值50,000 RPS)
  • 聚合策略:

  • 单项聚合:Player+Stats(95%关联)
  • 项目集合:Player+Items(30%关联)
  • 分离表:MatchHistory(15%关联,无界增长)
  • 表结构设计** **主要表设计:

  • PlayerProfile表:玩家档案+统计+道具的混合聚合
  • Match表:对局+玩家表现的单项聚合
  • MatchHistory表:独立的对局历史表
  • ActivePlayersLeaderboard GSI:稀疏索引的排行榜
  • 分区键策略:

  • 使用自然分布键(player_id、match_id)
  • 避免热分区问题
  • 支持识别关系模式
  • 访问模式映射** **10** **个核心模式全覆盖:

  • 登录查询:单次GetItem操作
  • 排行榜:稀疏GSI查询
  • 对局创建/更新:原子操作
  • 道具购买:事务写入
  • Match历史查询:时间范围查询
  • 查询效率:

  • 消除不必要的GSI
  • 使用识别关系 减少50%写入成本
  • 单次查询获取相关数据
  • 性能与成本优化** **热分区分析:

  • 所有模式保持在分区限制内(3,000 RCU/1,000 WCU)
  • 自然键分布确保负载均衡
  • 成本节省:

  • 稀疏GSI节省80%存储/写入成本
  • 聚合设计减少50%查询次数
  • 识别关系消除额外GSI开销
  • 权衡决策** **关键权衡:

  • 存储 vs 查询性能:选择适度非规范化的数据冗余
  • 一致性 vs 可扩展性:基于业务需求选择最终一致性
  • 复杂性 vs 成本:通过聚合简化操作降低成本
  • 优化选择:

  • 嵌入式PlayerPerformances实现原子更新
  • 排行榜 增加用户名 非规范化的数据冗余 避免额外查询
  • 分离MatchHistory 控制无界增长

这个设计在保证高性能的同时实现了成本优化,完全满足高流量游戏平台的需求。每个部分都遵循了DynamoDB MCP工具提供的标准模板结构,提供了完整的数据建模文档,涵盖了从设计理念到具体实现的所有关键方面。

模型设计关键设计原则:** **基于访问模式的聚合** **减少了查询往返次数

通过分析实际查询需求将频繁一起访问的数据组织在同一个聚合中,使原本需要多次数据库调用的操作,合并为单次查询。

例如本游戏应用中,95%的玩家登录场景需要同时获取玩家基本信息和统计数据,因此将Player和PlayerStats设计为单项聚合存储在PlayerProfile表中,用一次GetItem操作替代了两次独立查询。同时,Match和PlayerPerformances由于访问相关性也被合并为单项聚合,实现了对局结果的原子更新

识别关系** **最小化了对** **GSI** **的需求

当子实体在业务逻辑上完全依赖父实体存在且查询时总是通过父实体ID进行时,采用父实体ID作为分区键、子实体ID作为排序键的设计模式。如PlayerProfile表中的道具数据,使用PK=player_id, SK=ITEM#{item_id}的设计,通过Query(player_id)直接获取玩家所有道具。

MatchHistory表使用PK=player_id, SK=date#match_id支持玩家历史查询,这种识别关系设计消除了创建专门GSI的需要,降低了50%的写入成本和存储开销

单表设计** **提高了效率和可扩展性

将相关但访问相关性适中(30-70%)的实体通过不同排序键前缀组织在同一张表中,实现了数据的逻辑分离和物理共存。如PlayerProfile表中玩家道具采用项目集合设计,既支持获取完整玩家信息的单次查询,也允许独立查询道具清单,在保持查询灵活性的同时,优化了运营成本和表管理复杂度。

具体模型设计信息** **请参考** **DynamoDB MCP ** **生成的** **dynamodb_data_model.md** **文件** **下一步** **:** **可调用** **DynamoDB MCP ** **基于** **dynamodb_data_model.md ** **生成** **DynamoDB ** **表结构

总结

DynamoDB MCP是基于Model Context Protocol的智能数据建模工具,通过Amazon Q CLI集成,将Amazon专家经验与AI推理模型深度融合,将传统需要数天甚至数周的DynamoDB架构设计工作缩短至几十分钟。该工具采用聚合导向设计理念,自动化完成容量规划、热分区风险评估和成本优化,可为各行业各类应用场景,提供智能的DynamoDB数据模型设计。

相关博客推荐

初识 Amazon DynamoDB 数据建模 MCP 工具

其他产品和服务推荐

S-BGP 是我们在由光环新网运营的亚马逊云科技中国(北京)区域和由西云数据运营的亚马逊云科技中国(宁夏)区域推出的一项成本优化型网络服务,旨在帮助我们的客户降低经过互联网传输数据出云(Data Transfer Out)的费用。 如果您想申请亚马逊云科技中国区域的 S-BGP 服务,请联系您的客户经理获取进一步帮助。

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。


在亚马逊云科技中国区域利用 S3  Object Lambda 轻松实现自定义图片缩放

AWS账单代付阅读(41)

亚马逊AWS官方博客

在亚马逊云科技中国区域利用 S3  Object Lambda 轻松实现自定义图片缩放

在网站开发中,不同终端设备往往需要不同分辨率的图片资源。传统做法是预先存储多种尺寸的图片,但这会增加存储成本和管理复杂度, 利用中国区已上线的 S3 Object Lambda 功能,我们可以实现动态图片缩放:

  • 按需生成任意尺寸的图片
  • 无需预存多个版本
  • 利用 S3 内置功能, 不用维护额外的 API 接口
  • 通过文件名参数直接指定目标尺寸

该方案既节省了存储空间,又简化了图片管理流程,让图片缩放变得更加灵活高效

方案架构

  • 用户如需要访问S3 原始文件, 如 image1.jpg, 直接调用 S3 bucket 的 get object 方法即可.
  • 用户如需要对 S3 中的图片文件进行指定分辨率的缩放, 则调用 S3 Object Lambda Access Point 并将 key 指定为 image1_300x200.jpg
  • 实现步骤

本方案测试步骤选择宁夏区域 (cn-northwest-1)部署, 您也可以选择北京区域 (cn-north-1).

  • 创建存储桶, 设为 image-resize-bucket01 并上传一个图片文件, 测试图片文件可在代码仓库中下载 image1 (默认分辨率为1280×720)
  • 创建 S3 Access Point, name设为 s3-access-point 配置如下:

a.

Data source: image-resize-bucket01

b.

Network origin: Internet

c.

Block all public access (推荐测试时使用)

d.

Access Point policy (测试时不添加 policy, 保持空白)

  • 创建 Lambda Function Execution Role, name 设为 ResizeImageObjectLambdaRole

a. Trust relationships:

b.

c. Permission policies (创建自定义policy, 方案测试中没有指定 Resource, 生产环境中需要指定)

d.

  • 创建 Lambda function, name设为 resize-image-lambda, 配置如下:

a.

Runtime: python3.11

b.

Architecture: x86_64

c.

Execution role: 选用上一步创建的role

d. 创建完成后上传 zip文件.

e.

f. 上传后会自动部署代码.

  • 创建Object Lambda Access Point, name 设为 resize-image-olap

a.

Supporting Access Point: 选择上述步骤中创建的 s3-access-point

b.

S3 APIs: GetObject

c.

Invoke Lambda function: resize-image-lambda

d.

Object Lambda Access Point policy, 本方案测试中不进行设置, 保持空

e.

Block all public access (推荐测试时使用)

功能测试

取 Object Lambda Access Point 的 ARN:

AWS CLI:

aws s3api get-object –bucket {your_arn} –key image1_300x200.png image1.png

Boto3 api:

价格估算

假设图片大小平均为 200kb, 每次调用后下载的图片大小也为调用一次的价格分为如下几个部分:

  • S3 api get-object 调用费用: ¥ [已去除电话] 每笔请求
  • Lambda 调用费用: [已去除电话] (512mb/GB 每秒) + [已去除电话] 每次调用
  • DTO (Data Transfer Out): 0.933 /GB

假设每次调用耗时 1 s, 则1000次调用费用为 ¥0.24, 其中约 80%为 DTO 费用.

总结与展望

该方案简单易用, 只需配置 S3 相关功能和 Lambda 而无需引入额外服务. 以下是可以优化的方向:

成本优化

  • 如上文价格估算所述, 可以考虑压缩图片以降低 DTO 成本.
  • Lambda 基础配置可以进行评估和优化, 并非每次任务都需要 512 MB 以上内存.
  • 可以打包 ARM 版本的 Lambda Function 以降低成本.
  • 性能优化

  • 每次调用Object Lambda 时 Lambda 冷启动可能会造成较高延时, 可以考虑使用Lambda预置并发, 但成本也会相应上升.
  • 可以优化 Lambda Function 的 resize image 逻辑, 测试不同图片处理库以及不同编程语言.
  • 相关链接:

    *前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。


深度探索:EKS MCP Server 与 Amazon Q Developer CLI 集成实践

AWS账单代付阅读(39)

“又一次半夜被Kubernetes告警惊醒,我发现自己正在查阅第五个不同的文档,试图找出为什么集群中的一个关键服务突然不可用。”作为一名身处云原生转型前线的架构师,这样的经历对我而言曾是家常便饭。尽管Amazon EKS让Kubernetes部署变得更简单,但运维的复杂性和知识门槛仍然是许多团队面临的巨大挑战。然而,亚马逊云科技最新推出的AI驱动运维工具彻底改变了这一现状。在这篇文章中,我将分享如何利用这些革命性技术让Kubernetes管理变得像日常对话一样自然,以及这些工具如何帮助一个陷入运维困境的大型企业重获云原生之路的信心。

1. 云原生智能运维的新纪元

客户痛点:某消费电子行业制造商的EKS运维困境

近一年来,持续与一家大型消费电子制造商合作,他们在亚马逊云科技的北美及欧洲区域内共计部署了14个EKS集群来支持其研发、生产和供应链系统。尽管云原生技术为他们带来了巨大的灵活性和创新能力,但他们的运维团队正面临严峻挑战:

  • 专业知识短缺:团队中只有两名工程师精通Kubernetes,导致关键操作存在人员依赖
  • incident响应迟缓:生产环境问题平均解决时间超过3小时,影响业务连续性Best Practices
  • 运维人员倦怠:频繁的告警和复杂的故障排查导致团队疲惫Best Practices
  • 环境不一致:开发、测试和生产环境配置漂移,导致”在我机器上能运行”的问题
  • 文档滞后:快速迭代导致操作手册和知识库无法及时更新
  • 学习曲线陡峭:新加入的运维工程师需要3-6个月才能独立处理集群事务

其公司的运维总监向我坦言:”我们的工程师花费过多时间在重复性任务上,而非创新。每次Kubernetes或亚马逊云科技发布新功能,我们都需要大量学习时间。我们需要一种方法来降低管理EKS集群的复杂性,并使我们的整个团队能够高效操作,而不只是依赖少数专家。”

Kubernetes复杂性痛点与传统管理方法的局限

随着企业云原生架构的广泛采用,Kubernetes已经成为容器编排的事实标准。然而,Kubernetes的强大功能伴随着显著的技术复杂性,这为DevOps和平台工程团队带来了诸多挑战:

  • 陡峭的学习曲线:掌握Kubernetes需要深入理解其资源模型、网络模型和安全机制,这对新手来说尤其困难
  • API复杂性:Kubernetes拥有超过50种资源类型,各有不同的API版本和字段定义
  • 故障排查困难:当应用程序出现问题时,可能涉及多个组件和资源层级,导致根因分析耗时且复杂
  • 操作风险高:配置错误可能导致生产环境中断,尤其在多集群、多租户环境中
  • 配置管理挑战:随着集群和应用数量增加,手动管理配置变得越来越困难
  • 工具碎片化:需要使用多种命令行工具(kubectl, eksctl, aws cli等)和配置文件

传统的Kubernetes管理方法主要依靠命令行工具、声明式YAML配置和自动化脚本。这些方法虽然有效,但存在一系列局限:

  • 高度依赖专业知识:需要专家级别的Kubernetes和云服务知识
  • 缺乏上下文感知:工具不了解整个环境的状态,无法提供智能建议
  • 自动化脚本维护成本高:随着集群配置的变化,脚本需要不断更新
  • 跨团队协作障碍:不同经验水平的团队成员难以高效协作

AI驱动的DevOps转型:从工具到助手的演进

人工智能,特别是大型语言模型(LLM)的出现,正在彻底改变DevOps和云基础设施管理的方式。这一转变可以描述为”从工具到助手”的演进:

AI助手时代的特点:

  • 自然语言交互
  • 上下文感知和适应性
  • 关注”要做什么”而非”如何做”
  • 智能错误解释与指导
  • 能够理解模糊的需求并给出建议

亚马逊云科技的智能EKS管理解决方案代表了这一演进的前沿,它将Kubernetes专业知识与AI助手能力相结合,创建了一个更智能、更直观的云原生管理范式,正是消费电子行业客户所迫切需要的解决方案。

在本文中将深入探讨如何利用AI驱动工具来构建智能化EKS运维体系,以及这如何为我们的客户解决了长期困扰的集群管理难题,并提供了创建EKS集群、部署容器化应用、实时故障排查、性能监控与优化、EKS集群升级规划等5个实战案例来帮助您理解AI工具与EKS交互的方式,以及作为您实际应用中的参考。Amazon EKS MCP Server代表了这一演进的前沿,它将Kubernetes专业知识与AI助手能力相结合,创建了一个更智能、更直观的云原生管理范式。

2. 技术架构深度解析

Model Context Protocol (MCP)技术解析:连接LLM与基础设施的桥梁

Model Context Protocol (MCP)是一个开放协议,设计用于连接大语言模型(LLM)与外部工具和服务。它解决了LLM在实际应用中的一个核心限制:虽然这些模型拥有丰富的通用知识,但它们无法直接与实时系统交互或访问最新数据。

MCP的核心原理:

  • 工具调用标准化:定义了LLM如何发现、调用和使用外部工具的统一接口
  • 上下文共享机制:允许LLM和工具之间高效交换信息和状态
  • 双向通信流:支持从LLM到工具的调用,以及从工具到LLM的响应
  • 工具定义标准:提供描述工具功能、参数和约束的结构化方式

在EKS MCP Server中,MCP成为连接LLM(如Amazon Q)与Kubernetes基础设施的桥梁,使AI助手能够:

  • 理解和执行复杂的Kubernetes管理任务
  • 访问集群状态和资源信息
  • 生成和应用配置
  • 诊断问题并提供解决方案

这种集成彻底改变了工程师与Kubernetes的交互方式,从手动命令和YAML编写转变为自然语言对话和意图表达。

EKS MCP Server是基于MCP协议构建的专用服务,连接Amazon Q Developer CLI与Amazon EKS环境,提供Kubernetes管理功能。其核心能力如下,

  • 使AI代码助手的用户能够创建新的EKS集群,包括完成所有前提条件,如专用VPC、网络配置和EKS自动模式节点池,通过将请求转换为适当的CloudFormation操作实现。
  • 提供部署容器化应用程序的能力,可以通过应用现有的Kubernetes YAML文件,或根据用户提供的参数生成新的部署和服务清单。
  • 支持EKS集群内各种Kubernetes资源(如Pod、Service和Deployment)的完整生命周期管理,支持创建、读取、更新、补丁和删除操作。
  • 提供列出Kubernetes资源的功能,可按命名空间、标签和字段进行筛选,简化了用户和大语言模型(LLM)收集Kubernetes应用程序和EKS基础设施状态信息的过程。
  • 促进运维任务,如从特定Pod和容器中检索日志,或获取与特定资源相关的Kubernetes事件,为直接用户和AI驱动的工作流提供故障排除和监控支持。
  • 使用户能够排查EKS集群的问题。

EKS MCP Server的模块化设计确保了高度的可扩展性和可维护性,使系统能够适应不断变化的需求和环境。同时,其标准化的接口使Amazon Q能够通过自然语言理解用户意图,并将其转化为适当的Kubernetes操作,极大地简化了集群管理流程。让我们以以”查看EKS集群状态”为例,展示Amazon Q Developer CLI、LLM、MCP协议与EKS服务之间的完整交互流程和数据传递过程。

EKS MCP Server作为为AI代码助手,提供了完整的EKS和Kubernetes资源管理能力。简单来说,它让Amazon Q理解并可以直接

操作你的Kubernetes集群,从创建集群到部署应用,从监控到故障排除,全部通过自然语言对话完成。Amazon EKS MCP Server的核心愿景是实现AI驱动的云原生管理范式,通过将LLM的智能与Kubernetes的强大功能相结合,大幅提升运维效率和可靠性。

  • 技术门槛降低:
  • 将Kubernetes专业知识编码到工具中,降低入门壁垒
  • 通过自然语言简化复杂概念和流程
  • 效率显著提升:
  • 将小时级任务压缩至分钟或秒级
  • 自动化重复性工作流程
  • 减少上下文切换和工具切换开销
  • 一致性与可靠性保障:
  • 应用内置的最佳实践和安全措施
  • 减少手动操作错误
  • 提供可重复、可审计的操作记录
  • 智能故障排除:
  • 提供上下文感知的问题诊断
  • 自动关联日志、指标和事件
  • 建议针对性解决方案和预防措施
  • 全生命周期支持:
  • 从集群创建到应用部署再到监控维护
  • 覆盖开发、测试、生产全环节
  • 支持基础设施即代码(IaC)和配置管理
  • 适应性与可扩展性:
  • 支持多样化的EKS和Kubernetes环境
  • 可通过自定义工具扩展功能
  • 适应不断发展的云原生生态系统

通过这些价值主张,EKS MCP Server正在重新定义云原生管理的可能性,从传统的”工具驱动”向”意图驱动”模式转变,使组织能够更快速、更安全地实现云基础设施的价值。

3. 部署架构与环境配置

安装准备工作

在安装EKS MCP Server之前,需要确保您的环境满足以下前提条件:

3.1 系统要求

  • Python 3.10或更高版本
  • 有效的亚马逊云科技账户和凭证
  • 对目标EKS集群的访问权限
  • 3.2 环境配置

  • 配置AWS CLI并验证凭证
  • 确认IAM权限满足最低要求(EKS只读权限或更高)

IAM 只读权限策略,

{

“Version”: “2012-10-17”,

“Statement”: [

{

“Effect”: “Allow”,

“Action”: [

“eks:DescribeCluster”,

“cloudformation:DescribeStacks”,

“cloudwatch:GetMetricData”,

“logs:StartQuery”,

“logs:GetQueryResults”,

“iam:GetRole”,

“iam:GetRolePolicy”,

“iam:ListRolePolicies”,

“iam:ListAttachedRolePolicies”,

“iam:GetPolicy”,

“iam:GetPolicyVersion”,

“eks-mcpserver:QueryKnowledgeBase”

],

“Resource”: “*”

}

]

}

EKS Full Access权限策略(注意: 此处展示的是具有完全访问权限的策略,仅用于学习演示目的。在生产环境中,应当遵循最小权限原则,根据管理员职责范围和实际需求配置精细化的权限策略。通配符权限(eks:*)会授予对所有EKS资源的完全控制权,这在安全性方面存在潜在风险。建议在实际部署中限制特定操作和资源范围,以提高系统安全性。)

{

“Version”: “2012-10-17”,

“Statement”: [

{

“Effect”: “Allow”,

“Action”: “eks:*”,

“Resource”: “*”

}

]

}

3.3 Python环境准备

安装步骤详解,以下是安装EKS MCP Server的详细步骤:

git clone https://github.com/awslabs/mcp.git

cd mcp/src/eks-mcp-server

3.4 配置Amazon Q开发者设置

创建或编辑~/.amazon-q/config.json文件,此配置文件设置Amazon Q与EKS MCP服务器的交互方式。它指定了服务器运行命令、工作目录、环境变量以及自动批准的操作列表。通过这些设置,Amazon Q可以帮助开发者管理和监控EKS资源,而无需频繁进行权限确认。您可以根据实际需求调整路径、AWS配置文件和区域设置。”autoApprove”部分定义了哪些操作可以自动执行,增强使用体验的同时减少重复授权操作。:

{

“mcpServers”: {

“awslabs.eks-mcp-server”: { // 服务器标识名称,用于在Amazon Q中识别此EKS MCP服务器

“command”: “uv”, // 启动命令:使用uv作为Python包管理和运行工具

“args”: [

“run”, // uv子命令:运行Python应用

“–directory”, // 指定工作目录参数

“/Users/eks/mcp/src/eks-mcp-server”, // EKS MCP服务器的安装路径

“python”, // 使用Python解释器

“-m”, // 以模块方式运行

“awslabs.eks_mcp_server.server”, // 要运行的Python模块路径

“–allow-write”, // 允许写操作权限(创建/修改K8s资源)

“–allow-sensitive-data-access” // 允许访问敏感数据(如Secrets、日志等)

],

“env”: { // 环境变量配置,用于设置AWS和日志相关参数

“aws_PROFILE”: “default”,

// AWS配置文件名称,对应~/.aws/credentials中的profile

// 可以改为其他profile名称,如”production”、”development”等

“aws_REGION”: “us-east-1”,

// 默认AWS区域,EKS集群必须在此区域

// 常用区域:us-west-2, eu-west-1, ap-southeast-1等

“FASTMCP_LOG_LEVEL”: “INFO”

// 日志级别设置,控制输出的详细程度

// 可选值:DEBUG(最详细)、INFO(一般)、WARNING、ERROR(最少)

},

“autoApprove”: [

// 自动批准的工具列表,这些操作无需用户手动确认

// 注意:自动批准会降低安全性,请根据需要调整

“manage_eks_stacks”, // EKS CloudFormation堆栈管理:创建、更新、删除EKS集群

“manage_k8s_resource”, // Kubernetes资源管理:创建、更新、删除K8s对象(Pod、Service等)

“list_k8s_resources”, // 列出Kubernetes资源:查看集群中的各种资源状态

“get_pod_logs”, // 获取Pod日志:查看容器应用的运行日志,用于故障排查

“get_k8s_events”, // 获取Kubernetes事件:查看集群中发生的事件和警告

“get_cloudwatch_logs”, // 获取CloudWatch日志:查看EKS控制平面和节点日志

“get_cloudwatch_metrics”, // 获取CloudWatch指标:监控集群性能和资源使用情况

“get_policies_for_role”, // 获取IAM角色策略:查看EKS相关的权限配置

“search_eks_troubleshoot_guide”, // 搜索EKS故障排除指南:获取问题解决建议

“list_api_versions” // 列出Kubernetes API版本:查看集群支持的API版本

]

}

}

}

3.5 使用已安装的MCP Server

若已安装和配置EKS MCP Server,可通过Amazon Q Developer CLI直接使用:

q chat

在terminal输出如下

在Amazon Q交互界面中,您可以通过自然语言执行EKS管理任务,例如:

  • “列出我的EKS集群”
  • “在us-east-1创建一个新的EKS集群”
  • “显示default命名空间中的所有Pod”

尝试基本命令

在交互界面中输入任意语种的自然语言即可与Amazon Q Cli进行交互,比如以下示例我们均采用中文语言与Amazon Q Cli进行交互:

列出我所有的EKS集群

检查工具调用,您应该看到类似以下的输出:

我将为您列出EKS集群。

[工具调用: list_clusters]

region: us-east-1

在us-east-1区域找到以下EKS集群:

1. my-cluster-1 (1.30)

2. my-cluster-2 (1.31)

如果工具调用成功并返回结果,则表示安装和配置成功。

4. 实战案例:对话式EKS管理的威力

在这一章节,我们将通过几个实战案例,展示EKS MCP Server与Amazon Q Developer CLI的集成如何彻底改变Kubernetes管理体验。这些案例基于真实工作场景,展示了通过自然语言对话完成复杂EKS任务的强大能力。

4.1 案例一:零基础创建EKS集群

场景描述:一位开发人员需要创建一个新的EKS集群,但不熟悉CloudFormation模板或EKS配置细节。

对话实例

用户:

我需要在us-east-1区域创建一个名为”peculiar-funk-badger”的新EKS集群,带有3个节点,能帮我实现吗?

Amazon Q:

我可以帮你在us-east-1区域创建一个名为”peculiar-funk-badger”的EKS集群,包含3个节点。我会使用CloudFormation来完成这项工作。

首先,让我查看你当前的EKS集群情况,确认该名称未被使用。

[工具调用: manage_eks_stacks]

operation: describe

cluster_name: peculiar-funk-badger

我会为你创建EKS集群。这个操作将创建以下资源:

  • 一个VPC及其相关联的网络组件(子网、路由表、NAT网关等)
  • 必要的IAM角色和策略
  • EKS集群控制平面
  • 包含3个节点的EKS节点组

这个操作需要一些时间完成(通常15-20分钟)。你确定要创建这个集群吗?

[工具调用: manage_eks_stacks]

operation: deploy

cluster_name: peculiar-funk-badger

node_count: 3

region: us-east-1

已开始创建名为”peculiar-funk-badger”的EKS集群。

CloudFormation堆栈”eks-peculiar-funk-badger”正在创建中。

你可以通过AWS控制台或命令行工具监控创建进度。

完成时间预计为15-20分钟。

堆栈状态: CREATE_IN_PROGRESS

技术解析

在这个交互中,EKS MCP Server通过manage_eks_stacks工具完成了几个关键步骤:

  • 资源验证:检查集群名称是否已存在
  • 模板生成:自动生成适合的CloudFormation模板
  • 资源预估:向用户说明将创建哪些资源
  • 部署执行:调用 CloudFormation API创建所需资源

整个过程用户不需要了解任何CloudFormation语法或EKS资源配置细节,只需用自然语言表达意图即可。

4.2 案例二:部署容器化应用

场景描述:团队需要将一个简单的微服务部署到现有EKS集群,包括创建部署和服务。

对话实例

用户:

我想在peculiar-funk-badger集群的demo-ns命名空间中部署nginx,并通过LoadBalancer暴露服务,能做到吗?

Amazon Q:

我可以帮你在”peculiar-funk-badger”集群的”demo-ns”命名空间中部署nginx,并通过LoadBalancer暴露服务。

首先,让我检查这个集群和命名空间是否存在。

[工具调用: list_k8s_resources]

cluster_name: peculiar-funk-badger

kind: Namespace

api_version: v1

我没有找到”demo-ns”命名空间。我会先创建这个命名空间,然后部署nginx。

[工具调用: manage_k8s_resource]

operation: create

cluster_name: peculiar-funk-badger

kind: Namespace

api_version: v1

name: demo-ns

body: {“apiVersion”:”v1″,”kind”:”Namespace”,”metadata”:{“name”:”demo-ns”}}

命名空间”demo-ns”已创建成功。

现在,我将生成nginx部署和服务的YAML清单,并应用到集群。

[工具调用: generate_app_manifest]

app_name: nginx

image_uri: nginx:latest

output_dir: /tmp

port: 80

replicas: 2

cpu: “500m”

memory: “512Mi”

namespace: demo-ns

load_balancer_scheme: internet-facing

已生成应用清单:

  • Deployment: nginx
  • Service: nginx (LoadBalancer类型)

现在将这些清单应用到集群:

[工具调用: apply_yaml]

cluster_name: peculiar-funk-badger

yaml_path: /tmp/nginx-manifests.yaml

namespace: demo-ns

force: true

部署已成功完成!

你的nginx应用已在”peculiar-funk-badger”的”demo-ns”命名空间中部署,并通过LoadBalancer暴露。服务将需要几分钟来配置并获取外部IP地址。

你可以通过以下命令查看服务状态和IP地址:

[工具调用: list_k8s_resources]

cluster_name: peculiar-funk-badger

kind: Service

api_version: v1

namespace: demo-ns

name: nginx

服务详情:

  • 名称: nginx
  • 类型: LoadBalancer
  • 外部IP: a13b4c5d6e7f.us-east-1.elb.amazonaws.com (可能需要几分钟才会分配)
  • 端口: 80

技术解析

这个交互展示了多个工具的协同工作:

  • 环境验证:使用

list_k8s_resources检查命名空间是否存在

  • 资源创建:使用

manage_k8s_resource创建命名空间

  • 清单生成:使用

generate_app_manifest生成适当的Kubernetes YAML

  • 资源应用:使用

apply_yaml将资源应用到集群

  • 状态验证:再次使用

list_k8s_resources检查部署状态

整个过程展示了EKS MCP Server如何将复杂的Kubernetes部署流程简化为一次简单的对话交互,部署完成后的的应用架构图如下,

4.3 案例三:实时故障排查

场景描述:一个生产应用出现故障,开发人员需要快速排查原因。

对话实例

用户:

我的payment-service应用在production命名空间下似乎不工作了,能帮我找出问题吗?

Amazon Q:

我会帮你排查production命名空间中payment-service应用的问题。让我们逐步检查各种可能的故障点。

首先,让我查看deployment的状态:

[工具调用: list_k8s_resources]

cluster_name: peculiar-funk-badger

kind: Deployment

api_version: apps/v1

namespace: production

name: payment-service

我看到payment-service的deployment存在问题:

  • 期望副本数: 3
  • 可用副本数: 1
  • 就绪副本数: 1
  • 最新状态副本数: 3

这表明有2个pod无法正常启动。让我查看相关pod的状态:

[工具调用: list_k8s_resources]

cluster_name: peculiar-funk-badger

kind: Pod

api_version: v1

namespace: production

label_selector: app=payment-service

我找到了3个pod:

1. payment-service-7d8f9c6b5-abc12 (状态: Running)

2. payment-service-7d8f9c6b5-def34 (状态: CrashLoopBackOff)

3. payment-service-7d8f9c6b5-ghi56 (状态: CrashLoopBackOff)

有两个pod处于CrashLoopBackOff状态,这表明它们无法成功启动。让我检查其中一个失败pod的日志:

[工具调用: get_pod_logs]

cluster_name: peculiar-funk-badger

pod_name: payment-service-7d8f9c6b5-def34

namespace: production

tail_lines: 50

日志显示以下错误:

Error: could not connect to database at db-service:5432

failed to initialize database connection

retrying in 5 seconds…

Error: could not connect to database at db-service:5432

failed to initialize database connection

retrying in 5 seconds…

现在让我检查相关的Kubernetes事件,可能提供更多线索:

[工具调用: get_k8s_events]

cluster_name: peculiar-funk-badger

kind: Pod

name: payment-service-7d8f9c6b5-def34

namespace: production

我发现了问题所在!根据日志和事件分析:

1. payment-service无法连接到数据库服务(db-service)

2. 让我检查db-service是否存在并正常运行

[工具调用: list_k8s_resources]

cluster_name: peculiar-funk-badger

kind: Service

api_version: v1

namespace: production

name: db-service

我发现db-service存在,但没有对应的pod在运行。让我检查数据库deployment:

[工具调用: list_k8s_resources]

cluster_name: peculiar-funk-badger

kind: Deployment

api_version: apps/v1

namespace: production

name: db-service

数据库deployment存在问题:

  • 期望副本数: 1
  • 可用副本数: 0
  • 就绪副本数: 0

根据我的分析,问题是:

1. 数据库服务(db-service)的pod没有正常运行

2. 导致payment-service无法连接数据库而崩溃

3. 建议首先修复数据库部署问题

你要我进一步检查数据库pod的状态和日志吗?

技术解析

这个案例展示了EKS MCP Server在故障排查中的强大能力:

  • 系统分析:自动检查部署状态、Pod状态等关键指标
  • 日志收集:使用

get_pod_logs获取关键错误信息

  • 事件关联:通过

get_k8s_events收集相关事件

  • 根因分析:基于收集的信息推断问题根源
  • 关联服务检查:扩展到相关服务(数据库)的状态检查

整个过程模拟了有经验的Kubernetes工程师的思维方式,提供了系统性的故障排查流程。

4.4 案例四:性能监控与优化

场景描述:运维团队需要了解应用的资源使用情况,优化资源分配。

对话实例

用户:

我想了解inventory-ver1服务在过去30分钟的CPU和内存使用情况,以便我们优化资源配置

Amazon Q:

我会帮你获取过去30分钟inventory-ver1服务的CPU和内存使用情况。

首先,让我了解一下在查询容器指标时应该使用哪些指标和维度:

[工具调用: get_eks_metrics_guidance]

resource_type: pod

感谢您的耐心等待。现在我来查询api-gateway的CPU使用情况:

[工具调用: get_cloudwatch_metrics]

cluster_name: peculiar-funk-badger

metric_name: pod_cpu_utilization

namespace: ContainerInsights

dimensions: {“ClusterName”:”peculiar-funk-badger”,”PodName”:”inventory-ver1″}

minutes: 30

period: 60

stat: Average

接下来查询内存使用情况:

[工具调用: get_cloudwatch_metrics]

cluster_name: peculiar-funk-badger

metric_name: pod_memory_utilization

namespace: ContainerInsights

dimensions: {“ClusterName”:”peculiar-funk-badger”,”PodName”:”inventory-ver1″}

minutes: 30

period: 60

stat: Average

基于收集到的指标,我为你整理了inventory-ver1服务的资源使用情况:

CPU使用情况:

  • 平均使用率: 37.5%
  • 峰值使用率: 65.2% (在22:45出现)
  • 最低使用率: 12.3% (在22:30出现)

内存使用情况:

  • 平均使用率: 42.8%
  • 峰值使用率: 45.6% (持续稳定)
  • 最低使用率: 40.2% (启动阶段)

资源优化建议:

1. CPU资源: 目前的设置似乎合理,有足够的头部空间应对峰值,但不会过度浪费。如果当前设置为1000m (1 vCPU),可以考虑调整到750m,仍能应对当前负载。

2. 内存资源: 内存使用相对稳定,峰值仅为45.6%。如果当前设置为1Gi,可以安全降低到768Mi,为集群释放资源。

3. 扩展策略: 基于CPU使用模式,建议设置HPA (Horizontal Pod Autoscaler):

  • CPU目标使用率: 60%
  • 最小副本数: 2
  • 最大副本数: 5

你希望我帮你实施这些建议中的哪一个?或者你需要更多的数据分析?

技术解析

这个案例展示了EKS MCP Server在性能监控与优化方面的应用:

  • 指标指南获取:使用get_eks_metrics_guidance了解可用指标
  • CPU指标收集:使用get_cloudwatch_metrics获取CPU使用数据
  • 内存指标收集:同样获取内存使用数据
  • 数据分析:对收集的时序数据进行分析
  • 最佳实践建议:基于数据分析提供具体的资源优化建议

整个流程展示了如何将复杂的指标收集与分析转化为明确的操作建议。

4.5 案例五:EKS集群升级方案设计与规划

场景描述:

客户需要将业务关键型EKS集群从1.31版本升级到1.32版本,要求升级过程中不能影响线上业务。客户需要一个详细的升级规划方案,按照控制平面、插件组件(add-on)和数据平面的顺序进行升级。

对话实例

用户:

请帮我规划设计目前eks集群peculiar-funk-badger从1.31到1.32的升级方案,

在升级的过程中不能影响线上业务,目前只规划和设计,不需要执行升级。

Amazon Q:

我来帮您规划设计EKS集群peculiar-funk-badger从1.31到1.32的无中断升级方案。

首先让我获取当前集群的详细信息来制定合适的升级策略。

[工具调用: manage_eks_stacks]

operation: describe

cluster_name: peculiar-funk-badger

让我通过AWS CLI直接查看集群信息:

[工具调用: use_aws]

service: eks

operation: describe-cluster

parameters: {“name”: “peculiar-funk-badger”}

region: us-east-1

label: Get EKS cluster details

现在让我查看节点组信息:

[工具调用: use_aws]

service: eks

operation: list-nodegroups

parameters: {“cluster-name”: “peculiar-funk-badger”}

region: us-east-1

label: List EKS nodegroups

让我获取每个节点组的详细信息:

[工具调用: use_aws]

service: eks

operation: describe-nodegroup

parameters: {“nodegroup-name”: “mng”, “cluster-name”: “peculiar-funk-badger”}

region: us-east-1

label: Describe first nodegroup

[工具调用: use_aws]

service: eks

operation: describe-nodegroup

parameters: {“cluster-name”: “peculiar-funk-badger”, “nodegroup-name”: “x86-c6a-large-nodegroup”}

region: us-east-1

label: Describe second nodegroup

现在让我查看集群中运行的工作负载:

[工具调用: list_k8s_resources]

cluster_name: peculiar-funk-badger

kind: Deployment

api_version: apps/v1

现在让我查看集群中的插件信息:

[工具调用: use_aws]

service: eks

operation: list-addons

parameters: {“cluster-name”: “peculiar-funk-badger”}

region: us-east-1

label: List EKS addons

让我查看一些关键插件的版本信息:

[工具调用: use_aws]

service: eks

operation: describe-addon

parameters: {“addon-name”: “coredns”, “cluster-name”: “peculiar-funk-badger”}

region: us-east-1

label: Describe coredns addon

基于收集到的信息,我为您制定以下EKS集群peculiar-funk-badger从1.31到1.32的无中断升级方案:

EKS集群升级方案:peculiar-funk-badger (1.31 → 1.32)

当前集群状态分析

集群基本信息:

集群名称:peculiar-funk-badger

当前版本:1.31

创建时间:2025-05-07

状态:ACTIVE

认证模式:API

节点组配置:

mng:2个节点(最小2,最大2),使用自定义AMI

x86-c6a-large-nodegroup:1个节点(最小1,最大3),使用AL2_x86_64 AMI

关键工作负载:

业务应用:inventory-ver1, parking, review, nginx-simple(default命名空间)

Istio服务网格:istiod, istio-ingressgateway, grafana, kiali, jaeger, prometheus

系统组件:coredns, aws-load-balancer-controller, metrics-server等

升级策略与时间规划

阶段1:升级前准备(预计1-2小时)

1.1 兼容性检查

深度探索:EKS MCP Server 与 Amazon Q Developer CLI 集成实践

验证当前工作负载与1.32的兼容性

特别关注Istio 1.25.2与K8s 1.32的兼容性

1.2 备份关键配置

备份所有应用的YAML配置

导出重要的ConfigMap和Secret

记录当前插件版本和配置

1.3 扩容准备

将x86-c6a-large-nodegroup扩容至3个节点(为滚动升级提供缓冲)

确保有足够的计算资源处理工作负载迁移

阶段2:控制平面升级(预计30-45分钟)

2.1 升级EKS控制平面

aws eks update-cluster-version \

–region us-east-1 \

–name peculiar-funk-badger \

–kubernetes-version 1.32

影响评估:

控制平面升级期间API服务器会短暂不可用(通常<5分钟)

现有Pod不受影响,继续正常运行

新的Pod调度会暂停

阶段3:插件升级(预计45-60分钟)

3.1 核心插件升级顺序

vpc-cni → 1.32兼容版本

coredns → 1.32兼容版本

kube-proxy → 1.32兼容版本

aws-ebs-csi-driver → 最新兼容版本

metrics-server → 最新兼容版本

3.2 升级命令示例

aws eks update-addon \

–cluster-name peculiar-funk-badger \

–addon-name vpc-cni \

–addon-version <1.32-compatible-version> \

–resolve-conflicts OVERWRITE

阶段4:节点组升级(预计60-90分钟)

4.1 升级策略

采用滚动升级方式,确保业务连续性

先升级x86-c6a-large-nodegroup,再升级mng

利用maxUnavailable=1的配置逐个替换节点

4.2 节点组升级命令

升级x86-c6a-large-nodegroup

aws eks update-nodegroup-version \

–cluster-name peculiar-funk-badger \

–nodegroup-name x86-c6a-large-nodegroup \

–kubernetes-version 1.32

升级mng

aws eks update-nodegroup-version \

–cluster-name peculiar-funk-badger \

–nodegroup-name mng \

–kubernetes-version 1.32

业务连续性保障措施

1. Pod分布策略

确保关键应用(inventory-ver1, parking, review)的Pod分布在不同节点

利用Pod反亲和性规则避免单点故障

2. 健康检查增强

在升级期间增加应用健康检查频率

监控Istio网关和服务网格连通性

3. 流量管理

利用Istio的流量管理功能实现优雅的服务迁移

配置适当的超时和重试策略

4. 回滚准备

保留原始节点组配置

准备快速回滚脚本和流程

风险评估与缓解

1.主要风险

Istio兼容性:Istio 1.25.2可能需要更新以完全支持K8s 1.32

自定义AMI:mng使用自定义AMI,需要确保1.32兼容性

应用依赖:某些应用可能依赖特定的Kubernetes API版本

2.缓解措施

分阶段升级:先升级测试环境验证兼容性

蓝绿部署:考虑为关键应用实施蓝绿部署策略

监控告警:设置详细的监控告警机制

3.总体时间估算

总升级时间:3-4小时

业务影响:最小化,预期<5分钟的API服务器不可用

建议执行时间:业务低峰期(如凌晨2-6点)

4.升级后优化建议

节点组优化:升级完成后可以考虑统一节点组配置

资源调整:根据1.32的新特性调整资源配置

安全加固:应用1.32版本的安全最佳实践

这个升级方案确保了业务连续性,通过分阶段、滚动升级的方式最小化对线上服务的影响。建议在执行前先在测试环境进行完整的升级演练。

技术解析

这个案例展示了AI助手如何构建全面的EKS集群升级规划:

  • 系统性信息收集:通过多种工具全面收集集群状态,包括:
  • 集群核心配置(版本、平台版本等)
  • 节点组配置与容量
  • 运行中的工作负载状态
  • 现有插件版本与配置
  • 多维度分析与规划:基于收集到的数据进行深入分析,设计了符合最佳实践的升级路径:
  • 按照控制平面→插件→数据平面的严格升级顺序
  • 为每个阶段提供具体的命令和步骤
  • 对每个阶段可能的影响进行评估
  • 业务连续性设计:针对客户”不影响业务”的核心要求,设计了多层次的保护措施:
  • 节点扩容缓冲策略
  • 滚动更新与Pod分布策略
  • 基于Istio的流量管理
  • 全面的备份与回滚准备
  • 风险管理与监控:通过识别潜在风险点并提供缓解措施,结合详细的监控计划,确保升级过程可控可观测:
  • 识别关键组件兼容性风险
  • 设计分步验证流程
  • 提供具体的监控命令

这个案例展示了AI如何像经验丰富的云原生架构师一样,能够从简单的用户需求出发,通过系统性的信息收集和专业分析,生成一个全面、实用且符合AWS最佳实践的EKS升级方案。整个方案严格遵循控制平面→插件组件→数据平面的升级顺序,并特别关注业务连续性保障,体现了AI在复杂云基础设施管理中的实际应用价值。

4.6 实战案例总结

通过这些实战案例,我们可以看到EKS MCP Server与Amazon Q Developer CLI集成带来的显著优势:

  • 知识门槛降低:无需深入了解Kubernetes或EKS的复杂细节
  • 操作效率提升:通过自然语言完成复杂任务,无需记忆命令和参数
  • 智能化故障排查:系统性分析问题,提供专业级别的故障诊断
  • 决策支持增强:基于数据分析提供具体的优化建议

这种对话式Kubernetes管理方式特别适合以下场景:

  • 对Kubernetes不熟悉的开发团队
  • 需要快速解决问题的生产环境
  • 资源优化和性能调优
  • 复杂多集群环境管理

最重要的是,这种方式不仅提高了效率,也降低了操作错误的风险,为团队提供了一种更安全、更智能的云原生管理范式。

5. EKS MCP Server的价值与未来展望

在云原生时代,Kubernetes已成为容器编排的事实标准,而Amazon EKS作为托管Kubernetes服务,为众多企业提供了强大的容器部署平台。然而,Kubernetes的复杂性一直是阻碍其广泛采用的因素之一。EKS MCP Server的出现,标志着一种全新的交互范式诞生,它彻底改变了我们与EKS集群交互的方式。

EKS MCP Server通过将复杂的Kubernetes操作转化为自然语言对话,实现了从”命令式”到”意图式”的管理模式转变。这种转变意味着用户不再需要记忆大量命令、参数和YAML语法,而是可以直接表达他们的意图,由系统智能地解析并执行相应操作。

通过自然语言理解、智能工具集成和上下文感知等技术,EKS MCP Server正在重塑EKS集群管理的体验,使之更加直观、高效且富有洞察力。随着技术的不断成熟,我们有理由相信,这种”对话式Kubernetes管理”模式将成为未来云原生运维的主流范式。

在企业全面拥抱云原生架构的今天,EKS MCP Server提供了一条降低复杂性、提升效率、加速创新的道路。无论您是刚开始Kubernetes之旅,还是寻求优化现有EKS环境,EKS MCP Server都能为您提供显著价值,助力您在云原生时代保持竞争优势。

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。

本篇作者


Aurora MySQL 中的直方图:优化原理与实践

AWS账单代付阅读(33)

Aurora MySQL 中的直方图:优化原理与实践

前言

Amazon Aurora 是专为云构建的一种兼容 MySQL 和 PostgreSQL 的关系数据库,它既具有传统企业数据库的性能和可用性,又具有开源数据库的精简性和成本效益。Amazon Aurora 的速度可达标准 MySQL 数据库的五倍、标准 PostgreSQL 数据库的三倍。Amazon Aurora 由 Amazon Relational Database Service (RDS) 完全托管,Amazon RDS 可以自动执行各种耗时的管理任务。Amazon Aurora 采用分布式、有容错能力并且可以自我修复的存储系统,这一系统可以使每个数据库实例最高扩展到 128TB。它可实现高性能和高可用性,支持多达 15 个低延迟读取副本、时间点恢复、持续备份到 Amazon S3,以及跨三个可用区(AZ)复制。

MySQL 查询优化器作为数据库执行的核心组件,其生成高效执行计划的能力在很大程度上依赖于存储引擎所提供的统计信息质量。在数据管理过程中,像 InnoDB 和 MyISAM 这样的存储引擎会动态维护关键统计数据,包括表行数、列基数(即不同值的数量)以及索引分布等。这些信息对优化器的决策逻辑有着直接的影响。

在处理 WHERE 子句时,优化器会借助列基数来估算谓词选择性,进而决定是采用索引扫描还是全表扫描;而在多表连接的场景中,优化器会基于统计信息来评估不同连接顺序的成本,优先选择数据量小、过滤效率高的执行路径。

统计信息的准确性对执行计划的质量起着决定性作用。如果存储引擎提供的统计数据存在偏差,优化器就有可能做出错误的决策。在实际的业务场景中,我们常常会发现优化器预估的筛选条件比例与真实数据之间存在显著差异,这种偏差会导致生成次优的查询计划,最终表现为查询性能的严重下降。

以下是 MySQL 示例数据库中针对不同 WHERE 条件的筛选比例预估结果:

mysql> explain select count(*) from employees where birth_date > ‘1955-01-01’;

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

| 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 299423 | 33.33 | Using where |

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

mysql> explain select count(*) from employees where birth_date = ‘1955-01-01’;

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

| 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 299423 | 10.00 | Using where |

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

以下是实际符合筛选条件的比例。对比可见,优化器对筛选条件的预估比例与实际数据存在显著偏差:

mysql> SELECT SUM(birth_date > ‘1955-01-01’) AS filtered, COUNT(*) AS total, CONCAT(ROUND(SUM(birth_date > ‘1955-01-01’) / COUNT(*) * 100, 2), ‘%’) AS ratio FROM employees;

+———-+——–+——–+

| filtered | total | ratio |

+———-+——–+——–+

| 232658 | 300024 | 77.55% |

+———-+——–+——–+

1 row in set (0.10 sec)

mysql> SELECT SUM(birth_date = ‘1955-01-01’) AS filtered, COUNT(*) AS total, CONCAT(ROUND(SUM(birth_date = ‘1955-01-01’) / COUNT(*) * 100, 2), ‘%’) AS ratio FROM employees;

+———-+——–+——-+

| filtered | total | ratio |

+———-+——–+——-+

| 72 | 300024 | 0.02% |

+———-+——–+——-+

1 row in set (0.10 sec)

在本篇博客中,我们将深入探讨 Aurora MySQL 环境下如何借助直方图,为查询优化器提供更精准的数据分布预估,并通过 TPC-DS 基准测试中的查询,直观展示其对查询性能的优化提升效果。

MySQL中的直方图

直方图原理

直方图(Histogram)在数据库优化领域用于描述数据分布的关键工具。它通过将列数据划分为若干连续区间(Bucket),统计每个区间内数据的出现频率,从而直观呈现数据的分布特征。相较于仅记录总行数、列基数等基础统计信息,直方图能精准捕捉数据的非均匀分布特性。例如,在分析电商订单金额时,基础统计信息可能掩盖低价订单占比极高的分布规律,而直方图可清晰展现数据集中趋势,帮助优化器更准确地预估查询谓词的选择性,避免因错误估算数据规模而生成低效的执行计划。

直方图存在多种类型,MySQL 选择支持两种不同类型:等宽直方图(singleton)和等高直方图(equi-height)。所有直方图类型的共同点是将数据集划分为一组 “桶”。 等宽直方图针对低基数列,为每个唯一值创建一个桶,直接记录该值的出现频率;等高直方图则适用于高基数列,将数据划分为数据量大致相等的区间桶,每个桶包含相近数量的记录。MySQL 会自动将值划分到各个桶中,并且能够根据列的基数、数据分布等特征,自动决定创建何种类型的直方图。这种自动划分和类型选择机制,使得直方图能更精准地反映数据分布情况,为优化器提供更可靠的统计信息,从而助力生成更高效的查询执行计划。

创建直方图

使用带有UPDATE HISTOGRAM子句的ANALYZE TABLE语句可为指定表的列生成直方图统计信息,并将其存储在数据字典中。可选的WITH N BUCKETS子句用于指定直方图的桶数量,其中 N 必须是 1 到 1024 之间的整数;若省略该子句,桶数量默认为 100。而带有DROP HISTOGRAM子句的ANALYZE TABLE语句则用于从数据字典中删除指定表列的直方图统计信息。

例如,为employees表的birth_date列创建直方图:

mysql> analyze table employees update histogram on birth_date with 32 buckets;

+———————+———–+———-+——————————————————-+

| Table | Op | Msg_type | Msg_text |

+———————+———–+———-+——————————————————-+

| employees.employees | histogram | status | Histogram statistics created for column ‘birth_date’. |

+———————+———–+———-+——————————————————-+

1 row in set (1.21 sec)

直方图的存储

在 MySQL 中,直方图统计信息以 JSON 对象格式存储于数据字典,这种存储方式兼具灵活性与可读性。借助数据库内置的 JSON 函数,用户能够便捷地从直方图中提取所需信息。用户可直接从INFORMATION_SCHEMA.COLUMN_STATISTICS 视图查询直方图内容,该视图提供了访问列统计信息的标准化接口。通过查询该视图,不仅能了解直方图的类型、桶的数量,还能获取每个桶的具体数据范围和对应的频率分布,为分析数据分布特征、优化查询执行计划提供了直观且高效的途径。下面我们查询刚才创建的直方图的详细信息:

mysql> select JSON_PRETTY(HISTOGRAM) from INFORMATION_SCHEMA.COLUMN_STATISTICS where schema_name=’employees’ and table_name=’employees’ and column_name=’birth_date’;

……

{

“buckets”: [

[

“1952-02-01”,

“1952-06-26”,

[已去除电话]748605,

147

],

[

“1952-06-27”,

“1952-11-23”,

[已去除电话]17573,

150

],

[

“1952-11-24”,

“1953-04-21”,

[已去除电话]9848,

149

],

[

“1953-04-22”,

“1953-09-16”,

[已去除电话]41194,

148

],

[

“1953-09-17”,

“1954-02-14”,

[已去除电话]0953,

151

]

……

[

“1964-09-07”,

“1965-02-01”,

1.0,

148

]

],

“data-type”: “date”,

“null-values”: 0.0,

“collation-id”: 8,

“last-updated”: “2025-06-20 03:03:24.331824”,

“sampling-rate”: [已去除电话]0447,

“histogram-type”: “equi-height”,

“number-of-buckets-specified”: 32

}

可以看到MySQL在数据字典中存储了列的数据类型、更新时间、直方图的类型、桶的数量以及每个桶的范围和对应的数值占比。

直方图的效果

在示例数据表的birth_date字段创建直方图后,通过EXPLAIN工具对比分析优化器对两个查询条件的筛选度预估。可以看到,直方图创建后,优化器对符合条件的行数预估准确性显著提升。相较于创建前的显著偏差,新预估结果与实际数据分布的吻合度大幅提高。针对该列的数据分布特征调整直方图的桶数量,可进一步调整预估精度。

mysql> explain select count(*) from employees where birth_date > ‘1955-01-01’;

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

| 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 299423 | 77.67 | Using where |

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

1 row in set, 1 warning (0.01 sec)

mysql> explain select count(*) from employees where birth_date = ‘1955-01-01’;

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

| 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 299423 | 0.10 | Using where |

+—-+————-+———–+————+——+—————+——+———+——+——–+———-+————-+

1 row in set, 1 warning (0.00 sec)

查询优化实践

Amazon Aurora 是专为云构建的一种兼容 MySQL 和 PostgreSQL 的关系数据库,它既具有传统企业数据库的性能和可用性,又具有开源数据库的精简性和成本效益。Amazon Aurora 的速度可达标准 MySQL 数据库的五倍、标准 PostgreSQL 数据库的三倍。Amazon Aurora 由 Amazon Relational Database Service (RDS) 完全托管,Amazon RDS 可以自动执行各种耗时的管理任务。Amazon Aurora 采用分布式、有容错能力并且可以自我修复的存储系统,这一系统可以使每个数据库实例最高扩展到 128TB。它可实现高性能和高可用性,支持多达 15 个低延迟读取副本、时间点恢复、持续备份到 Amazon S3,以及跨三个可用区(AZ)复制。

我们此次使用Aurora MySQL 3.05.02 版本的 r7g.large 实例类型上,采用 scale factor 为 1 的 TPC-DS 数据集(整体数据库规模 1GB)进行测试。集群采用默认的参数组,该实例类型默认可用的buffer pool空间约8GB,此次测试中所有数据集驻留在 buffer pool 中。下面将通过 TPC-DS 中的两个查询,直观展示直方图对查询执行计划的优化影响。

Query 90

该查询为统计针对特定条件的客户上午与下午的销售的商品数量的比。

mysql> SELECT

CAST(amc AS DECIMAL(15,4))/CAST(pmc AS DECIMAL(15,4)) am_pm_ratio

-> CAST(amc AS DECIMAL(15,4))/CAST(pmc AS DECIMAL(15,4)) am_pm_ratio

-> FROM (

-> SELECT

-> COUNT(*) amc

-> FROM

-> web_sales,

-> household_demographics,

-> time_dim,

-> web_page

-> WHERE

-> ws_sold_time_sk = time_dim.t_time_sk

-> AND ws_ship_hdemo_sk = household_demographics.hd_demo_sk

-> AND ws_web_page_sk = web_page.wp_web_page_sk

-> AND time_dim.t_hour BETWEEN 9 AND 9+1

-> AND household_demographics.hd_dep_count = 2

-> AND web_page.wp_char_count BETWEEN 5000 AND 5200

-> ) at, (

-> SELECT

-> COUNT(*) pmc

time_dim,

web_page

WHERE

ws_sold_time_sk = time_dim.t_time_sk

AND ws_ship_hdemo_sk = household_demographics.hd_demo_sk

AND ws_web_page_sk = web_page.wp_web_page_sk

AND time_dim.t_hour BETWEEN 15 AND 15+1

AND household_demographics.hd_dep_count = 2

AND web_page.wp_char_count BETWEEN 5000 AND 5200

) pt

ORDER BY

am_pm_ratio

LIMIT 100; -> FROM

-> web_sales,

-> household_demographics,

-> time_dim,

-> web_page

-> WHERE

-> ws_sold_time_sk = time_dim.t_time_sk

-> AND ws_ship_hdemo_sk = household_demographics.hd_demo_sk

-> AND ws_web_page_sk = web_page.wp_web_page_sk

-> AND time_dim.t_hour BETWEEN 15 AND 15+1

-> AND household_demographics.hd_dep_count = 2

-> AND web_page.wp_char_count BETWEEN 5000 AND 5200

-> ) pt

-> ORDER BY

-> am_pm_ratio

-> LIMIT 100;

+————-+

| am_pm_ratio |

+————-+

| [已去除电话] |

+————-+

1 row in set (2.30 sec)

可以看到查询时间为2.3s。我们为web_page的wp_char_count字段创建直方图。

mysql> ANALYZE TABLE web_page UPDATE HISTOGRAM ON wp_char_count WITH 16 buckets;

+—————-+———–+———-+———————————————————-+

| Table | Op | Msg_type | Msg_text |

+—————-+———–+———-+———————————————————-+

| tpcds.web_page | histogram | status | Histogram statistics created for column ‘wp_char_count’. |

+—————-+———–+———-+———————————————————-+

1 row in set (0.00 sec)

重新执行该查询。

mysql> SELECT ……

+————-+

| am_pm_ratio |

+————-+

| [已去除电话] |

+————-+

1 row in set (0.63 sec)

可以看到执行时间缩短至0.63。我们对比一下,创建直方图前后的执行计划。

在创建直方图后,web_page的筛选比例从11.11%到1.74%。我们通过表中实际的符合筛选条件的行的比例。

mysql> SELECT (SELECT COUNT(*) FROM web_page WHERE web_page.wp_char_count BETWEEN 5000 AND 5200)/(SELECT COUNT(*) FROM web_page) AS ratio;

+——–+

| ratio |

+——–+

| 0.0167 |

+——–+

通过结果可以看到创建直方图之后预估的比例与实际数据更接近。优化器根据更准确的统计信息,调整了join的顺序,提升了查询的效率。

Query 61

该查询特定时区特定品类的商品在给定月份中有促销和无促销商品销售比例。

mysql> SELECT

-> promotions,

total,

CAST(promotions AS DECIMAL(15,4)) / CAST(total AS DECIMAL(15,4)) * 100

FROM

(SELECT

-> total,

-> CAST(promotions AS DECIMAL(15,4)) / CAST(total AS DECIMAL(15,4)) * 100

date_dim,

customer,

customer_address,

-> FROM

-> (SELECT

WHERE

ss_sold_date_sk = d_date_sk

-> SUM(ss_ext_sales_price) promotions

-> FROM

AND ss_promo_sk = p_promo_sk

AND ss_customer_sk = c_customer_sk

-> store_sales,

AND ca_address_sk = c_current_addr_sk

AND ss_item_sk = i_item_sk

-> store,

AND ca_gmt_offset = -5

AND i_category = ‘Sports’

-> promotion,

AND (p_channel_dmail = ‘Y’ OR p_channel_email = ‘Y’ OR p_channel_tv = ‘Y’)

AND s_gmt_offset = -5

-> date_dim,

AND d_year = 2002

-> customer,

AND d_moy = 11) promotional_sales,

(SELECT

SUM(ss_ext_sales_price) total

-> customer_address,

FROM

store_sales,

store,

-> item

date_dim,

-> WHERE

-> ss_sold_date_sk = d_date_sk

customer_address,

-> AND ss_store_sk = s_store_sk

ss_sold_date_sk = d_date_sk

AND ss_store_sk = s_store_sk

-> AND ss_promo_sk = p_promo_sk

AND ca_address_sk = c_current_addr_sk

AND ss_item_sk = i_item_sk

-> AND ss_customer_sk = c_customer_sk

-> AND ca_address_sk = c_current_addr_sk

AND s_gmt_offset = -5

-> AND ss_item_sk = i_item_sk

ORDER BY

promotions,

-> AND ca_gmt_offset = -5

-> AND i_category = ‘Sports’

-> AND (p_channel_dmail = ‘Y’ OR p_channel_email = ‘Y’ OR p_channel_tv = ‘Y’)

-> AND s_gmt_offset = -5

-> AND d_year = 2002

-> AND d_moy = 11) promotional_sales,

-> (SELECT

-> SUM(ss_ext_sales_price) total

-> FROM

-> store_sales,

-> store,

-> date_dim,

-> customer,

-> customer_address,

-> item

-> WHERE

-> ss_sold_date_sk = d_date_sk

-> AND ss_store_sk = s_store_sk

-> AND ss_customer_sk = c_customer_sk

-> AND ca_address_sk = c_current_addr_sk

-> AND ss_item_sk = i_item_sk

-> AND ca_gmt_offset = -5

-> AND i_category = ‘Sports’

-> AND s_gmt_offset = -5

-> AND d_year = 2002

-> AND d_moy = 11) all_sales

-> ORDER BY

-> promotions,

-> total

-> LIMIT 100;

+————+————+————————————————————————+

| promotions | total | CAST(promotions AS DECIMAL(15,4)) / CAST(total AS DECIMAL(15,4)) * 100 |

+————+————+————————————————————————+

| [已去除电话].26 | [已去除电话].41 | [已去除电话] |

+————+————+————————————————————————+

1 row in set (4.36 sec)

对store表内的时区字段增加直方图。

mysql> ANALYZE TABLE store UPDATE HISTOGRAM ON s_gmt_offset WITH 8 BUCKETS;

+————-+———–+———-+———————————————————+

| Table | Op | Msg_type | Msg_text |

+————-+———–+———-+———————————————————+

| tpcds.store | histogram | status | Histogram statistics created for column ‘s_gmt_offset’. |

+————-+———–+———-+———————————————————+

重新执行该查询,可以看到执行时间从4.36s降低到2.37s。

mysql> SELECT ……

+————+————+————————————————————————+

| promotions | total | CAST(promotions AS DECIMAL(15,4)) / CAST(total AS DECIMAL(15,4)) * 100 |

+————+————+————————————————————————+

| [已去除电话].26 | [已去除电话].41 | [已去除电话] |

+————+————+————————————————————————+

1 row in set (2.37 sec)

我们对比一下,创建直方图前后的执行计划。

store表的预估筛选比例从10%变为100%,这是因为测试数据内的store表内的时区全部符合筛选条件。根据统计信息,优化器调整了jion的顺序,对store表的访问方式也从表扫描调整为索引查找。新的查询计划效率更高,执行时间更短。

通过以上查询示例可以发现,Aurora MySQL的直方图特性(与社区版一致)通过统计列值分布信息,帮助优化器更精准评估数据选择性,从而生成更优的执行计划。尤其在处理低选择性列、范围查询或数据倾斜时,直方图能避免全表扫描或低效索引选择,显著提升复杂查询性能。

注意事项

在 Aurora MySQL 中使用直方图优化查询,需确保参数optimizer_switch中的condition_fanout_filter选项已开启。该选项在 Aurora 默认参数组中通常为启用状态(值为on)。若需关闭直方图功能,可使用ANALYZE TABLE table_name DROP HISTOGRAM ON column_name在表级别关闭或者通过修改参数组禁用condition_fanout_filter在集群级别关闭。

参数histogram_generation_max_mem_size控制生成直方图时的最大内存使用量,默认为[已去除电话] 字节(约 19MB)。数据库在创建或更新直方图时,会将表数据页读入内存并排序。对于超大型表,可通过调整该参数控制采样数据量。实际采样率与表的最大行长度相关,可通过查询INFORMATION_SCHEMA.COLUMN_STATISTICS视图的HISTOGRAM->’$.sampling-rate’获取具体数值。议根据实例内存配置和采样精度需求调整该参数,提升直方图生成效率。

与索引不同,直方图不会随数据变更自动更新,无需实时维护的特性避免了写入操作的额外开销。在大量数据插入、删除或更新操作后,需手动执行ANALYZE TABLE table_name UPDATE HISTOGRAM ON column_name。

直方图功能是 MySQL 8.0及后续版本引入的特性,在 Aurora MySQL 环境中,该功能对应支持于 Aurora MySQL 版本 3 及 Aurora Serverless v2。需要注意的是,当前 Aurora MySQL 版本 2 已进入扩展支持阶段,除常规的数据库集群运行费用外,还会按每 VPC 小时额外收取扩展支持费用。建议用户及时升级至 Aurora MySQL 版本 3,不仅能使用直方图等最新数据库特性,还能避免产生扩展支持费用。

参考资料:

Histogram statistics in MySQL

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。

本篇作者


使用Amazon Web Services Advanced JDBC Wrapper实现DBeaver SSO登录Amazon RDS PostgreSQL数据库

AWS账单代付阅读(34)

亚马逊AWS官方博客

使用Amazon Web Services Advanced JDBC Wrapper实现DBeaver SSO登录Amazon RDS PostgreSQL数据库

概述

在现代企业环境中,数据库安全和访问管理面临着严峻挑战。许多跨国企业使用DBeaver作为主要的数据库管理工具,但传统的本地用户名和密码登录方式已经无法满足日益严格的安全合规要求。企业安全合规部门对这种分散的认证方式提出了质疑,要求统一身份管理和访问控制。同时,大多数跨国企业已经采用Azure Active Directory (AAD)作为统一的身份提供商,但Amazon RDS PostgreSQL原生无法与AAD进行直接集成,这使得通过DBeaver实现单点登录(SSO)成为一个技术难题。企业迫切需要一个既能满足安全合规要求,又能简化用户认证流程的解决方案。

AWS Advanced JDBC Wrapper提供了一个强大的解决方案来应对这些挑战。通过其联合身份认证(Federated Authentication)插件和AWS IAM数据库认证功能,企业可以实现DBeaver与Amazon RDS PostgreSQL数据库的无缝SSO集成。该解决方案支持与多种身份提供商(包括Azure Active Directory、Active Directory Federation Services等)的集成,将外部身份认证与Amazon IAM角色进行映射,从而实现统一的身份管理。这不仅提高了数据库访问的安全性,还消除了管理多套用户凭证的复杂性,让企业能够通过现有的身份基础设施来控制数据库访问权限。

本文将详细介绍如何使用AWS Advanced JDBC Wrapper的联合身份认证插件,通过IAM认证方式实现DBeaver与Amazon RDS PostgreSQL数据库的SSO登录。我们将从环境准备开始,逐步讲解如何配置Azure Active Directory与AWS IAM的联合身份认证,设置RDS PostgreSQL数据库的IAM认证,以及在DBeaver中配置AWS Advanced JDBC Wrapper。通过本文的实践指南,企业技术团队将能够构建一个安全、合规且用户友好的数据库访问解决方案,满足现代企业对统一身份管理和数据库安全的双重需求。

方案架构

整个方案的架构核心组件

企业环境组件

该方案在企业环境中包含以下核心组件:

  • 企业用户:使用Active Directory账户的数据库管理员或开发人员
  • DBeaver客户端:配置AWS Advanced JDBC Wrapper驱动的开源数据库管理工具
  • AWS Advanced JDBC Wrapper:集成IAM身份认证、自动处理令牌刷新和连接故障转移的增强型JDBC驱动
  • ADFS:基于SAML 2.0协议验证用户身份并生成SAML断言的企业身份提供商

AWS身份认证组件

AWS云环境中的身份认证层包含:

  • IAM Identity Provider:建立与企业ADFS信任关系,验证SAML断言并映射企业用户到IAM角色
  • AWS STS:根据SAML断言颁发临时AWS凭据,支持角色假设功能,凭据有效期可配置15分钟至12小时
  • IAM角色:预配置包含RDS访问权限策略的角色,支持细粒度数据库权限控制

AWS数据库访问组件

数据库访问层的核心组件包括:

  • IAM数据库认证令牌:基于临时AWS凭据生成,有效期15分钟可自动刷新,使用AWS签名版本4算法替代传统密码认证
  • Amazon RDS PostgreSQL:启用IAM数据库认证功能的实例,配置数据库用户映射,支持SSL/TLS加密连接和完整审计日志
  • 联合身份认证的工作流程如下:

步骤1:启动数据库连接:企业用户在DBeaver中创建新的数据库连接,选择PostgreSQL数据库类型并配置RDS实例端点。

步骤2:使用JDBC Wrapper:DBeaver客户端加载AWS Advanced JDBC Wrapper驱动,设置包含IAM认证参数、区域和身份提供商信息的连接URL。

步骤3:重定向身份认证:AWS Advanced JDBC Wrapper检测到需要IAM认证后,重定向用户到企业ADFS,通过浏览器窗口或集成Windows认证完成身份验证。

步骤4:SAML断言生成:Active Directory Federation Services验证用户身份后生成SAML断言,包含用户身份信息、角色映射和有效期等关键属性。

步骤5:验证断言请求临时凭据:IAM Identity Provider接收并验证SAML断言的有效性和完整性,检查签名、有效期、发行者等SAML断言属性。

步骤6:假设IAM角色:AWS STS调用AssumeRoleWithSAML API,根据SAML断言中的角色信息假设相应的IAM角色。

步骤7:返回临时AWS凭据:AWS STS返回临时AWS凭据,包含AccessKeyId、SecretAccessKey、SessionToken和凭据过期时间。

步骤8:生成IAM认证令牌:AWS Advanced JDBC Wrapper使用临时AWS凭据调用RDS生成身份验证令牌API,基于AWS签名版本4算法生成15分钟有效期的认证令牌。

步骤9:使用IAM认证令牌连接:AWS Advanced JDBC Wrapper使用生成的IAM认证令牌作为密码连接RDS PostgreSQL,建立TLS 1.2+加密的安全数据库连接。

前提条件

在开始配置之前,请确保满足以下前提条件:

AWS环境准备

  • 一个已启用IAM数据库认证的Amazon RDS PostgreSQL实例
  • 配置好的AWS IAM SAML身份提供商
  • 具有数据库访问权限的IAM角色
  • 在数据库中创建的对应IAM用户
  • 软件依赖

  • DBeaver Community或Enterprise版本
  • AWS Advanced JDBC Wrapper 2.6.2或更高版本
  • 配置步骤

    步骤1:启用Amazon RDS PostgreSQL的IAM数据库认证

首先需要在Amazon RDS PostgreSQL实例上启用IAM数据库认证功能。

使用AWS CLI命令启用IAM数据库认证:

步骤2:创建IAM身份提供商

在AWS IAM中创建SAML身份提供商,用于与您的企业身份提供商(目前仅支持ADFS)建立信任关系。

使用AWS CLI创建SAML身份提供商:

步骤3:创建IAM角色和策略

创建一个IAM角色,该角色将被联合用户承担以访问RDS数据库。

首先创建信任策略文件trust-policy.json:

创建IAM角色:

创建RDS访问策略文件rds-policy.json:

创建并附加策略到角色:

步骤4:在数据库中创建IAM用户

连接到PostgreSQL数据库并创建对应的IAM用户:

步骤5:下载和配置AWS Advanced JDBC Wrapper

从GitHub下载AWS Advanced JDBC Wrapper的联合认证捆绑包:

https://github.com/awslabs/aws-advanced-jdbc-wrapper/releases/download/2.6.2/aws-advanced-jdbc-wrapper-2.6.2-bundle-federated-auth.jar

推荐使用捆绑版本(bundle-federated-auth),因为它包含了所有必需的依赖项,避免了手动管理依赖的复杂性。

步骤6:在DBeaver中配置连接

在DBeaver中创建新的数据库连接并配置联合身份认证参数。

配置步骤:

  • 在DBeaver中点击“新建连接”
  • 选择PostgreSQL数据库类型
  • 在“驱动程序设置”中添加aws-advanced-jdbc-wrapper-2.6.2-bundle-federated-auth.jar
  • 设置驱动程序类名为:software.amazon.jdbc.Driver
  • 点击”驱动程序属性”选项卡,添加以下关键属性:
  • 关键参数说明

以下是联合身份认证插件的关键参数配置:

|

参数名称 |

是否必需 |

描述 |

示例值

|wrapperPlugins

|是

|启用联合身份认证插件

|federatedAuth

|dbUser

|是

|数据库中的IAM用户名

|db_user_name

|idpUsername

|是

|身份提供商的用户名

|[已去除邮箱]

|idpPassword

|是

|身份提供商的密码

|your_password

|idpEndpoint

|是

|身份提供商的端点URL

|ec2amaz-ab3cdef.example.com

|iamRoleArn

|是

|要承担的IAM角色ARN

|arn:aws:iam::[已去除电话]:role/rds-federated-role

|iamIdpArn

|是

|IAM身份提供商ARN

|arn:aws:iam::[已去除电话]:saml-provider/adfs-example

测试连接

完成配置后,可以通过以下步骤测试SSO连接:

  • 在DBeaver中点击“测试连接”按钮
  • 认证成功后,系统将自动返回DBeaver
  • DBeaver显示连接成功并登录数据库
  • 故障排除

    常见问题

    问题1:连接超时

如果遇到连接超时问题,可以通过添加以下参数来调整超时设置:

&httpClientSocketTimeout=120000&httpClientConnectTimeout=120000

问题2:SSL证书验证失败

在测试环境中,如果遇到SSL证书验证问题,可以临时禁用SSL验证(不推荐在生产环境使用):

&sslInsecure=true

问题3:IAM权限不足

确保IAM角色具有正确的rds-db:connect权限,并且资源ARN与实际的数据库实例和用户名匹配。

最佳实践

  • 安全性:始终在生产环境中启用SSL/TLS加密
  • 权限管理:遵循最小权限原则,只授予必要的数据库权限
  • 监控:启用AWS CloudTrail和RDS性能洞察来监控数据库访问
  • 令牌缓存:合理设置令牌缓存时间,平衡安全性和性能
  • 备份认证:为关键系统配置备用认证方式
  • 总结

通过使用AWS Advanced JDBC Wrapper的联合身份认证插件,企业可以实现DBeaver与Amazon RDS PostgreSQL数据库的无缝SSO集成。这种方案具有以下优势:

  • 增强安全性:通过IAM认证和联合身份管理提高数据库访问安全
  • 简化管理:统一的身份认证和权限管理
  • 提升用户体验:无需记忆多个数据库密码
  • 符合合规要求:满足企业安全和合规标准
  • 易于维护:集中化的身份管理和访问控制

随着企业对数据安全和访问管理要求的不断提高,这种基于联合身份认证的解决方案将成为现代数据库管理的重要趋势。AWS Advanced JDBC Wrapper为企业提供了一个强大而灵活的工具,帮助实现安全、高效的数据库访问管理。

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。


利用AWS Bedrock构建智能报告生成Agent

AWS账单代付阅读(32)

亚马逊AWS官方博客

利用AWS Bedrock构建智能报告生成Agent

本文介绍通过AWS Bedrock构建报告生成Agent,用在ESG报告生成场景。

背景

在全球可持续发展趋势日益加强的背景下,环境、社会和公司治理(ESG)报告已从选择性披露转变为企业战略必备要素。随着全球主要金融市场监管机构和交易所逐步将ESG披露纳入强制要求,企业面临着前所未有的合规压力与利益相关方期望。然而,高质量ESG报告的编制工作面临两大核心挑战:

挑战一:国际ESG框架的复杂生态系统

当前全球ESG披露格局呈现多元化趋势,主流框架包括:

  • 全球报告倡议组织(GRI):市场采用率最高的综合性框架,包含近40个细分标准,涵盖通用披露(GRI 1-3)、经济(200系列)、环境(300系列)和社会(400系列)各维度
  • 可持续会计准则委员会(SASB):77个行业特定标准,侧重财务重要性评估
  • 气候相关财务信息披露工作组(TCFD):聚焦气候风险治理、战略、风险管理和指标目标四大支柱
  • 碳披露项目(CDP)、国际综合报告委员会(IIRC)、联合国全球契约(UNGC)和可持续发展目标(SDGs):各具特色的专项框架

这些框架各自建立了复杂的指标体系和披露要求,给企业报告编制带来巨大工作量。

挑战二:全球交易所差异化监管要求

各主要资本市场对ESG披露要求存在显著差异:

  • 香港交易所:实施”不遵守就解释”原则,设立特定ESG报告指引
  • 新加坡交易所:强制要求披露但允许自选框架
  • 纽约证券交易所:SEC气候披露规则依托TCFD框架
  • 伦敦证券交易所:高级上市公司需按TCFD要求披露气候信息
  • 上海证券交易所:发布本地ESG指引,鼓励参考国际标准

企业需在多种标准中权衡选择,且趋势显示需同时满足多框架要求,这使报告编制过程复杂度呈指数级增长。面对如此复杂的ESG报告编制环境,生成式人工智能(GenAI)技术正逐渐成为企业的战略性解决方案。以下是GenAI在ESG报告领域的关键价值:

  • 多框架数据整合与映射能力,GenAI系统可以同时理解和处理多个ESG框架的复杂要求,建立不同框架间的映射关系。这使企业能够一次数据收集,多框架报告生成,自动识别GRI、SASB、TCFD等框架间的重叠要求与独特指标,减少70%以上的跨框架数据处理时间
  • 监管合规性自动审核,随着各国监管要求不断演变,GenAI可以实时跟踪全球各交易所ESG披露规则更新,对报告内容进行合规性预审,识别潜在披露缺口,提供基于地区的合规性建议,避免违规风险
  • 行业基准与同业对标分析,GenAI能够分析公开ESG报告,提取行业最佳实践,建立动态的行业披露基准数据库,自动生成同业对标分析报告,发现差距与机会
  • 提升报告数据质量与一致性,ESG报告质量问题一直是投资者关注焦点。GenAI可以检测数据异常与前后报告期不一致情况,自动验证碳排放等计算数据的准确性,确保报告叙述与量化数据的逻辑一致性
  • 资源效率与时间成本优化,传统ESG报告编制往往耗时3-6个月,而GenAI能够将报告初稿编制时间缩短至数周,减少50%以上的人力资源投入,实现报告内容的快速更新与迭代

在ESG报告要求日益严格、框架日益复杂的环境下,GenAI已不再是可选工具,而是企业适应新ESG时代的必备能力。通过GenAI技术,企业不仅能够满足合规要求,更能将ESG报告转变为战略决策的信息源泉和竞争优势的展示平台。

AWS Bedrock赋能的智能报告生成Agent

当前,业界一直尝试使用LLM辅助生成ESG报告,在实践中遇到的问题有:

  • ESG报告篇幅较长,因LLM有token的限制,难以同时生成一份完整的ESG的报告
  • ESG报告标准较多,难以确保LLM生成的报告满足设定的标准
  • ESG报告生成需要参考多方面的资料,难以对多来源,多格式的参考资料进行统一管理

为解决以上的问题,我们设计了基于AWS Bedrock的智能ESG报告生成Agent。主要技术亮点有:

  • 使用Map-Reduce的范式,通过对报告的各个主题同时分别生成、最后汇总的方式,一方面解决了LLM的token限制问题,另一方面提升了报告生成的效率
  • 在主题报告生成时,使用 “报告生成 – 质量评估 – 迭代优化” 的闭环流程,确保每个主题报告的质量
  • 使用向量数据库存储各ESG报告框架标准、人工专家领域经验和大量的过往ESG报告数据,在报告生成时通过语义搜索查找出相关的内容作为报告生成的上下文,统一参考材料的管理。

以上3部分工作全部通过Agent方式实现,利用LangGraph的Map-Reduce、循环图和Tools调用等工作模式,结合AWS的Bedrock, OpenSearch, Lambda, EC2等云服务,实现了自动生成整份ESG报告,显著提升ESG报告编制效率与质量。

方案的架构图如下:

工作流程详解

方案的总体工作流程如下:

系统运行流程分为四个主要阶段:

1.初始化与参数配置

用户通过直观界面选择目标框架、细则项,并设定质量控制参数。系统支持模型切换,便于比较不同LLM在特定ESG主题上的表现差异。

2.** **数据输入与上下文构建

系统接收用户提供的企业ESG相关定量与定性数据,同时通过OpenSearch检索相关标准、最佳实践和历史报告片段,构建丰富的上下文环境。这一步骤确保生成内容符合行业规范且保持企业风格一致性。

用户数据输入例子:

3.** **智能并行处理

用户数据输入后,报告生成Agent进入conduct_report_prompts流程,根据用户选择的多条具体细则,组建各个具体细则的报告生成Prompt, 然后利用LangGraph的Map-reduce功能,将多组Prompt并行发送到gen_topic_report_agent。

Map-reduce发送Prompt的代码示例如下:

4.** **主题报告生成-** **评估流程

gen_topic_report_agent负责生成和评估各个细则报告,每个细则报告通过闭环评估系统确保质量达标:

  • 生成初始报告草稿
  • 基于专业ESG标准和人工专家经验评估内容质量
  • 根据评估结果提供具体改进建议
  • 迭代优化直至达到预设质量阈值

LangGraph的流程示意图如下:

代码示例如下:

报告评估标准参考如下:

当设定阈值等于3.5,最终经多轮生成-评估流程后,topic报告评估的结果如下:

最终评估结果3.95分大于设定阈值,得到该topic报告,退出该topic报告的生成-评估流程。

5.** **报告整合与最终输出

在所有的topic报告生成完成后,将汇总到generate_final_report节点,将各部分智能整合为结构一致、逻辑连贯的完整ESG报告,确保各章节间的衔接自然,数据引用一致,并保持整体风格统一。

报告节选参考如下:

应用价值与未来展望

通过整合生成式AI技术与云服务,我们成功解决了传统ESG报告编制中的核心挑战,包括框架复杂性、规范多样性及资源密集问题。Map-Reduce架构、闭环质量控制与语义搜索的结合,使系统能够高效生成符合多元国际标准的高质量报告,同时保持企业特色与专业准确性。

这种智能化解决方案不仅大幅降低了ESG报告编制的时间成本与人力投入,还提升了信息披露的质量与一致性,使企业能够在日益严格的ESG监管环境中从容应对各方需求,将合规压力转化为可持续发展战略优势。

关键启示

技术与专业知识融合至关重要

成功的AI辅助ESG报告需要在技术实现与ESG专业知识间取得平衡。单纯依靠技术无法理解披露背后的实质意义,而缺乏先进技术架构又无法实现规模化应用。

质量控制机制是核心

自动化不应以牺牲质量为代价。闭环评估体系确保了AI生成内容的准确性、合规性与专业性,这是赢得利益相关方信任的基础。

灵活可扩展的架构带来持久价值

ESG披露要求持续演变,基于AWS Bedrock的模块化架构使系统能够快速适应新标准、新框架与新要求,保障了投资回报的长期性。

上下文丰富度决定输出质量

向量数据库对专业内容的整合使AI能够基于更丰富的上下文生成报告,这一点对于专业性极高的ESG领域尤为重要。

实施难点与解决策略

数据质量与标准化挑战

难点:企业ESG数据往往分散在多个系统中,格式不一,质量参差不齐。

策略**:建立数据预处理流水线,开发标准化模板,利用ML模型进行数据异常检测和修正。 **行业特性适配

难点:不同行业ESG重要性议题差异显著,通用模型难以捕捉行业特性。

策略**:按行业构建专用知识库,利用few-shot学习针对特定行业进行模型微调。 **专家知识与LLM** **融合

难点:ESG专家经验难以完全编码到提示工程中。

策略**:采用人机协作模式,系统生成初稿后由专家审核,并将反馈循环纳入训练数据,持续改进模型表现。 **多框架衔接的复杂性

难点:不同ESG框架间的指标映射存在模糊区域,需要专业判断。

策略**:构建框架映射矩阵,标注确定性与模糊区域,在模糊区域提供多方案选择而非单一答案。 **合规性与可审计性保障

难点:AI生成内容需要确保可追溯性,以应对监管审查。

策略:实现完整的决策链跟踪,记录生成过程中的数据来源、推理步骤和参考依据。

未来,随着大模型技术与ESG实践的深度融合,我们预见AI辅助ESG报告将向更智能、更个性化、更前瞻性方向发展,不仅实现合规披露,更能提供深度ESG洞察,推动企业可持续发展战略的优化与实施。AWS Bedrock提供的可定制化云服务平台,为这一愿景的实现提供了坚实技术基础。

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。


AWS代付、代充值免实名

联系我们阿里云国际免实名