通过 awscli 和 boto3 在 EC2 中 Secrets Manager 极其缓慢
Secrets manager extremely slow in EC2s via awscli and boto3
我正在 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 内时才会发生这种情况。
我 运行 从我自己的计算机和 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(只是一个 public 子网)
- 在新 VPC 中启动了一个 新 Amazon EC2 实例,具有访问 Secrets Manager
的角色 g运行ting 权限
- 在实例上升级了 AWS CLI(安装的版本不知道
secretsmanager
- 运行以上命令
他们都立即返回。
因此,问题出在您的实例或您的VPC 上。
在我们本地机器上为同样的问题奋斗了将近两个月之后,我们今天终于有了一些进展。
原来是IPv6的问题
如果您使用的是 IPv6,则机密管理器域将解析为 IPv6 地址。由于某种原因,cli 无法使用 IPv6 建立安全连接。超时后,cli回退到IPv4,然后成功。
要验证您是否正在解析 IPv6 地址,只需 ping secretsmanager.us-east-1.amazonaws.com。不要担心 ping 响应,您只想查看域解析到的 IP 地址。
要解决此问题,您现在有 3 个选择:
- 找出您的网络问题。这可能是您的机器或路由器上的东西。如果在 AWS VPC 中,请检查您的路由表和安全组。确保允许出站 IPv6 流量 (::/0)。
- 减少 cli 连接超时,使 IPv6 调用失败更快。这将使 IPv4 回退更快发生。你可能想给一个更好的超时值,但一般的想法是添加这样的东西:
--cli-connect-timeout 1
- 禁用 IPv6。您可以在您的 machine/router 上完全禁用 IPv6,或者您可以调整您的机器以针对此特定地址优先使用 IPv4(参见:https://superuser.com/questions/436574/ipv4-vs-ipv6-priority-in-windows-7)。
最终,选项 1 是 真正的 解决方案,但由于它是如此广泛,其他选项可能更容易。
希望这可以帮助其他人在遇到此问题时保持理智。
我在家通过 Cisco AnyConnect VPN 客户端工作时遇到了这个问题。显然它会阻止任何 IPv6。
我的解决方案是在笔记本电脑上完全禁用 IPv6。
为 macOS 这样做:
networksetup -setv6off Wi-Fi # wireless
networksetup -setv6off Ethernet # wired
重新启用:
networksetup -setv6automatic Wi-Fi # wireless
networksetup -setv6automatic Ethernet # wired
我正在 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 内时才会发生这种情况。
我 运行 从我自己的计算机和 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(只是一个 public 子网)
- 在新 VPC 中启动了一个 新 Amazon EC2 实例,具有访问 Secrets Manager 的角色 g运行ting 权限
- 在实例上升级了 AWS CLI(安装的版本不知道
secretsmanager
- 运行以上命令
他们都立即返回。
因此,问题出在您的实例或您的VPC 上。
在我们本地机器上为同样的问题奋斗了将近两个月之后,我们今天终于有了一些进展。
原来是IPv6的问题
如果您使用的是 IPv6,则机密管理器域将解析为 IPv6 地址。由于某种原因,cli 无法使用 IPv6 建立安全连接。超时后,cli回退到IPv4,然后成功。
要验证您是否正在解析 IPv6 地址,只需 ping secretsmanager.us-east-1.amazonaws.com。不要担心 ping 响应,您只想查看域解析到的 IP 地址。
要解决此问题,您现在有 3 个选择:
- 找出您的网络问题。这可能是您的机器或路由器上的东西。如果在 AWS VPC 中,请检查您的路由表和安全组。确保允许出站 IPv6 流量 (::/0)。
- 减少 cli 连接超时,使 IPv6 调用失败更快。这将使 IPv4 回退更快发生。你可能想给一个更好的超时值,但一般的想法是添加这样的东西:
--cli-connect-timeout 1
- 禁用 IPv6。您可以在您的 machine/router 上完全禁用 IPv6,或者您可以调整您的机器以针对此特定地址优先使用 IPv4(参见:https://superuser.com/questions/436574/ipv4-vs-ipv6-priority-in-windows-7)。
最终,选项 1 是 真正的 解决方案,但由于它是如此广泛,其他选项可能更容易。
希望这可以帮助其他人在遇到此问题时保持理智。
我在家通过 Cisco AnyConnect VPN 客户端工作时遇到了这个问题。显然它会阻止任何 IPv6。
我的解决方案是在笔记本电脑上完全禁用 IPv6。
为 macOS 这样做:
networksetup -setv6off Wi-Fi # wireless
networksetup -setv6off Ethernet # wired
重新启用:
networksetup -setv6automatic Wi-Fi # wireless
networksetup -setv6automatic Ethernet # wired