+6

Xử lý dữ liệu cơ bản trên S3 với boto3 và django-storage

Hiện nay, việc làm việc với dữ liệu trên đám mây đã trở thành một phần quan trọng và phổ biến. Trong số các dịch vụ đám mây phổ biến, Amazon Web Services (AWS) S3 (Simple Storage Service) là một trong những dịch vụ lưu trữ đám mây hàng đầu. Với khả năng linh hoạt, độ tin cậy và khả năng mở rộng, S3 đã trở thành một lựa chọn phổ biến cho việc lưu trữ và quản lý dữ liệu.

Trong bài viết này, chúng ta sẽ khám phá cách sử dụng 2 phương thức phổ biến để làm việc với S3 trong các dự án thực tế là boto3 và django-storage. Chúng ta cũng sẽ so sánh sự khác biệt giữa hai phương pháp và tìm hiểu lợi ích của việc sử dụng mỗi phương pháp trong các tình huống khác nhau.

1: Giới thiệu về boto3 và django-storage

1.1. Boto3

Boto3 là một thư viện Python mạnh mẽ được phát triển bởi Amazon Web Services (AWS) để tương tác với các dịch vụ của AWS. Trong trường hợp này, chúng ta sẽ tập trung vào việc sử dụng Boto3 để làm việc với dịch vụ lưu trữ đám mây của AWS, S3. Boto3 cung cấp một tập hợp các API và phương thức cho phép chúng ta thực hiện các thao tác cơ bản như tạo, xóa, tải lên, tải xuống và truy xuất các đối tượng (object) trên S3. Điều này cho phép chúng ta tạo ra các ứng dụng Django mạnh mẽ có khả năng làm việc với dữ liệu trên S3 một cách linh hoạt và dễ dàng.

1.2. Django-storage

Django-storage là một ứng dụng Django cung cấp tích hợp dễ dàng với các hệ thống lưu trữ đám mây như AWS S3. Django-storage được xây dựng trên nền tảng của Boto3 và cung cấp một lớp trừu tượng (abstract class) gọi là Storage để quản lý việc lưu trữ và truy xuất dữ liệu trên S3. Với Django-storage, chúng ta có thể định cấu hình dễ dàng để sử dụng S3 làm hệ thống lưu trữ cho các tệp tin trong dự án Django của mình. Nó cung cấp các trình quản lý tệp tin tiện lợi và tích hợp sẵn với Django, cho phép chúng ta lưu trữ các tệp tin như hình ảnh, tài liệu hoặc các tệp tin đa phương tiện khác trực tiếp trên S3. Django-storage cung cấp nhiều trình quản lý tệp tin khác nhau, bao gồm các trình quản lý tệp tin cơ bản, trình quản lý tệp tin nén và trình quản lý tệp tin tĩnh. Điều này cho phép chúng ta tuỳ chỉnh cách xử lý và lưu trữ tệp tin trên S3 theo nhu cầu của dự án.

Trong phần tiếp theo của bài viết này, chúng ta sẽ khám phá cách cấu hình và sử dụng Boto3 trực tiếp để tương tác với S3, sau đó đi sâu vào việc tích hợp Django-storage vào dự án Django để quản lý dữ liệu trên S3 một cách thuận tiện. Chúng ta sẽ tìm hiểu cách tải lên, tải xuống và xóa các tệp tin trên S3, cũng như các thao tác khác để làm việc với dữ liệu trên đám mây.

2. Sử dụng Boto3 để làm việc với S3

Boto3 cung cấp một phương thức đơn giản và hiệu quả để tương tác với dịch vụ lưu trữ đám mây S3. Trong phần này, chúng ta sẽ tìm hiểu cách cấu hình và sử dụng Boto3 để thực hiện các thao tác cơ bản như tải lên, tải xuống và xóa các đối tượng trên S3.

2.1. Cài đặt và cấu hình Boto3

Trước khi bắt đầu sử dụng Boto3, chúng ta cần cài đặt thư viện này trong môi trường phát triển của mình. Bạn có thể cài đặt Boto3 bằng câu lệnh:

pip install boto3

Sau khi cài đặt thành công, chúng ta cần cấu hình thông tin xác thực để kết nối với tài khoản AWS của chúng ta. Boto3 hỗ trợ nhiều phương pháp xác thực, bao gồm việc sử dụng khóa truy cập (access key) và mã bảo mật (secret key), hoặc sử dụng các phương pháp xác thực khác như IAM role hoặc hồ sơ AWS.

Sau đây là 1 ví dụ đơn giản:

import boto3

access_key = 'YOUR_ACCESS_KEY'
secret_key = 'YOUR_SECRET_KEY'

# Tạo một phiên bản của lớp S3 client và sử dụng nó để làm việc với S3
s3 = boto3.client('s3', aws_access_key_id=access_key, aws_secret_access_key=secret_key)

