如何从boto获取当前用户的区域?

时间:2016-05-29 20:45:58

标签: python amazon-web-services amazon-ec2 boto aws-sdk

问题:

我试图从boto3获取经过身份验证的用户的区域。

用例:

我正致力于将缓存添加到https://github.com/pmazurek/aws-fuzzy-finder。我更愿意将结果缓存在 per-region 的基础上。

此程序包使用boto获取用户身份验证数据(密钥和区域)。问题是该区域永远不会被用户明确传递,它是从boto读取的许多阴暗的地方之一中获取的,因此我没有办法获得它。

我尝试过浏览boto3 api并使用Google搜索,但无法找到类似get_regionget_user_data方法的内容。有可能吗?

4 个答案:

答案 0 :(得分:32)

您应该可以从session.Session对象中读取region_name,例如

my_session = boto3.session.Session()
my_region = my_session.region_name

region_name基本上定义为session.get_config_variable('region')

答案 1 :(得分:5)

从这里和其他文章中汲取一些想法,我相信这几乎适用于任何设置,无论是本地设置还是在包括Lambda,EC2,ECS,Glue等在内的任何AWS服务上:

def detect_running_region():
    """Dynamically determine the region from a running Glue job (or anything on EC2 for
    that matter)."""
    easy_checks = [
        # check if set through ENV vars
        os.environ.get('AWS_REGION'),
        os.environ.get('AWS_DEFAULT_REGION'),
        # else check if set in config or in boto already
        boto3.DEFAULT_SESSION.region_name if boto3.DEFAULT_SESSION else None,
        boto3.Session().region_name,
    ]
    for region in easy_checks:
        if region:
            return region

    # else query an external service
    # https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html
    r = requests.get("http://169.254.169.254/latest/dynamic/instance-identity/document")
    response_json = r.json()
    return response_json.get('region')

答案 2 :(得分:2)

如果您正在使用boto3客户端,另一种选择是:

import boto3
client = boto3.client('s3') # example client, could be any
client.meta.region_name

答案 3 :(得分:2)

这些都不适合我,因为未设置AWS_DEFAULT_REGION且client.meta.region_name 给出“ us-east-1”,我不想使用网址。 如果在该区域中已经设置了存储桶,并且您已经在使用boto3对其进行访问(请注意,您不需要区域即可访问s3),则可以使用下面的方法(截至20年8月)。

import boto3
client = boto3.client('s3')
response = client.get_bucket_location(Bucket=bucket_name)
print(response['LocationConstraint'])