【问题标题】:How to verify the status of an EC2 instance launched from a newly created AMI?如何验证从新创建的 AMI 启动的 EC2 实例的状态?
【发布时间】:2020-02-20 21:17:27
【问题描述】:

如何使用 boto3 检查 EC2 实例是否启动和运行/一项特定服务是否启动或关闭。该实例是从新创建的 AMI 创建的。

【问题讨论】:

  • 您所说的“一项特定服务启动或停止”是什么意思?它是什么服务?如果这是一台普通计算机(不在 EC2 上),您将如何检查此服务是启动还是关闭?
  • 如果我运行一个脚本,它将返回 Apache 服务正在运行、失败、关闭等。否则我想 ssh 进入新启动的实例并发送主题为“成功登录”的邮件。
  • 由于 Apache 是一个 Web 服务器,您可以尝试转到该实例提供的页面。当操作系统和 Apache 启动时,它不会提供内容。然后,一旦 Apache 运行,它将能够提供所请求的网页。您需要编写自己的软件来执行此操作。或者,如果实例位于负载平衡目标组中,则负载平衡服务会在将流量传送到实例之前为您执行此类检查。

标签: python amazon-web-services amazon-ec2 boto3


【解决方案1】:

您可以使用以下Instance

ec2 = boto3.resource('ec2')

instance = ec2.Instance('instance_id')

print(instance.image_id)

instance.image_id 与您期望的图像ID 进行比较。

要检查实例是否已经在运行,请使用EC2.Waiter.InstanceRunning waiter。

【讨论】:

    【解决方案2】:

    检查 EC2 实例是启动还是关闭:

    import sys
    import boto3
    
    
    ec2 = boto3.client('ec2')
    if sys.argv[1] == 'ON':
        response = ec2.monitor_instances(InstanceIds=['INSTANCE_ID'])
    else:
        response = ec2.unmonitor_instances(InstanceIds=['INSTANCE_ID'])
    print(response)
    

    检查实例的健康状况:

    # Boto 2.x
    for status in ec2_connection.get_all_instance_statuses():
        print(status)
    
    # Boto 3
    for status in ec2.meta.client.describe_instance_status()['InstanceStatuses']:
        print(status)
    

    更多详情请参考: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/migrationec2.html

    https://boto3.amazonaws.com/v1/documentation/api/latest/guide/ec2-example-managing-instances.html

    更新:(检查 EC2 中的特定服务是否正在运行)

    1. 您可以将自定义指标以“心跳”的形式发布到 CloudWatch。
    2. 在您的服务器上通过 cron 运行一个小脚本,检查进程列表以查看 my_service 是否正在运行,如果是,则对 CloudWatch 进行 put-metric-data 调用。
    3. 指标可以很简单,只需将数字“1”推送到 CloudWatch 中的自定义指标即可。
    4. 设置 CloudWatch 警报,当指标的平均值低于 1 时触发
    5. 使警报的周期 >= cron 运行的周期,例如cron 每 5 分钟运行一次,如果发现两个 5 分钟周期的平均值低于 1,则触发警报。
    6. 确保您还处理了未发布指标的情况(例如,cron 无法运行或整台机器死机)。如果指标丢失,您可能需要设置警报。 (见这里:AWS Cloudwatch heartbeat alarm
    7. 请注意,自定义指标会为您的 AWS 账单增加 50c 的额外成本(对于一个指标来说不是什么大问题 - 但如果您想要推送成百上千个指标,则等式会发生巨大变化 - 即很高兴知道它是不像人们想象的那样免费)
    8. 您必须在 AWS 的 SNS(简单通知服务)服务中创建一个主题。您必须在 SNS 下定义您将收到通知的电子邮件。

    参考资料:

    1. Use cloudwatch to determine if linux service is running
    2. AWS Cloudwatch Heartbeat Alarm

    【讨论】:

    • 如何运行脚本来检查实例内的服务是否启动??
    • @PrejithPrasannan 没有 python 特定的方法可以使用 boto3 来检查这个。您必须使用 AWS Cloudwatch 进行设置。已更新答案
    【解决方案3】:

    当您专门询问 boto3 时,有一种方法可以确保某些服务在 AWS 本地处于就绪状态。

    将实例的创建移至 CloudFormation 模板并定义 CreationPolicy,如 AWS 博客文章中所述: https://aws.amazon.com/blogs/devops/use-a-creationpolicy-to-wait-for-on-instance-configurations/

    TL;DR:当实例启动时,它将运行一个脚本来检查您需要的任何服务是否正常工作,然后向 CloudFormation 发出“所有系统运行”的信号。如果未及时发出信号,则将实例标记为CREATE_FAILED 并删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 2011-09-13
      • 2019-04-06
      • 2014-02-18
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多