我在虚拟私有云(VPC)中的 Amazon CloudWatch 金丝雀收到错误并失败了。
简短描述
在 VPC 中创建金丝雀还会在指定的 VPC 子网中创建具有弹性网络接口的 AWS Lambda 函数。默认情况下,这些弹性网络接口即使已添加到公有子网中,也没有公有 IP 地址。要将日志写入 Amazon Simple Storage Service(Amazon S3),并将数据点发布到 CloudWatch,金丝雀必须有权访问以下端点:
- Amazon S3 端点
- CloudWatch 监控端点
如果您的金丝雀在访问这两个端点时出现问题,则您会收到以下其中一条错误消息:
- **TimeoutError: 已超过导航超时:已超过 30000 毫秒:**如果来自受监控端点的响应超过了为 page.goto 方法配置的超时时间,则您会收到此错误。例如,假设您的配置是“const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000});”。由于超时时间为 30 秒,因此超过 30 秒的响应会导致此错误。
-或-
如果安全组、网络访问控制列表(ACL)或路由表不允许访问金丝雀的端点,则您会收到此错误。
- 没有返回测试结果。30000 毫秒后连接超时以及**未上传任何构件:**如果您的金丝雀无权访问 CloudWatch 监控或 Amazon S3 端点,则您会收到这些错误。如果金丝雀指标中没有数据点,则您的金丝雀无权访问 CloudWatch 监控。如果金丝雀指标中有数据点,则您的金丝雀有权访问 CloudWatch 监控,但不能访问 Amazon S3。请注意,30000 毫秒反映了在金丝雀上配置的超时时间。
在任何时候,您都可以使用 VPC Reachability Analyzer 测试您的金丝雀的互联网连接。
解决方法
解决“导航超时”错误
确认附加到金丝雀的安全组具有下列属性:
- 它必须有一个出站规则,允许在已配置的端口和受监控端点的 IP 地址之间建立连接。
- 它必须允许流向端口 443 的出站流量。请注意,可通过 HTTPS 访问 Amazon S3 和 CloudWatch 监控端点。如有必要,请添加一个出站规则,使用 HTTPS(TCP 端口 443)作为类型,使用 0.0.0.0/0 作为目标。
- 金丝雀子网中的网络 ACL 必须允许入站和出站访问。
对于入站访问: 允许临时端口访问源地址和您的端点 IP 地址的端口。允许临时端口通过端口 443 访问 0.0.0.0/0。
对于出站访问: 允许访问目标地址和您的端点 IP 地址的端口。允许目标通过端口 443 访问 0.0.0.0/0。
- 确认您的端点在配置的超时时间内响应。
要查找您的端点响应时间,请运行下面的命令:
time curl http/(s)://[your Endpoint IP/DNS]:Port
在金丝雀代码中,将心跳超时更改为超过您的端点响应时间:
const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000});
解决“未上传任何构件”或“没有返回测试结果”错误
以 0.0.0.0/0 作为网络地址转换(NAT)网关或 NAT 实例将金丝雀添加到私有子网:
1. 创建 NAT 网关。
2. 更新金丝雀的私有子网路由表。有关在路由表中将 NAT 网关用作目标的信息,请参阅路由到 NAT 设备。
-或-
使用适用于 Amazon S3 和 CloudWatch 监控的 VPC 端点将金丝雀添加到私有子网:
1. 为 Amazon S3 端点创建网关端点。
注意:对于服务名称,搜索 Amazon S3,然后选择 com.amazonaws.region.s3。
2. 为 CloudWatch 监控端点创建接口端点。请务必选中启用 DNS 名称复选框。
注意:对于服务名称,搜索 monitoring,然后选择 com.amazonaws.[region].monitoring。请务必选中启用 DNS 名称复选框。