Tải tập tin lambda từ s3 sang tmp python

AWS Simple Storage Service (S3) cho đến nay là dịch vụ phổ biến nhất trên AWS. Tính đơn giản và khả năng mở rộng của S3 khiến nó trở thành nền tảng không chỉ để lưu trữ đối tượng mà còn lưu trữ chúng dưới dạng trang web tĩnh, phục vụ các mô hình ML, cung cấp chức năng sao lưu, v.v. Nó đã trở thành giải pháp đơn giản nhất để xử lý các tệp hình ảnh, video và âm thanh theo hướng sự kiện và thậm chí đã hoàn thiện để thay thế Hadoop trên thực tế để xử lý dữ liệu lớn. Trong bài viết này, chúng ta sẽ xem xét nhiều cách khác nhau để tận dụng sức mạnh của S3 trong Python.  

Một số trường hợp sử dụng có thể thực sự làm bạn ngạc nhiên

Ghi chú. mỗi đoạn mã bên dưới bao gồm một liên kết đến Gist GitHub được hiển thị dưới dạng. (Ý chính)

Tải tập tin lambda từ s3 sang tmp python

1. Đọc các đối tượng mà không cần tải chúng xuống

Hãy tưởng tượng rằng bạn muốn đọc tệp CSV vào khung dữ liệu Pandas mà không cần tải xuống. Đây là cách bạn có thể đọc trực tiếp nội dung của đối tượng dưới dạng khung dữ liệu Pandas (Gist)

Tải tập tin lambda từ s3 sang tmp python

Tương tự, nếu bạn muốn tải lên và đọc các mẩu dữ liệu văn bản nhỏ như trích dẫn, tweet hoặc tin bài, bạn có thể thực hiện việc đó bằng cách sử dụng phương thức tài nguyên S3 put(), như minh họa trong ví dụ bên dưới (Gist)

Tải tập tin lambda từ s3 sang tmp python

2. Tải tập tin vào một thư mục tạm thời

Thay vì đọc tệp trực tiếp, bạn có thể tải xuống tất cả các tệp mà bạn cần xử lý vào một thư mục tạm thời. Điều này có thể hữu ích khi bạn phải trích xuất một số lượng lớn các tệp nhỏ từ một thư mục S3 cụ thể (ví dụ:. gần dữ liệu phát trực tuyến thời gian thực), nối tất cả dữ liệu này lại với nhau, sau đó tải dữ liệu đó vào kho dữ liệu hoặc cơ sở dữ liệu trong một lần. Nhiều cơ sở dữ liệu phân tích có thể xử lý các lô dữ liệu lớn hiệu quả hơn so với thực hiện nhiều tải nhỏ. Do đó, việc tải xuống và xử lý tệp, sau đó mở một kết nối cơ sở dữ liệu duy nhất cho phần Tải của ETL, có thể làm cho quy trình trở nên mạnh mẽ và hiệu quả hơn

Bằng cách sử dụng một thư mục tạm thời, bạn có thể chắc chắn rằng không có trạng thái nào bị bỏ lại nếu tập lệnh của bạn gặp sự cố ở giữa (Gist).  

Tải tập tin lambda từ s3 sang tmp python

3. Chỉ định loại nội dung khi tải tệp lên

Thông thường, khi chúng tôi tải tệp lên S3, chúng tôi không nghĩ về siêu dữ liệu đằng sau đối tượng đó. Tuy nhiên, làm điều đó một cách rõ ràng có một số lợi thế. Hãy xem một ví dụ

Bắt đầu từ dòng 9, trước tiên chúng tôi tải tệp CSV lên mà không chỉ định rõ ràng loại nội dung. Sau đó, khi chúng tôi kiểm tra xem siêu dữ liệu của đối tượng này đã được lưu trữ như thế nào, chúng tôi phát hiện ra rằng nó được gắn nhãn là nhị phân/luồng octet. Thông thường, hầu hết các tệp sẽ được gắn nhãn chính xác dựa trên phần mở rộng của tệp, nhưng các sự cố như thế này có thể xảy ra trừ khi chúng tôi chỉ định loại nội dung một cách rõ ràng

Bắt đầu từ dòng 21, chúng tôi làm tương tự nhưng chúng tôi chuyển rõ ràng text/csv làm loại nội dung. Thao tác HeadObject xác nhận rằng siêu dữ liệu hiện đã chính xác (Gist)

Tải tập tin lambda từ s3 sang tmp python

4. Chỉ truy xuất các đối tượng có loại nội dung cụ thể

Bạn có thể yêu cầu. chúng tôi nhận được lợi ích gì khi chỉ định rõ ràng loại nội dung trong ExtraArgs?

Tải tập tin lambda từ s3 sang tmp python

Điều này sẽ trả về một danh sách các đối tượng ObjectSummary phù hợp với loại nội dung này

Ra[2]

[s3.ObjectSummary(bucket_name='annageller', key='sales/customers.csv')]

Nếu chúng tôi không chỉ định rõ ràng loại nội dung, tệp này sẽ không được tìm thấy

5. Lưu trữ báo cáo HTML tĩnh

S3 không chỉ tốt trong việc lưu trữ các đối tượng mà còn lưu trữ chúng dưới dạng các trang web tĩnh. Trước tiên, chúng tôi tạo một nhóm S3 có thể có các đối tượng có sẵn công khai.  

Tải tập tin lambda từ s3 sang tmp python
Tắt tính năng “Block all public access” — ảnh của tác giả

Sau đó, chúng tôi tạo một trang HTML từ bất kỳ khung dữ liệu Pandas nào mà bạn muốn chia sẻ với những người khác và chúng tôi tải tệp HTML này lên S3. Bằng cách này, chúng tôi đã quản lý để tạo một báo cáo dạng bảng đơn giản mà chúng tôi có thể chia sẻ với những người khác (Gist)

Tải tập tin lambda từ s3 sang tmp python

Nếu bạn không định cấu hình bộ chứa S3 của mình để cho phép truy cập công khai, bạn sẽ nhận được S3UploadFailedError

boto3.exceptions.S3UploadFailedError: Failed to upload sales_report.html to annageller/sales_report.html: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

Để giải quyết vấn đề này, bạn có thể bật quyền truy cập công khai cho các tệp cụ thể trên nhóm này hoặc bạn có thể sử dụng các URL được chỉ định như được minh họa trong phần bên dưới

6. Tạo các URL được chỉ định để truy cập tạm thời

Khi bạn tạo một báo cáo, nó có thể chứa dữ liệu nhạy cảm. Bạn có thể không muốn cho phép mọi người trên thế giới truy cập để xem các báo cáo kinh doanh của mình. Để giải quyết vấn đề này, bạn có thể tận dụng tính năng S3 được gọi là URL được chỉ định cho phép cấp quyền cho một đối tượng S3 cụ thể bằng cách nhúng trực tiếp mã thông báo xác thực tạm thời vào URL. Đây là ví dụ tương tự ở trên, nhưng hiện đang sử dụng bộ chứa S3 riêng tư (với “Chặn tất cả quyền truy cập công cộng” được đặt thành “Bật”) và một URL được chỉ định (Gist)

Tải tập tin lambda từ s3 sang tmp python

URL, được tạo bởi tập lệnh ở trên, sẽ trông giống như thế này

Tải tập tin lambda từ s3 sang tmp python
URL được chỉ định — hình ảnh của tác giả

7. Tải lên các tệp lớn với tính năng tải lên nhiều phần

Tải các tệp lớn lên S3 cùng một lúc có một nhược điểm đáng kể. nếu quá trình gần đến đích không thành công, bạn cần phải bắt đầu lại hoàn toàn từ đầu. Ngoài ra, quá trình này không thể song song hóa. AWS đã giải quyết vấn đề này bằng cách cung cấp tính năng tải lên nhiều phần. Quá trình này chia nhỏ các tệp lớn thành các phần (phần) liền kề nhau. Mỗi phần có thể được tải lên song song bằng nhiều luồng, điều này có thể tăng tốc đáng kể quá trình. Ngoài ra, nếu tải lên bất kỳ phần nào không thành công do sự cố mạng (mất gói), phần đó có thể được truyền lại mà không ảnh hưởng đến các phần khác

Để tận dụng tính năng tải lên nhiều phần trong Python, boto3 cung cấp một lớp TransferConfig trong mô-đun boto3. s3. chuyển khoản. Thông báo trước là bạn thực sự không cần phải sử dụng nó bằng tay. Bất cứ khi nào bạn sử dụng phương thức upload_file() của máy khách S3, nó sẽ tự động tận dụng tải lên nhiều phần cho các tệp lớn. Nhưng nếu bạn muốn tối ưu hóa các tệp tải lên của mình, bạn có thể thay đổi các tham số mặc định của TransferConfig thành

  • đặt số lượng chủ đề tùy chỉnh,
  • vô hiệu hóa đa luồng,
  • chỉ định ngưỡng tùy chỉnh mà từ đó boto3 sẽ chuyển sang tải lên nhiều phần

Hãy kiểm tra hiệu suất của một số tùy chọn cấu hình truyền tải. Trong các hình ảnh bên dưới, bạn có thể thấy thời gian tải lên 128. Tệp 3 MB từ bộ dữ liệu Taxi của Thành phố New York

  • sử dụng cấu hình mặc định,
  • chỉ định một số chủ đề tùy chỉnh,
  • vô hiệu hóa tải lên nhiều phần
Tải tập tin lambda từ s3 sang tmp python

Chúng ta có thể thấy từ hình ảnh trên rằng khi sử dụng mạng WiFi tương đối chậm, cấu hình mặc định cung cấp kết quả tải lên nhanh nhất. Ngược lại, khi sử dụng mạng nhanh hơn, quá trình song song hóa trên nhiều luồng hơn hóa ra nhanh hơn một chút

Tải tập tin lambda từ s3 sang tmp python

Bất kể tốc độ mạng của bạn như thế nào, việc sử dụng cấu hình mặc định dường như đủ tốt cho hầu hết các trường hợp sử dụng. Tải lên nhiều phần đã giúp tăng tốc hoạt động và thêm nhiều chủ đề không giúp ích gì. Điều này có thể khác nhau tùy thuộc vào kích thước tệp và độ ổn định của mạng của bạn. Nhưng từ thử nghiệm ở trên, chúng tôi có thể suy ra rằng tốt nhất là chỉ sử dụng s3. upload_file() mà không cần thay đổi cấu hình truyền theo cách thủ công. Boto3 chăm sóc điều đó đủ tốt dưới mui xe. Nhưng nếu bạn thực sự đang tìm cách tăng tốc độ truyền tệp S3, hãy xem phần bên dưới

Ghi chú. ProgressPercentage, được chuyển dưới dạng Gọi lại, là một lớp được lấy trực tiếp từ tài liệu boto3. Nó cho phép chúng tôi xem thanh tiến trình trong quá trình tải lên

8. Sử dụng Tăng tốc truyền S3

Trong phần trước, chúng tôi đã xem xét việc sử dụng tính năng tải lên nhiều phần để cải thiện hiệu suất. AWS cung cấp một tính năng khác có thể giúp chúng tôi tải lên các tệp lớn có tên là Tăng tốc truyền S3. Nó cho phép tăng tốc độ tải lên (PUT) và tải xuống (GET) trong khoảng cách xa giữa các ứng dụng hoặc người dùng gửi dữ liệu và bộ chứa S3 lưu trữ dữ liệu. Thay vì gửi dữ liệu trực tiếp đến vị trí mục tiêu, cuối cùng chúng tôi sẽ gửi dữ liệu đó đến một vị trí biên gần chúng tôi hơn và sau đó AWS sẽ gửi dữ liệu đó theo cách tối ưu hóa từ vị trí biên đến đích cuối.  

Tại sao nó là một cách “tối ưu hóa”? . e. từ vị trí biên đến đích đích trong một khu vực AWS cụ thể.  

Khi nào thì chúng tôi có thể thu được những lợi ích đáng kể khi sử dụng S3 Transfer Acceleration?

  • khi chúng tôi đang gửi các đối tượng lớn — thường là hơn 1 GB,
  • khi chúng tôi đang gửi dữ liệu trên một khoảng cách dài, ví dụ. từ khu vực eu-trung-1 đến chúng tôi-đông-1.  

Để bật tính năng này, hãy chuyển đến “Thuộc tính” trong trang nhóm S3 của bạn và chọn “Bật”

