【问题标题】:boto3 client NoRegionError: You must specify a region error only sometimesboto3客户端NoRegionError:您必须仅在有时指定区域错误
【发布时间】:2017-03-15 15:08:04
【问题描述】:

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

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

【问题讨论】:

标签: python linux amazon-web-services boto3 aws-kms


【解决方案1】:

您也可以运行以下命令(aws cli)

aws configure --profile $PROFILE_NAME

它会提示您选择地区。

~/.aws/config 中的通知是:

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

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

[个人资料个人资料名称]在方括号中

【讨论】:

    【解决方案2】:

    对于那些使用 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
    

    【讨论】:

      【解决方案3】:

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

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

      区分大小写可能很重要。

      【讨论】:

      • AWS_DEFAULT_REGION 区分大小写。
      • 应该是:os.environ['AWS_DEFAULT_REGION'] = 'us-east-1'(大写)
      【解决方案4】:

      对于 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、个人和工作。

      【讨论】:

        【解决方案5】:
        os.environ['AWS_DEFAULT_REGION'] = 'your_region_name'
        

        在我看来,区分大小写很重要。

        【讨论】:

          【解决方案6】:

          您必须以一种或另一种方式告诉 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 使用哪个区域。

          【讨论】:

          • 我如何知道自己使用哪个区域?
          • 如果您尝试访问现有资源,请选择这些资源所在的区域。如果您要创建新资源,大多数人会选择地理上离他们最近的区域,以加快响应时间。并非所有地区都支持同一组服务,因此如果您需要特定服务,请确保选择支持该服务的地区。
          • 了解哪些地区提供哪些服务:Amazon Web Services Region Table aws.amazon.com/about-aws/global-infrastructure/…
          • 你知道为什么“导出 AWS_DEFAULT_REGION=us-west-2”或 ~/.aws/config 文件不起作用
          • 我希望 boto3 可以只使用运行代码的 ec2 实例的区域。
          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-06-19
            • 1970-01-01
            • 2013-10-30
            • 2015-06-22
            • 2015-05-23
            • 1970-01-01
            • 2016-11-20
            相关资源
            最近更新 更多