【发布时间】:2018-06-16 13:21:50
【问题描述】:
我有一个网络负载均衡器和一个关联的目标组,它们被配置为对 EC2 实例进行运行状况检查。问题是我看到大量的健康检查请求;每秒多次。
检查之间的default interval 应该是 30 秒,但它们出现的频率比应有的高出大约 100 倍。
我的堆栈是在 CloudFormation 中构建的,我尝试覆盖 HealthCheckIntervalSeconds,但没有效果。有趣的是,当我尝试在控制台中手动更改间隔时,我发现这些值是灰色的:
这是模板的相关部分,我尝试更改间隔已被注释掉:
NLB:
Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
Properties:
Type: network
Name: api-load-balancer
Scheme: internal
Subnets:
- Fn::ImportValue: PrivateSubnetA
- Fn::ImportValue: PrivateSubnetB
- Fn::ImportValue: PrivateSubnetC
NLBListener:
Type : AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: forward
TargetGroupArn: !Ref NLBTargetGroup
LoadBalancerArn: !Ref NLB
Port: 80
Protocol: TCP
NLBTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
# HealthCheckIntervalSeconds: 30
HealthCheckPath: /healthcheck
HealthCheckProtocol: HTTP
# HealthyThresholdCount: 2
# UnhealthyThresholdCount: 5
# Matcher:
# HttpCode: 200-399
Name: api-nlb-http-target-group
Port: 80
Protocol: TCP
VpcId: !ImportValue PublicVPC
我的 EC2 实例位于私有子网中,外界无法访问。 NLB 是内部的,因此不通过 API 网关就无法访问它们。 API Gateway 没有配置 /healthcheck 端点,因此排除了来自 AWS 网络外部的任何活动,例如人们手动 ping 端点。
这是从 CloudWatch 获取的我的应用程序日志示例,而应用程序应该处于空闲状态:
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
我通常每秒收到 3 到 6 个请求,所以我想知道这是否正是网络负载均衡器的工作方式,而 AWS 仍然没有记录(或者我还没有找到),或以其他方式解决此问题。
【问题讨论】:
-
您有多少个 EC2 目标实例?他们是否将日志写入同一个 cloudwatch 流?
-
目前只有一个实例,但它们也被配置为写入由实例 ID 标识的日志。
-
您需要记录传入的健康检查请求的源IP地址。这向你展示了什么?平衡器是否检测到您的服务是健康的?
-
感谢@Michael-sqlbot,服务很健康。任何服务都无法在私有子网之外访问此端点。这是私有子网中的唯一实例,并且该实例没有公共 IP 地址。没有 Internet 网关,因此只能通过没有运行状况检查端点的 API Gateway VPC 链接进入。我所做的尝试是将目标组运行状况检查端点更改为无效的,然后实例立即停止将请求记录到 /healthcheck,证明它们都来自目标组检查,而不是其他任何东西。
-
我明白你的意思,但仍然建议你需要记录源IP。同时记录对等源端口。没有这些,您仍然在技术上推测它不可能是其他任何东西。
标签: amazon-web-services amazon-ec2 amazon-cloudformation amazon-elb