Sự khác biệt về boto3 giữa tài nguyên, máy khách và phiên?


Câu trả lời:


247

Dưới đây là một số thông tin chi tiết hơn về tất cả những gì về Máy khách , Tài nguyênPhiên .

Khách hàng:

  • truy cập dịch vụ AWS cấp thấp
  • được tạo từ mô tả dịch vụ AWS
  • trưng bày máy khách botocore cho nhà phát triển
  • thường ánh xạ 1: 1 với API dịch vụ AWS
  • tất cả các hoạt động dịch vụ AWS đều được khách hàng hỗ trợ
  • tên phương thức vỏ rắn (ví dụ: API ListBuckets => phương thức list_buckets)

Dưới đây là ví dụ về quyền truy cập cấp máy khách vào các đối tượng của nhóm S3 (tối đa 1000 **):

import boto3

client = boto3.client('s3')
response = client.list_objects_v2(Bucket='mybucket')
for content in response['Contents']:
    obj_dict = client.get_object(Bucket='mybucket', Key=content['Key'])
    print(content['Key'], obj_dict['LastModified'])

** bạn sẽ phải sử dụng một paginator , hoặc thực hiện vòng lặp của riêng bạn, gọi list_objects () lặp đi lặp lại với một dấu hiệu tiếp tục nếu đã có hơn 1000.

Nguồn:

  • API hướng đối tượng, cấp cao hơn
  • được tạo từ mô tả tài nguyên
  • sử dụng định danh và thuộc tính
  • có hành động (hoạt động trên tài nguyên)
  • trưng ra các nguồn con và bộ sưu tập tài nguyên AWS
  • không cung cấp bảo hiểm 100% API cho các dịch vụ AWS

Đây là ví dụ tương đương sử dụng quyền truy cập cấp tài nguyên vào các đối tượng của nhóm S3 (tất cả):

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
for obj in bucket.objects.all():
    print(obj.key, obj.last_modified)

Lưu ý rằng trong trường hợp này, bạn không phải thực hiện lệnh gọi API thứ hai để nhận các đối tượng; chúng có sẵn cho bạn như một bộ sưu tập trên xô. Những bộ sưu tập các nguồn con được tải một cách lười biếng.

Bạn có thể thấy rằng Resourcephiên bản của mã đơn giản hơn, nhỏ gọn hơn và có nhiều khả năng hơn (nó phân trang cho bạn). Các Clientphiên bản của mã thực sự sẽ trở nên phức tạp hơn hiển thị ở trên nếu bạn muốn bao gồm pagination.

Phiên:

  • lưu trữ thông tin cấu hình (chủ yếu là thông tin đăng nhập và khu vực được chọn)
  • cho phép bạn tạo các dịch vụ khách hàng và tài nguyên
  • boto3 tạo một phiên mặc định cho bạn khi cần

Một tài nguyên hữu ích để tìm hiểu thêm về các khái niệm boto3 này là phần giới thiệu lại: Phát minh ra video .


2
Có sự khác biệt hiệu suất giữa máy khách và tài nguyên không? Tôi gặp vấn đề này khi xóa các tin nhắn khỏi hàng đợi sqs nhanh hơn bằng cách sử dụng máy khách và sử dụng tài nguyên chậm hơn.
Vaulstein

3
@Vaulstein Tôi không có bất kỳ so sánh cụ thể nào để chia sẻ nhưng tôi thường mong muốn các giao diện máy khách nhẹ hơn tài nguyên và do đó có khả năng nhanh hơn khi chạy (mặc dù mã chậm hơn).
jarmod

@jarmod Là một phần của việc học, tôi đã thử tạo nhóm S3 bằng cả hai phương pháp. Tôi cảm thấy rằng, việc tạo tài nguyên đang diễn ra nhanh hơn khi sử dụng "Máy khách" so với "Tài nguyên". Đúng không? Nếu vậy, tại sao việc tạo tài nguyên nhanh hơn với Client?
Saravanan G

1
@SaravananG Nếu bạn s3.set_stream_logger('botocore'), bạn có thể thấy nhật ký của chương trình meta mà boto3 (gọi đến botocore) thực hiện. Nó không hoạt động nên bạn không cần phải làm vậy. Nó có toàn bộ hệ thống sự kiện để tùy chỉnh / khả năng cắm và phân loại sâu 3 (+?) Cho các sự kiện, để xử lý việc chuẩn bị yêu cầu, phân tích phản hồi và thực hiện các cuộc gọi phụ thuộc. Xây dựng tham số, ký yêu cầu, phát hiện khu vực là đáng chú ý. FYI đó là một nỗi đau kỳ diệu để sửa đổi. Xem thay đổi dễ dàng .
mcint

89

Tôi sẽ thử và giải thích nó đơn giản nhất có thể. Vì vậy, không có gì đảm bảo tính chính xác của các điều khoản thực tế.

Phiên là nơi để bắt đầu kết nối với các dịch vụ AWS. Ví dụ: sau đây là phiên mặc định sử dụng hồ sơ thông tin mặc định (ví dụ ~ / .aws / thông tin đăng nhập hoặc giả sử EC2 của bạn sử dụng hồ sơ cá nhân IAM)

sqs = boto3.client('sqs')
s3 = boto3.resource('s3')

Vì phiên mặc định là giới hạn đối với cấu hình hoặc cấu hình thể hiện được sử dụng, đôi khi bạn cần sử dụng phiên tùy chỉnh để ghi đè cấu hình phiên mặc định (ví dụ: tên_bảng, endpoint_url, v.v.)

# custom resource session must use boto3.Session to do the override
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource('s3')
video_s3 = my_east_session.resource('s3')

# you have two choices of create custom client session. 
backup_s3c = my_west_session.client('s3')
video_s3c = boto3.client("s3", region_name = 'us-east-1')

Tài nguyên : Đây là lớp dịch vụ cấp cao được khuyến nghị sử dụng. Điều này cho phép bạn liên kết các tài nguyên AWS cụ thể và chuyển nó đi, vì vậy bạn chỉ cần sử dụng sự trừu tượng này hơn là lo lắng dịch vụ mục tiêu nào được trỏ đến. Như bạn nhận thấy từ phần phiên, nếu bạn có một phiên tùy chỉnh, bạn chỉ cần vượt qua đối tượng trừu tượng này hơn là lo lắng về tất cả các vùng tùy chỉnh, v.v. Sau đây là một ví dụ phức tạp

import boto3 
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource("s3")
video_s3 = my_east_session.resource("s3")
backup_bucket = backup_s3.Bucket('backupbucket') 
video_bucket = video_s3.Bucket('videobucket')

# just pass the instantiated bucket object
def list_bucket_contents(bucket):
   for object in bucket.objects.all():
      print(object.key)

list_bucket_contents(backup_bucket)
list_bucket_contents(video_bucket)

Khách hàng là một đối tượng lớp cấp thấp. Đối với mỗi cuộc gọi của khách hàng, bạn cần chỉ định rõ ràng các tài nguyên nhắm mục tiêu, tên mục tiêu dịch vụ được chỉ định phải được truyền dài. Bạn sẽ mất khả năng trừu tượng.

Ví dụ: nếu bạn chỉ xử lý phiên mặc định, giao diện này tương tự như boto3.resource.

import boto3 
s3 = boto3.client('s3')

def list_bucket_contents(bucket_name):
   for object in s3.list_objects_v2(Bucket=bucket_name) :
      print(object.key)

list_bucket_contents('Mybucket') 

Tuy nhiên, nếu bạn muốn liệt kê các đối tượng từ một nhóm trong các vùng khác nhau, bạn cần chỉ định tham số nhóm rõ ràng cần thiết cho máy khách.

import boto3 
backup_s3 = my_west_session.client('s3',region_name = 'us-west-2')
video_s3 = my_east_session.client('s3',region_name = 'us-east-1')

# you must pass boto3.Session.client and the bucket name 
def list_bucket_contents(s3session, bucket_name):
   response = s3session.list_objects_v2(Bucket=bucket_name)
   if 'Contents' in response:
     for obj in response['Contents']:
        print(obj['key'])

list_bucket_contents(backup_s3, 'backupbucket')
list_bucket_contents(video_s3 , 'videobucket') 

diễn viên phụ. không phải là "đối tượng" một từ khóa?
Swagatika

Chúng ta có nên tránh sử dụng cả 'tài nguyên' và 'máy khách' song song một chức năng hoặc mô-đun không?
John Overiron

1
@JohnOveriron Không phải tất cả dịch vụ AWS đều có đối tác "tài nguyên", vì vậy bạn vẫn cần "khách hàng" cấp thấp. Nếu bạn có ý định sử dụng để triển khai, bạn nên sử dụng thông tin trên nền tảng đám mây (khó học nhưng sẽ giúp bạn tiết kiệm thời gian trong thời gian dài) hơn là sử dụng API để tự động triển khai.
xe mô tô

@mootmoot Nhưng việc truy vấn / thao tác các dịch vụ / tài nguyên của aws có thể được thực hiện dễ dàng bằng các API này thay vì tìm nạp các đầu ra hoặc cập nhật ngăn xếp thông qua điện toán đám mây. Tôi có đúng không?
SK Venkat

@SKVenkat Nếu yuu bắt đầu xây dựng triển khai nhiều máy chủ, sử dụng Tích hợp liên tục, v.v., đám mây / terraform / nhiệt sẽ dễ dàng hơn nhiều để duy trì sau đó sử dụng mã boto3.
mootmoot
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.