boto3 client NoRegionError:您有时必须仅指定区域错误

Web*_*ube 97 python linux boto3 aws-kms

我有一个boto3客户端:

boto3.client('kms')
Run Code Online (Sandbox Code Playgroud)

但它发生在新机器上,它们动态地打开和关闭.

    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()
Run Code Online (Sandbox Code Playgroud)

为什么会这样?为什么只有部分时间?

gar*_*aat 224

无论如何,您必须告诉boto3您希望在哪个区域kms创建客户端.这可以使用region_name参数显式完成,如下所示:

kms = boto3.client('kms', region_name='us-west-2')
Run Code Online (Sandbox Code Playgroud)

或者您可以在~/.aws/config文件中设置与您的个人资料相关联的默认区域,如下所示:

[default]
region=us-west-2
Run Code Online (Sandbox Code Playgroud)

或者您可以使用环境变量,如:

export AWS_DEFAULT_REGION=us-west-2
Run Code Online (Sandbox Code Playgroud)

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

  • 我希望 boto3 可以只使用运行代码的 ec2 实例的区域。 (9认同)
  • 我怎么知道自己要使用哪个区域? (2认同)
  • 你知道为什么“导出 AWS_DEFAULT_REGION=us-west-2”或 ~/.aws/config 文件不起作用 (2认同)

小智 17

os.environ['AWS_DEFAULT_REGION'] = 'your_region_name'
Run Code Online (Sandbox Code Playgroud)

就我而言,敏感性很重要。


小智 15

您还可以在脚本本身中设置环境变量,而不是传递region_name参数

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

区分大小写可能很重要。


Ven*_*Vig 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)
Run Code Online (Sandbox Code Playgroud)


Har*_*hal 8

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)
Run Code Online (Sandbox Code Playgroud)


小智 6

对于 Python 2,我发现 boto3 库不会从该区域中获取该区域,~/.aws/config如果该区域在不同的配置文件中定义为默认值。所以你必须在会话创建中定义它。

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

print(session.available_profiles)

client = session.client(
    'ec2'
)
Run Code Online (Sandbox Code Playgroud)

我的~/.aws/config文件如下所示:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2
Run Code Online (Sandbox Code Playgroud)

我这样做是因为我对 AWS、个人和工作的不同登录使用了不同的配置文件。


alt*_*mit 5

或者,您可以运行以下命令(aws cli)

aws configure --profile $PROFILE_NAME
Run Code Online (Sandbox Code Playgroud)

它会提示您输入该区域。

注意其中~/.aws/config

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

[profile prod]
region = ap-southeast-1
output = json
Run Code Online (Sandbox Code Playgroud)

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