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

如何通过boto3判断Python脚本是否运行在AWS环境?

判断Python脚本是否运行在AWS环境的几种方案

我之前也碰到过一模一样的需求——想用boto3直接判断脚本是不是在EC2、ECS或者Lambda里跑,而不是本地工作站。确实boto3没有像boto里boto.utils.get_instance_metadata那样的现成方法,不过我们可以自己实现类似的逻辑,下面给你几个靠谱的方案:

方案1:访问AWS元数据服务(最推荐)

AWS的EC2实例、ECS容器和Lambda环境都能访问专属的元数据服务端点http://169.254.169.254/latest/meta-data/,而本地工作站访问这个地址会直接超时或者失败。我们可以利用这一点来判断:

import requests

def is_running_on_aws():
    try:
        # 设置短超时,避免本地等待太久
        response = requests.get("http://169.254.169.254/latest/meta-data/", timeout=2)
        return response.status_code == 200
    except requests.exceptions.RequestException:
        # 本地访问抛出异常,返回False
        return False

这个方法的优点是误判率极低,因为这个元数据端点是AWS环境独有的,本地网络根本无法访问。而且不管是EC2、ECS还是Lambda,都能正常访问这个端点,适用性很广。

方案2:结合环境变量+STS调用(更全面)

不同的AWS环境会有特定的环境变量,我们可以先检查这些变量,再结合元数据服务和STS调用做补充:

import os
import requests
import boto3
from botocore.exceptions import ClientError

def is_running_on_aws():
    # 检查Lambda专属环境变量
    if os.environ.get("AWS_LAMBDA_FUNCTION_NAME"):
        return True
    # 检查ECS专属环境变量
    if os.environ.get("ECS_CONTAINER_METADATA_URI"):
        return True
    
    # 尝试访问元数据服务
    try:
        response = requests.get("http://169.254.169.254/latest/meta-data/", timeout=2)
        return response.status_code == 200
    except requests.exceptions.RequestException:
        pass
    
    # 最后尝试调用STS获取身份(注意:本地若配置了AWS凭证会返回True)
    try:
        sts_client = boto3.client("sts")
        sts_client.get_caller_identity()
        return True
    except ClientError:
        return False

这个方案的好处是覆盖了更多场景,但要注意:如果你的本地工作站配置了AWS凭证(比如~/.aws/credentials),STS调用会成功返回身份信息,导致误判为AWS环境。所以如果你的本地不会配置AWS凭证,这个方法会很有用;否则优先用方案1。

补充说明

确实像你提到的,boto3目前没有内置的布尔值返回方法来判断是否在AWS环境,相关的讨论也一直在社区里存在。上面的两个方法都是社区里常用的替代方案,我自己在项目里用方案1比较多,简单高效还靠谱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:24:11