繁体   English   中英

AWS:没有一个实例在发送数据

[英]AWS: None of the Instances are sending data

我正在尝试使用 Amazon Web 服务设置 Elastic Beanstalk 应用程序,但是我收到大量错误消息None of the instances are sending data 我尝试使用示例应用程序多次删除 Elastic Beanstalk 应用程序和 EC2 实例,然后重试,但我遇到了同样的错误。

我还尝试使用 AWS Elastic Beanstalk 命令行工具上传 flask 应用程序,但随后收到以下错误:

Environment health has transitioned from Pending to Severe. 100.0 % of the requests to the ELB are failing with HTTP 5xx. Insufficient request rate (0.5 requests/min) to determine application health (7 minutes ago). ELB health is failing or not available for all instances. None of the instances are sending data

为什么会出现此错误以及如何修复它? 谢谢。

您正在使用增强型健康监测 通过增强的健康监控,安装在 EC2 实例上的代理会监控重要的系统和应用程序级别的健康指标,并将它们直接发送到 Elastic Beanstalk。

当您看到“没有任何实例正在发送数据”之类的错误消息时,这意味着实例上的代理已崩溃,或者由于网络错误或其他一些错误而无法将数据发布到 Elastic Beanstalk。

为了调试这个,我建议从 AWS 控制台下载“完整日志”。 您可以按照此处的“从 Elastic Beanstalk 控制台下载捆绑日志”部分中的说明获取日志。 如果由于任何原因无法使用控制台下载日志,您还可以通过 ssh 连接到实例并查看/var/log

您将在/var/log/healthd/daemon.log找到健康代理的日志。 对这种情况有用的其他日志是/var/log/cfn-init.log/var/log/eb-cfn-init.log/var/log/eb-activity.log 您能否查看日志并提供您看到的错误的更多详细信息? 这应该有望为您提供有关“没有任何实例正在发送数据”错误的更多详细信息。

关于您看到的其他健康“原因”:

  • 环境运行状况已从 Pending 转变为 Severe - 这是因为最初您的环境运行状况状态为Pending 如果实例在宽限期内未运行正常,则健康状态将转换为Severe 在您的情况下,由于没有一个实例是健康的/正在发送数据,因此健康状况转变为严重。

  • 对 ELB 的 100.0% 请求失败,HTTP 5xx。 请求率(0.5 个请求/分钟)不足以确定应用程序运行状况(7 分钟前)。 使用增强的运行状况监控时,Elastic Beanstalk 会监控除您的 EC2 实例之外的其他资源。 例如,它监控 ELB 的 cloudwatch 指标。 此错误意味着发送到您的环境 CNAME/负载平衡器的所有请求都因 HTTP 5xx 错误而失败。 同时请求率非常低,每分钟只有 0.5 个请求,所以这表明即使所有请求都失败了,请求率也很低。 “7 分钟前”意味着有关 ELB 指标的信息有点旧。 由于 Elastic Beanstalk 每隔几分钟监控一次 cloudwatch 指标,因此数据可能会稍微过时。 这与我们直接从 EC2 实例获得的“近乎实时”的健康数据相反。 在您的情况下,由于实例未发送数据,因此唯一可用的健康来源是延迟了大约 7 分钟的 ELB 指标。

  • ELB 运行状况失败或不适用于所有实例Elastic Beanstalk 正在查看您的 ELB 的运行状况,即它正在检查有多少实例在 ELB 后面服务。 在您的情况下,ELB 后面的所有实例都已停止服务,或者由于其他原因导致运行状况不可用。 您应该仔细检查您的服务角色是否配置正确。 您可以在此处文档中阅读如何正确配置服务角色。 您的应用程序可能无法启动。

在您的情况下,我建议关注第一个错误“没有任何实例正在发送数据”。 为此,您需要查看上述日志。 让我知道你在日志中看到了什么。 代理在实例的引导过程中相当早地启动。 因此,如果您看到“没有任何实例正在发送数据”之类的错误,则很可能是引导程序失败或代理因某种原因无法启动。 日志应该告诉你更多。

还要确保在您的环境中使用实例配置文件。 实例配置文件允许在您的 EC2 实例上运行的运行状况代理使用 Elastic Beanstalk 进行身份验证。 如果实例配置文件未与您的环境关联,则代理将无法将数据发送到 Elastic Beanstalk。 在此处阅读有关使用 Elastic Beanstalk 的实例配置文件的更多信息。