2.2. Tải lên đối tượng lên S3

Để tải lên một đối tượng (object) lên S3 bằng Boto3, chúng ta cần tạo một phiên bản của lớp boto3.client('s3') và sử dụng phương thức upload_file để tải lên tệp tin.

Dưới đây là một ví dụ minh họa:

# Tải lên tệp tin lên S3
s3.upload_file('local_file.txt', 'my-bucket', 'remote_file.txt')

Trong ví dụ trên, chúng ta sử dụng phương thức upload_file để tải lên tệp tin local_file.txt lên S3. Tham số đầu tiên là đường dẫn tệp tin ở local, tham số thứ hai là tên bucket trên S3, và tham số thứ ba là đường dẫn tới tệp tin trên S3.

2.3. Tải xuống đối tượng từ S3

Để tải xuống một đối tượng từ S3 bằng Boto3, ta cần sử dụng phương thức download_file của lớp S3 client.

Dưới đây là một ví dụ:

# Xóa đối tượng trên S3
s3.delete_object(Bucket='my-bucket', Key='remote_file.txt')

2.4. Xóa đối tượng trên S3

Để xóa một đối tượng trên S3 bằng Boto3, chúng ta sử dụng phương thức delete_object của lớp S3 client.

# Xóa đối tượng trên S3
s3.delete_object(Bucket='my-bucket', Key='remote_file.txt')

2.5. Tương tác với folder trên S3

Ở trên là các cách để tương tác với các tập tin trên S3, vậy còn với folder thì sao, liệu boto3 có hỗ trợ? Câu trả lời là có và cách thức thực hiện cũng khá dễ dàng.

Để tạo và xóa thư mục (folder) trên Amazon S3 bằng Boto3, bạn cần lưu ý rằng S3 không thực sự có khái niệm về thư mục. Thay vào đó, S3 sử dụng các khóa đường dẫn (key) của đối tượng để tạo cấu trúc thư mục ảo. Điều này có nghĩa là để tạo hoặc xóa một thư mục, bạn thực hiện các thao tác trên khóa (key) của đối tượng.

Dưới đây là cách tạo và xóa thư mục (folder) trên S3 bằng Boto3:

2.5.1. Tạo thư mục (folder):

# Tạo thư mục (folder) trên S3 bằng cách tạo một đối tượng có khóa (key) kết thúc bằng "/"
s3.put_object(Bucket='my-bucket', Key='folder_name/')

Trong ví dụ trên, chúng ta sử dụng phương thức put_object để tạo một đối tượng trên S3 với khóa (key) là 'folder_name/'. Lưu ý rằng tên thư mục được tạo kết thúc bằng dấu gạch chéo chéo ("/") để đại diện cho một thư mục.

2.5.2. Xóa thư mục (folder):

# Xóa thư mục (folder) trên S3 bằng cách xóa tất cả các đối tượng có khóa (key) bắt đầu với tên thư mục
s3.delete_objects(Bucket='my-bucket', Delete={'Objects': [{'Key': 'folder_name/'}]})

Lưu ý rằng việc xóa thư mục chỉ xóa các đối tượng con trong thư mục đó, không xóa thư mục cha. Nếu thư mục không chứa bất kỳ đối tượng nào khác, thư mục sẽ không còn tồn tại trên S3.

Trên đây là một số thao tác cơ bản để làm việc với S3 bằng Boto3. Boto3 cung cấp nhiều phương thức khác để thực hiện các thao tác phức tạp như quản lý bucket, quyền truy cập, mã hóa và nhiều hơn nữa. Bạn có thể tìm hiểu thêm chi tiết và ví dụ trong tài liệu chính thức của Boto3.

3. Sử dụng Django-storage trong các dự án Django

Trong các dự án Django, ngoài Boto3 chúng ta còn có thể sử dụng chính thư viện Django-storage để tương tác với S3.

Trong phần này, chúng ta sẽ tìm hiểu cách sử dụng Django-storage để tương tác với dữ liệu trên dịch vụ lưu trữ đám mây Amazon S3. Django-storage cung cấp một cách đơn giản và tiện lợi để quản lý và xử lý tệp tin trên S3 trong dự án Django của bạn.

3.1. Cài đặt và cấu hình Django-storage

Để bắt đầu, chúng ta cần cài đặt Django-storage.

pip install django-storages

Sau khi cài đặt Django-storage, chúng ta cần cấu hình nó để sử dụng dịch vụ lưu trữ S3. Để làm điều này, hãy làm theo các bước sau:

  1. Mở file settings.py trong dự án Django của bạn.
  2. Thêm 'storages' vào danh sách INSTALLED_APPS:
INSTALLED_APPS = [
    # ...
    'storages',
    # ...
]
  1. Đặt giá trị DEFAULT_FILE_STORAGE thành 'storages.backends.s3boto3.S3Boto3Storage'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
  1. Cấu hình thông tin xác thực S3 bằng cách thêm các khóa và giá trị sau vào file settings.py
