【问题标题】:Secrets manager extremely slow in EC2s via awscli and boto3通过 awscli 和 boto3 在 EC2 中的 Secrets Manager 极其缓慢
【发布时间】:2018-10-16 15:39:39
【问题描述】:

我正在用 pycharm 编写一个烧瓶 API。当我在本地运行我的代码时,使用 boto3 从秘密管理器获取秘密的请求不到一秒钟。但是,当我将代码放在 EC2 上时,大约需要 3 分钟(在 t2.micro 和 m5.large 中都试过)。

起初我认为这可能是 Python 问题,所以我通过 awscli 在我的 EC2 中运行它:

aws secretsmanager get-secret-value --secret-id secretname

大约花了 3 分钟。为什么会这样?这在理论上不应该在 EC2 中比在我的本地机器中更快吗?

编辑:这仅在 EC2 位于不同于默认 VPC 的 VPC 内时发生。

【问题讨论】:

  • 当您说“在与默认 VPC 不同的 VPC 内部”时,“慢速”VPC 是否有任何异常配置,例如通过公司网络而不是通过 Internet 直接连接到 Internet网关?仅仅作为一个“默认”VPC 应该不会有所作为。
  • 你有没有发现这里的问题是什么?我们在本地运行请求时遇到了同样的问题,但在 AWS 上没问题。

标签: amazon-web-services amazon-ec2 boto3 aws-cli aws-secrets-manager


【解决方案1】:

我从自己的计算机和 ap-southeast-2 区域中的 Amazon EC2 t2.nano 实例运行以下命令:

aws secretsmanager create-secret --name foo --secret-string 'bar' --region ap-southeast-2
aws secretsmanager get-secret-value --secret-id foo --region ap-southeast-2
aws secretsmanager delete-secret --secret-id foo --region ap-southeast-2

在这两种情况下,每个命令都会在一秒钟内返回。

补充:

为了测试您的情况,我做了以下(在悉尼地区):

  • 使用 VPC 向导创建了一个新 VPC(只是一个公共子网)
  • 在新 VPC 中启动了一个新的 Amazon EC2 实例,角色授予访问 Secrets Manager 的权限
  • 在实例上升级了AWS CLI(安装的版本不知道secretsmanager
  • 运行上述命令

他们都立即返回

因此,问题在于您的实例或 VPC。

【讨论】:

  • 我在我的 vpc 之外创建了 3 个全新的 EC2,我尝试使用的第一批 EC2 是否在 VPC 内?
  • “在我的 VPC 之外”是什么意思?它们位于何处无关紧要,只要它们可以访问 Internet。如果该命令最终起作用,那么这听起来不是问题。你可以打开debug选项(aws --debug secretsmanager...)看看是否有通讯问题。
  • 在默认 VPC 中,它具有不到一秒的常规行为。非默认 VPC 只有 0.0.0.0/0 和互联网网关之间的路由表,所以没有奇怪的配置。
  • 刚刚运行它,我可以看到它挂在 2018-05-07 00:46:37,700 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - INFO - Starting new HTTPS connection (1): secretsmanager.us-east-1.amazonaws.com ,然后在移动到 2018-05-07 00:49:37,855 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - DEBUG - "POST / HTTP/1.1" 200 447 后正好 3 分钟
  • 有什么想法吗?问题似乎仅在 VPC 内部,持续 3 分钟。每次调用 VPC 之外的 Secrets Manager 都可以正常工作。
【解决方案2】:

在我们的本地机器上解决同样的问题将近两个月后,我们今天终于取得了一些进展。

原来问题与 IPv6 有关。

如果您使用的是 IPv6,则机密管理器域将解析为 IPv6 地址。由于某种原因,cli 无法使用 IPv6 建立安全连接。超时后,cli 回退到 IPv4,然后成功。

要验证您是否解析到 IPv6 地址,只需 ping secretsmanager.us-east-1.amazonaws.com。不用担心 ping 响应,您只想查看域解析到的 IP 地址。

要解决此问题,您现在有 3 个选项:

  1. 找出您的网络问题。这可能是您的机器或路由器上的某些东西。如果在 AWS VPC 中,请检查您的路由表和安全组。确保您允许出站 IPv6 流量 (::/0)。
  2. 减少 cli 连接超时以使 IPv6 调用更快失败。这将使 IPv4 回退更快发生。您可能希望提供更好的超时值,但总体思路是添加如下内容:--cli-connect-timeout 1
  3. 禁用 IPv6。您可以在您的机器/路由器上完全禁用 IPv6,也可以将您的机器调整为首选 IPv4 用于此特定地址(请参阅:https://superuser.com/questions/436574/ipv4-vs-ipv6-priority-in-windows-7)。

最终,选项 1 是真正的解决方案,但由于它是如此广泛,其他可能会更容易。

希望这可以帮助其他人在遇到此问题时保持理智。

【讨论】:

  • 如果您在 EC2 VPC 中运行,还有另一种选择。您可以将 VPC 终端节点添加到 Secrets Manager 并选择本地 DNS。这将在您的 VPC 中创建一个仅具有 IP4 地址的终端节点,并修改 VPC 中的本地 DNS 以使 Secrets Manager 终端节点解析到该地址。最好的直接到 Secrets Manager 的所有流量路由。
【解决方案3】:

我在通过 Cisco AnyConnect VPN 客户端在家工作时遇到了这个问题。显然它会阻止任何 IPv6。

我的解决方案是在我的笔记本电脑上完全禁用 IPv6。

为 macOS 这样做:

networksetup -setv6off Wi-Fi  # wireless
networksetup -setv6off Ethernet  # wired

重新启用:

networksetup -setv6automatic Wi-Fi  # wireless
networksetup -setv6automatic Ethernet  # wired

【讨论】:

  • 这立即解决了我使用 Fortinet VPN 的本地问题。有趣的是,关闭再打开 IPv6 也有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-01-08
  • 2011-11-18
  • 2020-03-04
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
相关资源
最近更新 更多