更新健康原因“所有实例均未发送数据”的一个常见原因可能是您的实例位于 VPC 中,而您的 VPC 不允许 NTP 访问。 此问题的典型指标是/var/log/messages: ntpdate: Synchronizing with time server: [FAILED]的以下消息/var/log/messages: ntpdate: Synchronizing with time server: [FAILED] 发生这种情况时,您的 EC2 实例上的时钟可能会不同步,数据将被视为无效。 您还应该在 AWS Web 控制台的运行状况页面上的实例上看到运行状况原因,告诉您实例时钟不同步。 解决方法是确保您的 VPC 允许访问 NTP。


健康代理无法发送任何数据的原因可能有很多,所以这可能不是您问题的答案,但它是我的,希望可以帮助其他人:

我遇到了同样的错误并查看/var/log/healthd/daemon.log重复报告以下内容:

sending message(s) failed: (Aws::Healthd::Errors::GroupNotFoundException) Group 97c30ca2-5eb5-40af-8f9a-eb3074622172 does not exist

这是由于我在 Elastic Beanstalk 环境中制作和使用来自 EC2 实例的 AMI 映像造成的。 也就是说,我创建了一个临时环境,其中一个实例的配置与我的生产环境相同,进入 EC2 控制台并创建了实例的映像,终止了临时环境,然后使用新的自定义 AMI 创建了另一个环境。

当然(事后看来)这意味着临时环境的一些设置仍在使用中。 在这种情况下,特别是/etc/healthd/config.yaml ,导致健康代理尝试将消息发送到不再存在的健康组。

为了解决这个问题并确保周围没有其他陈旧的配置,我改为从生产环境中使用的默认 AMI 手动启动一个新的 EC2 实例(在您环境的“实例”配置页面下找到它),进行配置,然后从中创建一个新图像并在我的新 EB 环境中使用该图像。

检查您的实例类型的 RAM 是否足以用于 app + os + amazon 工具。 我们受苦了很长时间,当我们发现 t2.micro 几乎不足以满足我们的用例时。 使用 t2.small (2GB) 后问题就消失了。

我通过添加另一个安全组(我的 Elastic Beanstalk 的默认安全组)解决了这个问题。

看来我的问题是我没有将公共 IP 地址与我的实例相关联......在我设置它之后它工作得很好。

我只是将负载平衡的路径设置为响应状态代码 200 的 URL,仅用于研究环境。

对于我的真实应用程序,我使用执行器

如果您看到类似这样的内容而您没有获得任何增强的指标,请检查您是否不小心从 nginx 配置中删除了conf.d/elasticbeanstalk/healthd.conf包含。 此 conf 添加了一种机器读取日志格式,负责在 EB 中报告该数据(请参阅增强型健康日志格式 - AWS )。

没有指标

我的实例配置文件的 IAM 角色缺少elasticbeanstalk:PutInstanceStatistics权限。

我通过查看/var/log/healthd/daemon.log发现了这一点,正如其他答案之一中所建议的那样。

我不得不将 SSH 直接插入机器才能发现这一点,因为 Get Logs function 本身由于缺少 S3 写入权限而失败。

如果您正在运行Worker Tier EB,则需要添加此策略

arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier

我在 docker 作为平台的弹性 beanstalk 环境中运行一个应用程序。 我得到了没有实例发送的相同错误。 而且我也无法获取日志。 重建环境对我有用。

对于 2022 年抵达这里的任何人……

在启动与当前健康环境相同的新环境并且没有看到任何数据后,我提出了 AWS Support 票证。 我被告知:

在此,我想通知您,最近 Elastic Beanstalk 引入了名为EnhancedHealthAuthEnabled的新功能,以提高您环境的安全性并帮助防止代表您的健康数据欺骗,并且当您创建新环境时默认情况下会启用此选项。

如果您对实例配置文件使用托管策略,则此功能无需任何进一步配置即可用于您的新环境,因为 Elastic Beanstalk 实例配置文件托管策略包含elasticbeanstalk:PutInstanceStatistics操作的权限。 但是,如果您使用自定义实例配置文件而不是托管策略,您的环境可能会显示无数据运行状况。 发生这种情况是因为自定义实例配置文件在默认情况下没有PutInstanceStatistics权限,并且实例未被授权执行将增强的健康数据传递给服务的操作。 因此,您的环境健康状况显示未知/无数据状态。

我需要附加到现有 EC2 角色的策略(根据 AWS Support 的建议)如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ElasticBeanstalkHealthAccess",
      "Action": [
        "elasticbeanstalk:PutInstanceStatistics"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:elasticbeanstalk:*:*:application/*",
        "arn:aws:elasticbeanstalk:*:*:environment/*"
      ]
    }
  ]
}

将此策略添加到我的 EC2 角色为我解决了这个问题。

在我的情况下,当我增加我的 ram 或实例类型(t2.micro 到 c5.xlarge)时,它已经解决了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM