boto3 client NoRegionError: Đôi khi bạn phải chỉ định một lỗi khu vực


147

Tôi có một khách hàng boto3:

boto3.client('kms')

Nhưng nó xảy ra trên các máy mới, Chúng mở và đóng một cách linh hoạt.

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

Tại sao chuyện này đang xảy ra? và tại sao chỉ là một phần của thời gian?


Bởi vì khách hàng boto3 không thể tìm thấy hồ sơ AWS từ bộ phương thức thông tin đăng nhập mặc định: docs.aws.amazon.com/sdk-for-java/v1/developer-guide/ .
xe mô tô

Câu trả lời:


325

Bằng cách này hay cách khác bạn phải nói với boto3 ở khu vực nào bạn muốn kmsứng dụng khách được tạo. Điều này có thể được thực hiện rõ ràng bằng cách sử dụng region_nametham số như trong:

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

hoặc bạn có thể có một vùng mặc định được liên kết với hồ sơ của bạn trong ~/.aws/configtệp của bạn như trong:

[default]
region=us-west-2

hoặc bạn có thể sử dụng một biến môi trường như trong:

export AWS_DEFAULT_REGION=us-west-2

nhưng bạn cần nói với boto3 vùng nào sẽ sử dụng.


2
Làm thế nào để tôi biết bản thân nên sử dụng khu vực nào?
jononomo

1
Nếu bạn đang cố gắng truy cập các tài nguyên hiện có, hãy chọn khu vực có các tài nguyên đó tồn tại. Nếu bạn định tạo tài nguyên mới, hầu hết mọi người sẽ chọn một khu vực gần họ nhất về mặt địa lý để có thời gian phản hồi nhanh hơn. Không phải tất cả các khu vực đều hỗ trợ cùng một bộ dịch vụ, vì vậy nếu bạn cần một dịch vụ cụ thể, hãy đảm bảo bạn chọn một khu vực hỗ trợ nó.
garnaat

1
Để tìm hiểu khu vực nào cung cấp dịch vụ nào: Bảng khu vực dịch vụ web của Amazon aws.amazon.com/about-aws/global-infr Hạ cơ / từ
Nick

2
bạn có biết tại sao "xuất AWS_DEFAULT_REGION = us-west-2" hoặc ~ / .aws / config không hoạt động
fatih tekin

3
Tôi ước boto3 chỉ có thể sử dụng vùng của thể hiện ec2 đang chạy mã.
Selçuk Cihan

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

Trong trường hợp của tôi nhạy cảm quan trọng.


4

Tôi tin rằng, theo mặc định, boto chọn khu vực được đặt trong aws cli. Bạn có thể chạy lệnh #aws configure và nhấn enter (nó hiển thị những khoản tín dụng bạn đã đặt trong aws cli với vùng) hai lần để xác nhận vùng của bạn.


3

bạn cũng có thể đặt các biến môi trường trong chính tập lệnh, thay vì truyền tham số tên_bảng

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

trường hợp nhạy cảm có thể quan trọng.


AWS_DEFAULT_REGIONlà trường hợp nhạy cảm.
Jaime M.

Nó phải là: os.environ['AWS_DEFAULT_REGION'] = 'us-east-1' (chữ hoa)
Joe

2

Đối với Python 2 tôi đã thấy rằng thư viện boto3 không lấy nguồn vùng từ ~/.aws/confignếu vùng được xác định trong một cấu hình khác để mặc định. Vì vậy, bạn phải xác định nó trong phiên tạo.

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

print(session.available_profiles)

client = session.client(
    'ec2'
)

Trường hợp ~/.aws/configtập tin của tôi trông như thế này:

[default]
region=ap-southeast-2

[NotDefault]
region=ap-southeast-2

Tôi làm điều này bởi vì tôi sử dụng các cấu hình khác nhau cho các lần đăng nhập khác nhau vào AWS, Cá nhân và Công việc.


0

Đối với những người sử dụng mẫu CloudFormation. Bạn có thể đặt AWS_DEFAULT_REGIONbiến môi trường bằng UserData và AWS::Region. Ví dụ,

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.