Tải tập tin lambda từ s3 sang tmp python

Ngoài ra, bạn có thể kích hoạt tính năng này từ Python (Gist)

Tải tập tin lambda từ s3 sang tmp python

Để sử dụng tính năng này trong boto3, chúng ta cần kích hoạt nó trên đối tượng máy khách S3 (Gist)

Tải tập tin lambda từ s3 sang tmp python

Bây giờ chúng ta có thể kiểm tra hiệu suất. Đầu tiên, hãy kiểm tra cùng một tệp từ phần trước. Chúng tôi hầu như không thể thấy bất kỳ sự cải thiện nào

Tải tập tin lambda từ s3 sang tmp python

Khi so sánh hiệu suất giữa việc chỉ thực hiện tải lên nhiều phần và bật thêm tính năng Tăng tốc truyền S3, chúng tôi có thể thấy rằng hiệu suất đạt được là rất nhỏ, bất kể kích thước đối tượng mà chúng tôi đã kiểm tra. Dưới đây là thử nghiệm tương tự bằng cách sử dụng tệp lớn hơn (1. kích thước 6 GB)

Tải tập tin lambda từ s3 sang tmp python

Trong ví dụ của chúng tôi, chúng tôi đã gửi dữ liệu từ Berlin đến khu vực trung tâm 1 ở Frankfurt (Đức). Vị trí cạnh gần nhất dường như nằm ở Hamburg. Khoảng cách khá ngắn. Nếu chúng tôi phải gửi cùng 1. 6 GB sang khu vực Hoa Kỳ, thì Tăng tốc truyền có thể mang lại lợi thế đáng chú ý hơn

TL; DR để tối ưu hóa hiệu suất tải lên và tải xuống bằng Boto3.  

  • bạn có thể yên tâm sử dụng cấu hình mặc định của s3_client. upload_file() trong hầu hết các trường hợp sử dụng — nó có các giá trị mặc định hợp lý cho tải lên nhiều phần và việc thay đổi bất kỳ thứ gì trong TransferConfig không mang lại bất kỳ lợi thế đáng kể nào trong thử nghiệm của chúng tôi,
  • chỉ sử dụng Tăng tốc truyền S3 khi gửi các tệp lớn ở khoảng cách xa, tôi. e. truyền dữ liệu xuyên khu vực của các tệp đặc biệt lớn

Ghi chú. bật Tăng tốc truyền S3 có thể phát sinh thêm chi phí truyền dữ liệu


Làm cách nào để giám sát các tắc nghẽn hiệu suất trong tập lệnh của bạn?

Trong hai phần trước, chúng ta đã xem xét cách tối ưu hóa việc truyền dữ liệu S3. Nếu bạn muốn theo dõi thêm các tắc nghẽn hoạt động trong tài nguyên không có máy chủ của mình, bạn có thể khám phá Dashbird — một nền tảng có khả năng quan sát để theo dõi khối lượng công việc không có máy chủ. Bạn có thể sử dụng nó để kiểm tra thời gian thực thi của các chức năng serverless, hàng đợi SQS, chủ đề SNS, bảng DynamoDB, luồng Kinesis, v.v. Nó cung cấp nhiều hình ảnh hóa và chế độ xem tổng hợp trên đầu trang nhật ký CloudWatch của bạn. Nếu bạn muốn bắt đầu với nền tảng này, bạn có thể tìm thêm thông tin tại đây

Lambda có thư mục tmp không?

Mặc dù AWS Lambda bao gồm một hệ thống tệp tạm thời 512 MB ( /tmp ) cho mã của bạn, nhưng đây là tài nguyên đầu tiên tạm thời không dành cho .

Tôi có thể đọc tệp S3 mà không cần tải xuống không?

Đọc các đối tượng mà không cần tải chúng xuống . using the S3 resource method put(), as demonstrated in the example below (Gist).

Lambda TMP có an toàn không?

Lambda luôn mã hóa các tệp mà bạn tải lên Lambda , bao gồm các gói triển khai và lưu trữ lớp. Amazon CloudWatch Logs và AWS X-Ray cũng mã hóa dữ liệu theo mặc định và có thể được định cấu hình để sử dụng khóa do khách hàng quản lý.