You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python Boto3阻塞等待EC2实例2/2状态检查通过?

How to Block Until EC2 Instance Passes 2/2 Status Checks with Boto3

Got it, let's fix this! Your current code stops when the instance hits the running state, but that only tells you the instance has powered up—not that it's fully ready to handle tasks or traffic. The 2/2 status checks (instance and system-level) are the real signal that everything's stable and good to go.

Here are two reliable ways to wait for those checks to pass using Boto3:

1. Use Boto3's Built-in Waiter (Simplest Approach)

Boto3 has a purpose-built waiter for exactly this scenario: instance_status_ok. It automatically polls AWS until both instance and system status checks show as ok (or times out if they don't pass in time).

Example Code:

import boto3

# Initialize EC2 client
ec2 = boto3.client('ec2')
instance_id = 'i-1234567890abcdef0'  # Replace with your instance ID

# Get the pre-built waiter for status checks
waiter = ec2.get_waiter('instance_status_ok')

try:
    # Wait with custom timing (adjust Delay/MaxAttempts to fit your needs)
    waiter.wait(
        InstanceIds=[instance_id],
        WaiterConfig={
            'Delay': 10,       # Check status every 10 seconds
            'MaxAttempts': 60  # Wait up to 10 minutes total (60 * 10)
        }
    )
    print(f"✅ Instance {instance_id} passed all 2/2 status checks!")
except Exception as e:
    print(f"❌ Timeout waiting for status checks: {str(e)}")

How It Works:

The instance_status_ok waiter repeatedly calls the describe_instance_status API behind the scenes. It stops waiting only when:

  • InstanceStatus.Status equals ok (passes instance-level health checks)
  • SystemStatus.Status equals ok (passes hypervisor/system-level health checks)

2. Manual Polling (For Full Customization)

If you need more control—like adding custom logging, handling edge cases, or integrating with other logic—you can manually poll the describe_instance_status API yourself.

Example Code:

import boto3
import time

ec2 = boto3.client('ec2')
instance_id = 'i-1234567890abcdef0'
max_wait_seconds = 600  # 10-minute timeout
check_interval = 10     # Check status every 10 seconds
start_time = time.time()

while time.time() - start_time < max_wait_seconds:
    response = ec2.describe_instance_status(InstanceIds=[instance_id])
    
    # Handle cases where the instance hasn't started reporting status yet
    if not response['InstanceStatuses']:
        print(f"⏳ Instance {instance_id} not yet reporting status, waiting...")
        time.sleep(check_interval)
        continue
    
    # Extract status check results
    instance_status = response['InstanceStatuses'][0]['InstanceStatus']['Status']
    system_status = response['InstanceStatuses'][0]['SystemStatus']['Status']
    
    if instance_status == 'ok' and system_status == 'ok':
        print(f"✅ Instance {instance_id} passed all 2/2 status checks!")
        break
    
    # Print current status for debugging
    print(f"⏳ Current checks: Instance={instance_status}, System={system_status} - waiting...")
    time.sleep(check_interval)
else:
    # Loop exited without breaking (timeout reached)
    print(f"❌ Timeout after {max_wait_seconds}s: Instance {instance_id} didn't pass all checks.")

Key Notes:

  • running vs. Status Checks: The running state (from describe_instances) only confirms the instance is powered on. Status checks verify the instance's OS, network, and underlying hardware are healthy.
  • Permissions: Ensure your IAM user/role has the ec2:DescribeInstanceStatus permission—otherwise, you'll get an access denied error.

内容的提问来源于stack exchange,提问作者user389955

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:16:54