AWS_ACCESS_KEY_ID = 'YOUR_ACCESS_KEY'
AWS_SECRET_ACCESS_KEY = 'YOUR_SECRET_KEY'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'
AWS_S3_REGION_NAME = 'your-region'  # Ví dụ: 'us-west-1'

Hãy thay thế 'YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY', 'your-bucket-name', và 'your-region' bằng thông tin xác thực và cấu hình S3 của bạn.

3.2. Tải lên tệp tin lên S3

from django.core.files.storage import default_storage

def upload_file(file):
    file_name = default_storage.save(file.name, file)
    return file_name

Trong ví dụ trên, chúng ta sử dụng default_storage.save() để tải lên tệp tin từ request lên S3 và trả về tên tệp tin đã được lưu trữ trên S3. Với 2 tham số đầu vào là tên file cần lưu và giá trị của file đó.

3.3. Truy xuất tệp tin từ S3

from django.core.files.storage import default_storage

def get_file(file_name):
    file = default_storage.open(file_name)
    content = file.read()
    file.close()
    return content

Trong ví dụ trên, chúng ta sử dụng default_storage.open() để mở tệp tin từ S3 và đọc nội dung của nó. Tham số đầu vào là đường dẫn vị trí file được lưu trên S3.

3.4. Xóa tệp tin trên S3

from django.core.files.storage import default_storage

def delete_file(file_name):
    default_storage.delete(file_name)

Trong ví dụ trên, chúng ta sử dụng default_storage.delete() để xóa tệp tin từ S3.

3.5. Tương tác với folder trên S3

Tương tự như boto3, Django-storge cũng cung cấp phương thức tạo và xóa folder trên S3 nhưng sẽ có những sự khác nhau tương đối rõ rệt.

Ở Django-storage không cho phép tạo 1 folder trống trên S3, khi chúng ta thực hiện upload 1 file lên S3 nếu trong đường dẫn của file đó có chứa 1 folder chưa tồn tại thì Django sẽ tạo luôn folder mới đó để đẩy file lên.

Còn với việc xóa folder thì trên Django cũng không hỗ trợ việc xóa trực tiếp folder mà chúng ta cần xóa sạch các file con bên trong folder. Khi folder trống thì chúng ta mới có thể thực hiện xóa folder bằng lệnh:

default_storage.delete(f"{folder_path}/")

Dưới đây là 1 ví dụ xóa 1 folder:

def remove_s3_folder(self, folder_path):
        sub_folders, sub_files = default_storage.listdir(f"{folder_path}/")
        for file in sub_files:
            self.remove_s3_files(f"{folder_path}/{file})

        for sub_folder in sub_folders:
            self.remove_s3_folder(f"{folder_path}/{sub_folder}")

        default_storage.delete(f"{folder_path}/")

    def remove_s3_files(self, folder_path, file_names):
        for file_name in file_names:
            try:
                file_path = f"{folder_path}/{file_name}"
                default_storage.delete(file_path)

Ở ví dụ trên có thêm 1 lệnh mới là default_storage.listdir(f"{folder_path}/") dùng để lấy ra các file con và folder con bên trong 1 folder.

Trên đây là một số thao tác cơ bản để làm việc với S3 bằng Django-storage. Bạn có thể tìm hiểu thêm chi tiết và ví dụ trong tài liệu chính thức của Django-storage.

4. Kết luận

Trong bài viết trên, tôi đã trình bày sơ lược về cách sử dụng 2 thư viện để tương tác với dữ liệu trên S3. Có thể thấy tuy có các chức năng khá tương đồng nhưng cách sử dụng 2 thư viện cũng có khác nhiều khác biệt. Ở Boto3, việc ghi, đọc và xóa file/folder trên S3 là tương đối đơn giản và được tối ưu nhưng cần phải cấu hình các client lúc bắt đầu mỗi khi thực hiện gọi lên S3, việc này có thể sẽ không phù hợp với 1 vài dự án đặc thù. Với Django-storage thì việc cấu hình chỉ phải thực hiện một lần duy nhất giúp tối ưu công việc, nhưng thư viện này chỉ có thể dùng với dự án Django và việc tương tác với các folder tương đối phức tạp. Vì vậy tùy vào yêu cầu của dự án, chúng ta có thể cân nhắc và lựa chọn thư viện để sử dụng một cách phù hợp nhất.

Trên đây là toàn bộ kiến thức về Boto3 và Django mà tôi tìm hiểu và trải nghiệm được trong quá trình làm dự án. Nếu có phần nào chưa được chính xác hay có điều gì mọi người muốn đóng góp, hãy để lại ý kiến của mình ở comment. Cảm ơn đã dành thời gian đọc bài viết của tôi!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.