已解决:ap-southeast-2 中的 DynamoDB 错误
Source: Dev.to
请提供您希望翻译的正文内容,我将为您翻译成简体中文。
TL;DR
DynamoDB 在 ap‑southeast‑2 区域的错误,常表现为 ProvisionedThroughputExceededException 或连接超时,通常是由于特定可用区内的本地网络“灰色故障”,而非容量问题。解决方案包括快速重启实例以及更稳健的架构改进,如调优 AWS SDK 客户端超时并实现 DynamoDB Gateway VPC Endpoint 以实现私有网络连接。
为什么会发生
- AWS 区域 = 可用区(AZ)集合。
- 单个 AZ 中的“灰色故障”可能会导致 DynamoDB 连接中断,即使整个区域状态显示为绿色。
- AWS SDK 将
dynamodb.ap-southeast-2.amazonaws.com解析为针对调用者所在 AZ 进行延迟优化的 IP。如果该特定前端出现瞬时网络故障,只有该 AZ 中的实例会看到失败。
专业提示: 永远不要假设一个区域是单一的、整体的单点故障服务。要在任何单独的 AZ 内部进行故障架构设计。
事件(真实案例)
“凌晨 2:47。PagerDuty 报警。我们在悉尼(ap‑southeast‑2)的主要认证服务抛出
ProvisionedThroughputExceededException并出现连接 DynamoDB 的超时。prod‑users‑table的 CloudWatch 指标保持平坦——没有容量耗尽。我们一半的登录尝试失败。”
经过一小时的调试我们发现:
- 只有位于 AZ ap‑southeast‑2a 的实例出现故障。
- 2b 和 2c 区域的实例状态正常。
这正是 AWS “灰色故障”的经典特征:一种局部的、通常与网络相关的故障,却不会让 AWS 状态页面变红。
三个方案——从快速修复到长期解决方案
| # | 方案 | 使用时机 | 作用 |
|---|---|---|---|
| 1 | 重启出现故障的 EC2 实例 | 紧急情况,需要在几分钟内恢复服务 | 强制创建新的网络接口、新的出站 IP 和全新的 DNS 解析,通常可绕过故障的网络路径。 |
| 2 | 调优 AWS SDK 超时和重试策略 | 希望获得可持续、低成本的修复,且能降低影响范围 | 使客户端快速失败、积极重试,避免在不良连接上长时间卡住。 |
| 3 | 部署 DynamoDB Gateway VPC 端点 | 构建长期弹性且安全的架构 | 在你的 VPC 与 DynamoDB 之间建立私有、直接的连接,绕过公共互联网,消除大量网络相关故障。 |
Play #2 – 示例:激进的 SDK 配置(Python/Boto3)
# Example in Python using Boto3
from botocore.config import Config
from boto3 import resource
# Configure a more aggressive timeout and retry strategy
# • Connect timeout: 1 s
# • Read timeout: 1 s
# • Retries: 5 attempts with backoff
config = Config(
connect_timeout=1,
read_timeout=1,
retries={'max_attempts': 5}
)
# Pass this config when creating your client or resource
dynamodb = resource('dynamodb',
region_name='ap-southeast-2',
config=config)
table = dynamodb.Table('prod-users-table')
# All calls using `table` now inherit the new timeouts.
此更改可以将 30 秒的用户可见停机时间转变为快速失败并重试的情形,大多数用户根本不会注意到。
第3幕 – 将问题从根本上设计消除
DynamoDB 网关 VPC 端点
- 私有、直接连接 您的 VPC 与 DynamoDB。
- 流量保持在 AWS 私有网络中——永不经过公共互联网。
- 提高可靠性,降低延迟,并增加安全边界(无需 NAT/IGW 出站)。
实现步骤(高层次):
- 打开 VPC 控制台 → Endpoints → Create Endpoint。
- 选择 Service category: AWS services 并选中 com.amazonaws.ap-southeast-2.dynamodb。
- 将端点关联到相应的 子网 和 路由表。
- (可选)添加 策略 以限制可以访问的 DynamoDB 表。
- 更新应用程序的 SDK 配置以使用 VPC 端点(通常在 DNS 解析到端点后自动生效)。
结论
- 灰色故障 在单个可用区中可能伪装成容量问题。
- 快速修复: 重启受影响的实例。
- 短期弹性: 调整 SDK 的超时和重试。
- 长期稳健性: 部署 DynamoDB Gateway VPC 端点。
通过分层采用这些方法,即使单个可用区出现故障,也能让您的身份验证服务(或任何基于 DynamoDB 的工作负载)保持平稳运行。 🚀
DynamoDB 的 VPC 端点
创建 VPC 端点可绕过公共 DNS 解析以及导致“灰色失败”的不可预测网络路径。您的流量始终停留在 VPC 内部,从而实现 可靠 且 安全 的访问。
设置步骤
- 在 VPC 中创建网关端点。
- 将端点关联到承载应用实例的子网的路由表。
- 更新安全组,以允许通过端点的前缀列表访问 DynamoDB 服务。
这需要稍多的操作,但几乎可以消除此类问题,同时保持数据库流量不经互联网。
解决方案选项
| # | 解决方案 | 工作量 | 有效性 | 使用时机 |
|---|---|---|---|---|
| 1 | Reboot Instance | 非常低 | 低(临时修复) | 在活跃事件期间恢复单个节点 |
| 2 | Tune SDK Client | 低 | 高(处理大多数情况) | 应作为所有生产应用的标准实践 |
| 3 | VPC Endpoint | 中等 | 非常高(架构性修复) | 对可靠性和安全性至关重要的关键生产工作负载 |
TL;DR
当你遇到奇怪的、特定地区的 DynamoDB 错误时:
- 不要立刻把错误归咎于你的代码或容量规划。
- 检查是哪几个可用区(AZ)出现故障。
- 如果问题频繁出现或影响生产可靠性,考虑使用 VPC 端点。
记住:云其实是别人的电脑,有时这些电脑之间的网络线会稍微松动。
👉 阅读原文于 TechResolve.blog
☕ 支持我的工作
如果这篇文章对你有帮助,你可以请我喝杯咖啡:
👉