196

I have a boto3 client :

boto3.client('kms')

But it happens on new machines, They open and close dynamically.

    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()

Why is this happening? and why only part of the time?

RtmY
  • 7,115
  • 6
  • 51
  • 64
WebQube
  • 6,772
  • 9
  • 40
  • 76
  • 1
    Because boto3 client can't find AWS profile from set of default credentials method : http://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html. – mootmoot Nov 02 '16 at 11:26

7 Answers7

426

One way or another you must tell boto3 in which region you wish the kms client to be created. This could be done explicitly using the region_name parameter as in:

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

or you can have a default region associated with your profile in your ~/.aws/config file as in:

[default]
region=us-west-2

or you can use an environment variable as in:

export AWS_DEFAULT_REGION=us-west-2

but you do need to tell boto3 which region to use.

PythonJin
  • 3,289
  • 4
  • 32
  • 38
garnaat
  • 37,899
  • 7
  • 109
  • 98
  • 2
    How do I know myself which region to use? – jononomo Mar 31 '17 at 17:05
  • 1
    If you are trying to access existing resources choose the region in which those resources exist. If you are going to create new resources, most people choose a region which is closest to them geographically for faster response times. Not all regions support the same set of services so if you need a particular service make sure you choose a region that supports it. – garnaat Apr 01 '17 at 18:18
  • I guess my question is: how do I know which region I have already chosen? I suppose it must be in the AWS UI somewhere... – jononomo Apr 03 '17 at 14:13
  • 1
    To find out which regions provide which services: Amazon Web Services Region Table https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/ – Nick May 23 '17 at 04:53
  • 2
    do you know why "export AWS_DEFAULT_REGION=us-west-2" or ~/.aws/config file not working – fatih tekin Nov 28 '17 at 20:44
  • I was looking for this answer in regard to SNS. Worked as well. – Strabek Nov 15 '18 at 11:58
  • works as well with `boto3.resource('service_name', region_name='us-west-2')` – openwonk Aug 13 '19 at 00:21
  • 6
    I wish boto3 could just use the region of the ec2 instance that's running the code. – Selçuk Cihan Feb 06 '20 at 09:26
  • 1
    Yeah I have my AWS_DEFAULT_REGION set and still no workey – ThisGuyCantEven Feb 25 '20 at 15:53
  • Why is it not finding my creds even though I input them exactly as they should be? – Blairg23 Apr 07 '20 at 19:41
15
os.environ['AWS_DEFAULT_REGION'] = 'your_region_name'

In my case sensitivity mattered.

Suit Boy Apps
  • 3,005
  • 8
  • 36
  • 54
Anthony G
  • 151
  • 1
  • 2
6

For Python 2 I have found that the boto3 library does not source the region from the ~/.aws/config if the region is defined in a different profile to default. So you have to define it in the session creation.

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

print(session.available_profiles)

client = session.client(
    'ec2'
)

Where my ~/.aws/config file looks like this:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2

I do this because I use different profiles for different logins to AWS, Personal and Work.

RalfFriedl
  • 1,046
  • 3
  • 8
  • 12
David Edson
  • 91
  • 1
  • 4
4

I believe, by default, boto picks the region which is set in aws cli. You can run command #aws configure and press enter (it shows what creds you have set in aws cli with region)twice to confirm your region.

3

you can also set environment variables in the script itself, rather than passing region_name parameter

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

case sensitivity may matter.

Ben Watson
  • 3,882
  • 4
  • 33
  • 55
0

For those using CloudFormation template. You can set AWS_DEFAULT_REGION environment variable using UserData and AWS::Region. For example,

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
Marcin
  • 108,294
  • 7
  • 83
  • 138
0

Alternatively you can run the following (aws cli)

aws configure --profile $PROFILE_NAME

it'll prompt you for the region.

notice in ~/.aws/config it's:

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

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

[profile profile name] in the square brackets

altimit
  • 361
  • 2
  • 11