boto3客户端NoRegionError:您必须指定区域错误有时会出现

338

我有一个boto3客户端:

boto3.client('kms')

但是它发生在新机器上,它们可以动态地打开和关闭。

    if endpoint is None:
        if region_name is None:
            # Raise a more specific error message that will give
            # better guidance to the user what needs to happen.
            raise NoRegionError()
为什么会发生这种情况?而且为什么只有一部分时间出现?

2
由于boto3客户端无法从默认凭据方法中找到AWS配置文件,请参考以下链接:http://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html。 - mootmoot
13个回答

658

不管怎样,您必须告诉boto3您希望创建kms客户端的区域。这可以通过显式使用region_name参数来完成,例如:

kms = boto3.client('kms', region_name='us-west-2')

或者,您可以在~/.aws/config文件中将默认区域与您的配置文件关联,例如:

[default]
region=us-west-2

或者你可以像下面这样使用环境变量:

export AWS_DEFAULT_REGION=us-west-2

但是你需要告诉boto3要使用哪个区域。


2
我如何知道自己应该使用哪个区域? - tadasajon
3
你知道为什么 "export AWS_DEFAULT_REGION=us-west-2" 或者 ~/.aws/config 文件不起作用吗? - fatih tekin
1
可以与boto3.resource('service_name', region_name='us-west-2')一起使用。 - openwonk
20
我希望Boto3可以使用运行代码的EC2实例的区域。 - Selçuk Cihan
1
在./aws/config中设置默认区域对我并没有解决问题。我不得不直接编辑文件,添加区域名称参数:boto3.client('elbv2') 改为 boto3.client('elbv2', region_name='us-east-1') - user1653042
显示剩余7条评论

33
os.environ['AWS_DEFAULT_REGION'] = 'your_region_name'

在我的情况中,敏感度很重要。


15

除了传递region_name参数,你还可以在脚本中设置环境变量。

os.environ['AWS_DEFAULT_REGION'] = 'your_region_name'

大小写可能会影响结果。


AWS_DEFAULT_REGION 区分大小写。 - Jaime M.
1
应该是:os.environ['AWS_DEFAULT_REGION'] = 'us-east-1'(大写) - Joe

11

对于Python 2,我发现boto3库如果区域在不同的配置文件档案中与默认档案不同,则不会从~/.aws/config读取区域信息。因此,您必须在会话创建时定义它。

session = boto3.Session(
    profile_name='NotDefault',
    region_name='ap-southeast-2'
)

print(session.available_profiles)

client = session.client(
    'ec2'
)

我的~/.aws/config文件看起来像这样:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2

我这样做是因为我在AWS上使用不同的配置文件进行个人和工作登录。


8
如果您正在使用lambda函数,则可能希望使用该lambda函数所部署的区域。 您可以使用以下内容。
import boto3
import json
import os

def lambda_handler(event, context):
    region = os.environ['AWS_REGION']
    print('Lambda region: ', region)
    kms = boto3.client('kms', region_name=region)

7

regions = [
            'eu-north-1', 'ap-south-1', 'eu-west-3', 'eu-west-2',
            'eu-west-1', 'ap-northeast-3', 'ap-northeast-2'
            'ap-northeast-1', 'sa-east-1', 'ca-central-1', 
            'ap-southeast-2', 'eu-central-1', 'us-east-1', 'us-east-2',
            'us-west-1', 'us-west-2']
for r in regions:
   kms = boto3.client('kms', region_name= r)


5

或者您可以运行以下命令(AWS CLI)

aws configure --profile $PROFILE_NAME

系统会提示你选择地区。

请注意,在 ~/.aws/config 文件中,它是这样的:

[default]
region = ap-southeast-1
output = json

[profile prod]
region = ap-southeast-1
output = json

[profile 配置文件名称] 在方括号中


4

我认为,默认情况下,boto会选择在aws cli中设置的区域。您可以运行命令#aws configure并按Enter键(它将显示您在aws cli中设置的凭据和区域),确认您的区域。


3

如果您愿意,可以将它设置为与 EC2 相同的区域。这是使用 bash 实现的,但您可以轻松地在 Python 中重现此操作:

EC2_AVAIL_ZONE=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
EC2_REGION="`echo $EC2_AVAIL_ZONE | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
# if unset, set it:
export AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION:-$EC2_REGION}"

Python:

import os
import re
from subprocess import check_output

EC2_AVAIL_ZONE = check_output(["curl", "-s", "http://169.254.169.254/latest/meta-data/placement/availability-zone"]).decode().strip()
EC2_REGION = re.sub(r"^(\w{2}-\w{3,10}-[0-9][0-9]*)[a-z]*$", r"\1", EC2_AVAIL_ZONE)
# if unset, set it:
os.environ["AWS_DEFAULT_REGION"] = os.getenv("AWS_DEFAULT_REGION", EC2_REGION)

3

对于使用CloudFormation模板的人来说,您可以使用UserData和设置环境变量。例如:

MyInstance1:
    Type: AWS::EC2::Instance                
    Properties:                           
        ImageId: ami-04b9e92b5572fa0d1 #ubuntu
        InstanceType: t2.micro
        UserData: 
            Fn::Base64: !Sub |
                    #!/bin/bash -x

                    echo "export AWS_DEFAULT_REGION=${AWS::Region}" >> /etc/profile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接