我有一个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()

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


当前回答

对于那些使用CloudFormation模板。可以使用UserData和AWS::Region设置环境变量AWS_DEFAULT_REGION。例如,

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

其他回答

您必须以某种方式告诉boto3您希望在哪个区域创建kms客户端。这可以显式地使用region_name参数来完成,如下所示:

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

或者您可以在~/中有一个与您的配置文件相关联的默认区域。Aws /配置文件如下:

[default]
region=us-west-2

或者你可以使用环境变量,如下所示:

export AWS_DEFAULT_REGION=us-west-2

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

我相信,默认情况下,boto选择在aws cli中设置的区域。您可以运行命令#aws configure并按enter(它会显示您在aws cli with region中设置的信用)两次来确认您的区域。

如果您正在使用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)

如果您正在使用Linux,一种简单的方法是在~/处创建配置文件(您应该将其命名为config而不需要任何扩展名)。Aws(如果. Aws目录不存在,则在用户home ~),并在该配置文件中添加如下所示的区域。

(默认) 地区= whatever-aws-region

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

操作系统。environ['AWS_DEFAULT_REGION'] = 'your_region_name'

大小写敏感性可能很重要。