Điện toán đám mây với Amazon Web Services, Phần 2: Lưu trữ trong đám mây với Amazon Simple Storage Service (S3)

Lưu trữ và lấy dữ liệu tin cậy, mềm dẻo, và rẻ

Tìm hiểu về các khái niệm cơ bản của Amazon SimpleDB (SDB) và khám phá một số chức năng được cung cấp bởi boto, một thư viện mã nguồn mở Python cho các tương tác với SDB. Trong loạt bài viết về "Điện toán đám mây với Amazon Web Services" tìm hiểu về điện toán đám mây bằng cách sử dụng các dịch vụ Web của Amazon. Tìm hiểu làm thế nào các dịch vụ cung cấp cách thay thế hấp dẫn cho kiến trúc và xây dựng các ứng dụng đáng tin cậy và có thể mở rộng. Bài này nghiên cứu sâu về các dịch vụ có tính mở rộng cao và phản hồi nhanh được cung cấp bởi dịch vụ lưu trữ đơn giản của Amazon, tên là Amazon Simple Storage Service (S3). Tìm hiểu các công cụ để tương tác với S3, và sử dụng các đoạn mã mẫu để thử nghiệm.

Prabhakar Chaganti, Kiến trúc sư trưởng, Ylastic, LLC

Prabhakar Chaganti photoPrabhakar Chaganti là CTO của Ylastic, là người đầu tiên thực hiện xây dựng một giao diện thống nhất cho các nhà kiến trúc sư, nhà quản lý và người giám sát của môi trường điện toán đám mây AWS: EC2, S3, SQS và SimpleDB. Ông cũng là tác giả của hai trong số các cuốn sách được xuất bản gần đây, là Xen Virtualization và GWT Java AJAX Programing. Đồng thời ông cũng giành được giải thưởng cao nhất cho hầu hết các sáng tạo ứng dụng máy ảo trong VMware Global Virtual Appliance Challenge



20 05 2009

Dịch vụ lưu trữ đơn giản của Amazon (Amazon Simple Storage Service)

Phần 1 Của loạt bài viết này giới thiệu về các nền tảng cơ bản của các dịch vụ Amazon Web Services và giải thích cách bạn có thể sử dụng nền tảng ảo này để xây dụng các ứng dụng trên web.

Trong bài viết này, tìm hiểu thêm về dịch vụ lưu trữ đơn giản của Amazon, Amazon Simple Storage Service (S3). S3 là hệ thống lưu trữ dữ liệu nhanh và có thể mở rộng được trên internet giúp bạn lưu trữ và lấy dữ liệu một cách đơn giản với bất cứ dung lượng nào, bất cứ khi nào và bất cứ đâu trên thế giới. Bạn trả phí dựa trên dung lượng lưu trữ và băng thông mà bạn dùng. Không phí cài đặt, không phí tối thiểu hay phí phụ trội.

Amazon cung cấp sự quản lý và duy trì của nền tảng lưu trữ, giúp bạn thoải mái tập trung vào các chức năng quan trọng của hệ thống và ứng dụng của bạn. S3 là nền tảng công nghiệp mà luôn sẵn sàng cho nhu cầu lưu trữ dữ liệu của bạn. Nó tuyệt vời cho:

  • Lưu trữ dữ liệu cho các ứng dụng của bạn.
  • Sao lưu dữ liệu cho doanh nghiệp hoặc cá nhân.
  • Phân tán nhanh và rẻ các nội dung làm tiêu hao băng thông lớn tới khách hàng của bạn.

Tính năng của S3 bao gồm:

Tính ổn định
Nó được thiết kế để chịu được các hỏng hóc và phục hồi hệ thống rất nhanh với thời gian tối thiểu. Amazon cung cấp một thỏa thuận cấp dịch vụ (service-level agreement - SLA) để duy trì tính sẵn sàng ở mức 99.99 phần trăm.
Đơn giản, dễ dùng
S3 được xây dụng trên các khái niệm đơn giản và cung cấp tính mềm dẻo cao cho việc phát triển các ứng dụng của bạn. Bạn có thể xây dựng các lược đồ lưu trữ phức tạp hơn, nếu cần, bằng cách thêm các hàm vào các thành phần của S3.
Tính mở rộng
Thiết kế của S3 cung cấp một cấp độ cao về tính mở rộng và cho phép sự điều chỉnh dễ dàng trong dịch vụ khi lượng truy cập vào ứng dụng web của bạn tăng đột biến với lưu lượng khổng lồ.
Rẻ
Chi phí sử dụng S3 rất cạnh tranh với các giải pháp của công ty và cá nhân khác trên thị trường.

Ba khái niệm nền tảng cho khung làm việc S3 là thùng (buckets), đối tượng (objects), và khóa (keys).

Thùng (Buckets)

Thùng là các nền tảng cơ bản nhất. Mỗi đối tượng được lưu trữ trong Amazon S3 đều được chứa trong một thùng. Thùng có thể được hiểu như là một thư mục trên hệ thống tệp. Điểm mấu chốt để phân biệt giữa thư mục và thùng là mỗi thùng và các nội dung của nó có thể truy cập được thông qua URL. Ví dụ, nếu bạn có một thùng tên là "prabhakar," nó có thể truy cập được thông qua URL http://prabhakar.s3.amazonaws.com.

Mỗi tài khoản S3 có thể có tối đa 100 thùng. Một thùng không thể chứa thùng khác, nên bạn không thể tạo thùng trong thùng được. Bạn có thể thay đổi vị trí địa lý của các thùng của bạn bằng cách chỉ rõ một vị trí khi bạn tạo chúng. Điều này sẽ đảm bảo một cách tự động rằng tất cả các đối tượng mà bạn lưu trữ trong thùng đó sẽ được lưu trữ trong cùng vị trí địa lý. Tại thời điểm này, bạn có thể đặt các thùng của bạn ở Mỹ hoặc liên minh châu Âu. Nếu bạn không chỉ rõ một vị trí khi tạo thùng, thùng đó và nội dung của nó sẽ được lưu trữ tại vị trí gần địa chỉ thanh toán trên tài khoản của bạn nhất.

Các tên của thùng cần tuân theo các yêu cầu của S3:

  • Tên phải bắt đầu bằng một số hoặc một chữ cái.
  • Độ dài của tên tối thiểu là 3 và dài nhất là 255.
  • Một tên có hiệu lực có thể chỉ chứa các ký tự viết thường, chữ số, dấu chấm, dấu gạch chân, và gấu gạch ngang.
  • Mặc dù tên có thể có chữ số và dấu chấm, nhưng chúng không được sử dụng định dạng số IP. Bạn không thể có một thùng với tên là 192.168.1.254.
  • Không gian tên thùng được chia sẻ giữa các thùng trong tất cả các tài khoản trong S3. Vì vậy, tên của bạn phải là duy nhất trong S3.

Các thùng mà sẽ chứa các đối tượng mà sẽ được truy cập bởi các địa chỉ URLs phải tuân theo các yêu cầu phụ của S3 như sau:

  • Tên của các thùng không được chứa dấu gạch dưới.
  • Độ dài từ 3 đến 63 ký tự.
  • Tên không thể kết thúc với một dấu gạch ngang. Ví dụ, tên myfavorite-.bucket.com là không hợp lệ.
  • Không chứa dấu gạch ngang đứng ngay trước dấu chấm. Tên my-.bucket.com là không hợp lệ.

Bạn có thể sử dụng một quy ước đặt tên miền cho các thùng của bạn, như là media.yourdomain.com, và ánh xạ các tên miền và tên miền con web sẵn có của bạn tới Amazon S3. Việc ánh xạ thực sự sẽ được hoàn tất khi bạn thêm DNS CNAME để trỏ tới S3. Lợi ích to lớn với lược đồ này là bạn có thể sử dụng chính tên miền của bạn trong các địa chỉ URL của bạn để tải các tệp. Ánh xạ CNAME sẽ chịu trách nhiệm cho việc chuyển đổi giữa các địa chỉ S3 cho các thùng của bạn. Ví dụ, http://media.yourdomain.com.s3.amazonaws.com trở thành địa chỉ thân thiện hơn http://media.yourdomain.com.

Đối tượng (Objects)

Các đối tượng chứa dữ liệu được lưu trữ trong các thùng ở S3. Các đối tượng được coi như là các tệp mà bạn muốn lưu trữ. Mỗi đối tượng được lưu trữ được cấu thành bởi hai thực thể: dữ liệu (data) và dữ liệu thông tin (metadata). Dữ liệu là dữ liệu thực mà bạn bạn muốn lưu trữ, như là tệp PDF, tài liệu Word, một tệp video, vân vân. Dữ liệu lưu trữ được gắn với dữ liệu thông tin để mô tả đối tượng. Một vài ví dụ của dữ liệu thông tin như là kiểu của đối tượng được lưu trữ, ngày chỉnh sửa cuối cùng, và bất cứ thông tin cụ thể nào khác. Dữ liệu thông tin cho một đối tượng được chỉ ra bởi người phát triển như là cặp khóa giá trị (key value pairs) khi đối tượng đó được gửi tới S3 để lưu trữ.

Không giống như sự giới hạn về số lượng các thùng, số lượng đối tượng không bị hạn chế. Bạn có thể lưu trữ một số lượng vô hạn các đối tượng trong các thùng của bạn, và mỗi đối tượng có thể chứ đến 5GB dữ liệu.

Dữ liệu trong các đối tượng S3 công cộng của bạn có thể lấy được qua HTTP, HTTPS, hoặc BitTorrent. Phân tán các tệp nghe nhìn lớn từ tài khoản S3 của bạn sẽ trở lên rất đơn giản khi sử dụng BitTorrent; Amazon không chỉ tạo torrent cho đối tượng của bạn, mà còn lưu trữ (seed) nó.

Khóa

Mỗi đối tượng lưu trữ trong một thùng S3 được định danh bởi một khóa duy nhất. Nó cũng giống như khái niệm tên tệp trong một thư mục trên hệ thống tệp của bạn. Tên tệp trong một thư mục trên đĩa cứng của bạn phải là duy nhất. Mỗi đối tượng trong một thùng chỉ có một khóa. Tên của thùng và khóa được sử dụng cùng nhau để cung cấp định danh duy nhất cho mỗi đối tượng lưu trữ trong S3.

Mọi đối tượng trong S3 đều có thể truy cập bằng cách sử dụng một địa chỉ URL kết hợp địa chỉ URL của S3, tên thùng và khóa duy nhất. Nếu bạn lưu trữ một đối tượng với khóa my_favorite_video.mov bên trong một thùng tên là prabhakar, đối tượng đó có thể được truy cập thông qua địa chỉ URL http://prabhakar.s3.amazonaws.com/ my_favorite_video.mov.

Mặc dù các khái niệm là đơn giản, như trong hình 1, các thùng, các đối tượng, các khóa cùng nhau cung cấp tính mềm dẻo cho việc xây dựng các giải pháp lưu trữ dữ liệu của bạn. Bạn có thể sử dụng những viên gạch móng này để lưu trữ dữ liệu một cách đơn giản trên S3, hoặc sử dụng tính mềm dẻo của chúng để xây dựng kho lưu trữ và các ứng dụng phức hợp trên S3 để cung cấp các tính năng mới.

Hình 1. Khái niệm của S3
Khái niệm của S3

Nhật ký truy cập

Mỗi thùng trong S3 có thể có các bản ghi lịch sử truy cập mà chứa chi tiết về các yêu cầu tới một đối tượng được chứa trong nó. Theo mặc định, bản ghi lịch sử truy cập bị tắt; bạn có thể bật nó lên để ghi lại các truy cập cho mỗi thùng mà bạn muốn theo dõi. Mội bản ghi lịch sử truy cập chứa rất nhiều thông tin chi tiết về yêu cầu, bao gồm kiểu yêu cầu, tài nguyên được yêu cầu, và thời gian mà yêu cầu được xử lý.

Các nhật ký truy cập được cung cấp dưới định dạng nhật ký truy cập máy chủ của S3, nhưng có thể được chuyển đổi một cách dễ dàng sang định dạng nhật ký tổ hợp của Apache. Sau đó chúng có thể được phân tích bởi bất cứ công cụ thương mại hay mã mở nào, như là Webalizer, để cho bạn một bản báo cáo mà con người có thể đọc được với các biểu đồ theo yêu cầu. Các báo cáo có thể hữu dụng cho việc tìm hiểu về cơ sở của khách hàng của bạn. Tìm các công cụ mà bạn có thể sử dụng để xem các bản ghi lịch sử truy cập S3 trên Tài nguyên.


Bảo mật

Mỗi thùng và đối tượng được tạo trong S3 được bảo mật riêng cho tài khoản tạo ra chúng. Bạn phải cấp quyền truy cập cho người dùng khác và các khách hàng để họ có thể xem danh sách các đối tượng trong các thùng S3 của bạn hoặc tải dữ liệu được chứa trong chúng. Amazon S3 cung cấp các tính năng bảo mật sau để bảo vệ các thùng và các đối tượng trong thùng của bạn.

Sự chứng thực (Authentication)
Đảm bảo rằng yêu cầu đang gửi bởi người dùng mà sở hữu thùng hoặc đối tượng. Mỗi yêu cầu trên S3 phải bao gồm khóa truy cập Amazon Web Services xác định người dùng một cách duy nhất.
Sự cấp phép (Authorization)
Đảm bảo rằng người dùng đang cố gắng truy cập tới tài nguyên có quyền truy cập tới tài nguyên đó. Mỗi đối tượng S3 có một danh sách quản lý truy cập (access-control list - ACL) gắn với nó mà xác định một cách minh bạch các quyền và giới hạn cho tài nguyên đó. Bạn có thể cấp quyền truy cập tới tất cả các người dùng của Amazon Web Services hoặc tới một người dùng cụ thể được xác định bởi địa chỉ email, hoặc bạn có thể cấp quyền truy cập nặc danh cho mọi người dùng.
Tính tích hợp (Integrity)
Mỗi yêu cầu E3 phải có chữ ký số của người dùng yêu cầu với một khóa bí mật của Amazon Web Services. Khi nhận được yêu cầu, S3 sẽ kiểm tra chữ ký để đảm bảo rằng yêu cầu đó không bị can thiệp trong quá trình luân chuyển.
Mã hóa (Encryption)
Bạn có thể truy cập S3 thông qua giao thức HTTPS để đảm bảo rằng dữ liệu được chuyển đi thông qua một kết nối được mã hóa.
Không từ chối (Nonrepudiation)
Mỗi yêu cầu S3 được dán tem thời gian (time-stamped) và phục vụ như chứng cớ của giao dịch.

Mỗi và mọi yêu cầu REST gửi tới S3 phải trải qua các bước cơ bản cần thiết cho việc bảo mật sau:

  • Yêu cầu và các tham số cần thiết phải được gộp lại thành một chuỗi ký tự (string).
  • Khóa truy cập bí mật Amazon Web Services của bạn phải được sử dụng để tạo một chữ ký băm xác thực (keyed-Hash Message Authentication Code - HMAC) của chuỗi yêu cầu.
  • Chữ ký này được thêm vào như là một tham số của yêu cầu.
  • Sau đó yêu cầu được chuyển tiếp đến Amazon S3.
  • Amazon S3 sẽ kiểm tra xem nếu chữ ký được cung cấp có là một chữ ký băm xác thực hợp lệ của yêu cầu không.
  • Nếu (và chỉ nếu) chữ ký là hợp lệ, thì Amazon S3 mới tiến hành xử lý yêu cầu.

Giá

Phí sử dụng cho S3 được tính dựa trên ba tiêu chí, nó khác nhau dựa trên vị trí địa lý của các thùng của bạn:

  • Tổng không gian lưu trữ được sử dụng, cái mà bao gồm kích thước thực của nội dung dữ liệu của bạn và dữ liệu thông tin gắn với nó. Đơn vị được sử dụng bởi S3 để xác định sự sử dụng không gian lưu trữ là GB/tháng. Số lượng byte của kho lưu trữ được sử dụng bởi tài khoản của bạn được cập nhật cho từng giờ, và đến cuối tháng, nó sẽ được chuyển đổi sang cả tháng. Bảng dưới đây cung cấp giá cho việc lưu trữ.
    Vị trígiá
    Mỹ $0.15 một tháng cho 1 GB được sử dụng
    Châu Âu $0.18 một tháng cho 1 GB được sử dụng
  • Lượng dữ liệu hoặc băng thông được chuyển đi và đến S3. Nó bao gồm tất cả dữ liệu được tải lên và tải xuống từ S3. Việc chuyển dữ liệu giữa các thùng S3 và EC2 được đặt ở Mỹ là miễn phí. Truyền dữ liệu giữa EC2 và S3 ở châu Âu được tính theo phí truyền dữ liệu tiêu chuẩn, như sau.
    Vị tríGiá
    Mỹ $0.100 cho 1 GB — tất cả dữ liệu truyền đến

    $0.170 cho 1 GB — 10 TB dữ liệu đầu tiên truyền đi trong tháng
    $0.130 cho 1 GB — 40 TB dữ liệu tiếp theo truyền đi trong tháng
    $0.110 cho 1 GB — 100 TB dữ liệu tiếp theo truyền đi trong tháng
    $0.100 cho 1 GB — dữ liệu truyền đi trong tháng vượt quá 150 TB
    Châu Âu $0.100 cho 1 GB — tất cả dữ liệu truyền đến

    $0.170 cho 1 GB — 10 TB dữ liệu đầu tiên truyền đi trong tháng
    $0.130 cho 1 GB — 40 TB dữ liệu tiếp theo truyền đi trong tháng
    $0.110 cho 1 GB — 100 TB dữ liệu tiếp theo truyền đi trong tháng
    $0.100 cho 1 GB — dữ liệu truyền đi trong tháng vượt quá 150 TB
  • Số yêu cầu API được thực hiện. S3 tính phí cho mỗi yêu cầu sử dụng giao diện — để tạo các đối tượng, liệt kê các thùng, liệt kê các đối tượng, vân vân và vân vân. Việc xóa các đối tượng và thùng không bị tính phí. Phí một lần nữa lại khác nhau một chút dựa trên vị trí địa lý của thùng. Bảng sau đưa ra giá cho các yêu cầu API.
    Vị tríGiá
    Mỹ $0.01 cho 1,000 yêu cầu PUT, POST, hoặc LIST
    $0.01 cho 10,000 yêu cầu GET và các yêu cầu khác
    Miễn phí cho các yêu cầu xóa
    Châu Âu $0.012 cho 1,000 yêu cầu PUT, POST, hoặc LIST
    $0.012 cho 10,000 yêu cầu GET và các yêu cầu khác
    Miễn phí cho các yêu cầu xóa

Tham khảo Amazon S3 để biết giá mới nhất. Bạn cũng có thể sử dụng máy tính AWS Simple Monthly Calculator để tính chi phí hàng tháng sử dụng dịch vụ S3 và các dịch vụ Amazon Web Services khác của bạn.


Bắt đầu với Amazon Web Services và S3

Để bắt đầu khám phá S3, bạn cần đăng ký một tài khoản Amazon Web Services. Bạn sẽ được cung cấp một số tài khoản Amazon Web Services và sẽ nhận được các khóa truy cập an toàn cùng với chứng chỉ bảo mật x.509 cái mà sẽ được yêu cầu khi bạn bắt đầu sử dụng các thư viện và công cụ để tương tác với S3.

Tất cả các giao tiếp với bất kỳ dịch vụ nào của Amazon Web Services đều thông qua giao diện SOAP hoặc giao diện query/REST. Các thông điệp yêu cầu mà được gửi qua một trong hai giao diện này phải được xác nhận bằng chữ ký số bởi người sử dụng gửi nó để đảm bảo rằng thông điệp đó không bị can thiệp trong quá trình luân chuyển, và rằng chúng thực sự còn nguyên vẹn như khi được gửi. Đây là phần cơ bản nhất của việc sử dụng các API của Amazon Web Services. Mỗi yêu cầu phải được xác thực bằng chữ ký số và chữ ký đó được gắn với yêu cầu.

Mỗi tài khoản người dùng Amazon Web Services đều được gắn với các chứng thư (credential) an toàn sau:

  • Một ID khóa an toàn định danh bạn như là người tạo ra các yêu cầu thông qua giao diện query/REST.
  • Một khóa truy cập bí mật để tạo ra chữ ký số khi bạn tạo các yêu cầu thông qua giao diện query.
  • Các chứng nhận x.509 riêng và công cộng và sự xác thực khi sử dụng giao diện SOAP.

Bạn có thể quản lý các khóa và chứng chỉ của bạn, tái tạo chúng, xem hoạt động và các báo cáo sử dụng của tài khoản, và thay đổi thông tin hồ sơ của bạn từ trang thông tin tài khoản của Amazon Web Services.

Sau khi bạn đăng ký tài khoản thành công, bạn cần kích hoạt dịch vụ Amazon S3 cho tài khoản của bạn bằng cách thực hiện các bước sau:

  1. Đăng nhập vào tài khoản Amazon Web Services của bạn.
  2. Tìm đến trang chủ S3.
  3. Nhấn vào Sign Up For This Web Service ở bên phải của trang.
  4. Cung cấp các thông tin cần thiết và hoàn tất quá trình đăng ký.

Các ví dụ trong bài này sử dụng giao diện query/REST để giao tiếp với S3. Bạn sẽ cần các khóa truy cập. Bạn có thể lấy chúng từ trang thông tin tài khoản Amazon Web Services của bạn bằng cách chọn View Access Key Identifiers. Bây giờ bạn đã sẵn sàng để sử dụng dịch vụ Amazon Web Services và đã kích hoạt dịch vụ S3 cho tài khoản của bạn.


Tương tác với S3

Để tìm hiểu về tương tác với S3, bạn có thể sử dụng các thư viện có sẵn của Amazon hoặc của bên thứ 3. Bài viết này không đi sâu vào chi tiết của việc giao tiếp với S3, như là cách ký yêu cầu, cách xây dựng các tài liệu XML được dùng cho việc đóng gói dữ liệu, hay các tham số được gửi đến và đi từ S3. Chúng ta sẽ để các thư viện xử lý những việc đó, và sẽ sử dụng các giao diện mức cao mà chúng cung cấp. Bạn có thể xem hướng dẫn cho nhà phát triển S3 để biết thêm chi tiết.

Bạn sẽ sử dụng một thư viện Java™ mã mở tên là JetS3t để khám phá S3, và tìm hiểu về các API của nó bằng cách xem các đoạn mã nhỏ. Ở cuối bài viết này bạn sẽ thu thập và tổ chức những đoạn mã nhỏ này vào một shell S3 đơn giản và tiện lợi mà bạn có thể sử dụng bất cứ khi nào để thư nghiệm và tương tác với S3.

JetS3t

JetS3t là một công cụ Java mã mở để tương tác với S3. Nó còn hơn là một thư viện. Bản phân phối có chứa một vài công cụ liên quan tới S3 rất hữu dụng mà có thể được sử dụng bởi người dùng S3 bình thường cũng như những người cung cấp dịch vụ. JetS3t bao gồm:

Cockpit
Một giao diện đồ họa để quản lý các nội dung của một tài khoản Amazon S3.
Synchronize
Một ứng dụng dòng lệnh để đồng bộ hóa các thư mục trên máy tính của bạn với tài khoản S3.
Gatekeeper
Một servlet mà bạn có thể sử dụng để quản lý truy cập tới tài khoản S3 của bạn.
CockpitLite
Một phiên bản rút gọn của Cockpit mà điều hướng tất cả các thao tác thông qua dịch vụ gatekeeper.
Uploader
Một giao diện đồ họa mà điều hướng toàn bộ các thao tác thông qua dịch vụ gatekeeper và có thể được sử dụng bởi người cung cấp dịch vụ để cung cấp truy cập tài khoản S3 cho các khách hàng.

Tải bản phát hành mới nhất của JetS3t.

Tất nhiên, bạn có thể sử dụng một trong các ứng dụng có giao diện đồ họa để tương tác với S3, nhưng nó sẽ không có ích nếu bạn cần phát triển các ứng dụng để giao tiếp với S3. Bạn có thể tải toàn bộ mã nguồn cho bài viết này như là một tệp nén, bao gồm dự án Netbeans mà bạn có thể nhập vào không gian làm việc (workspace) của bạn.

Kết nối tới S3

JetS3t cung cấp một lớp trừu tượng tên là org.jets3t.service.S3Service mà phải được mở rộng bởi các lớp mà cài đặt một giao diện cụ thể, như là REST hoặc SOAP. JetS3t cung cấp hai bản cài đặt mà bạn có thể sử dụng để kết nối và tương tác với S3:

  • org.jets3t.service.impl.rest.httpclient.RestS3Service giao tiếp với S3 thông qua giao diện REST.
  • org.jets3t.service.impl.soap.axis.SoapS3Service giao tiếp với S3 thông qua giao diện SOAP sử dụng Apache Axis 1.4.

JetS3t sử dụng một tệp tên là jets3t.properties để cấu hình một loạt tham số được sử dụng trong khi giao tiếp với S3. Ví dụ trong bài này sử dụng tệp mặc định jets3t.properties. Hướng dẫn cấu hình của JetS3t có giải thích chi tiết về các tham số.

Trong bài viết này, bạn sẽ sử dụng RestS3Service để kết nối tới S3. Một đối tượng RestS3Service có thể được tạo ra bằng cách cung cấp các khóa truy cập dịch vụ Amazon Web Services của bạn trong mẫu AWSCredentials. Hãy nhớ rằng các đoạn mã trong bài viết này là để trình diễn các API. Để thực thi mỗi đoạn mã, bạn cần đảm bảo rằng tất cả các lớp cần thiết đã sẵn sàng. Tham khảo tới tới nguồn trong gói tải về để có được các lớp cần thiết. Hoặc, đơn giản hơn, bạn có thể nhập dự án Netbeans vào không gian làm việc của bạn để truy cập tới các mã nguồn dễ dàng.

Ví dụ 1. Tạo một RestS3Service
String awsAccessKey = ”Your AWS access key”;
String awsSecretKey = “Your AWS Secret key”;

// use your AWS keys to create a credentials object
AWSCredentials awsCredentials = new AWSCredentials(awsAccessKey, awsSecretKey);

// create the service object with our AWS credentials
S3Service s3Service = new RestS3Service(awsCredentials);

Quản lý các thùng của bạn

Khái niệm của một thùng được đóng gói bởi org.jets3t.service.model.S3Bucket, cái mà mở rộng lớp org.jets3t.service.model.BaseS3Object. Lớp này là lớp cha của cả thùng và đối tượng trong mô hình JetS3t. Mỗi đối tượng S3Bucket cung cấp một phương thức, toString(), bên cạnh các phương thức tiền bối khác, mà có thể được sử dụng để in thông tin cho một thùng (tên và vị trí địa lý của thùng, thời điểm thùng được tạo, tên chủ sở hữu, và bất kỳ dữ liệu thông tin nào được gắn với thùng).

Ví dụ 2. Liệt kê các thùng
// list all buckets in the AWS account and print info for each bucket.
S3Bucket[] buckets = s3Service.listAllBuckets();
for (S3Bucket b : buckets) {
   System.out.println(b);
}

Bạn có thể tạo một thùng mới bằng cách cung cấp một tên duy nhất cho nó. Không gian tên của các thùng được chia sẻ bởi toàn bộ tài khoản người dùng, nên đôi khi tìm một tên duy nhất tương đối mệt. Bạn cũng có thể chỉ rõ vị trí địa lý bạn muốn đặt thùng và các đối tượng mà sẽ được chứa trong nó.

Ví dụ 3. Tạo các thùng
// create a US bucket and print its info
S3Bucket bucket = s3Service.createBucket(bucketName);
System.out.println("Created bucket - " + bucketName + " - " + bucket);


// create a EU bucket and print its info
S3Bucket bucket = s3Service.createBucket(bucketName, S3Bucket.LOCATION_EUROPE);
System.out.println("Created bucket - " + bucketName + " - " + bucket);

Bạn phải xóa toàn bộ các đối tượng chứa trong thùng trước khi xóa thùng đó nếu không sẽ có cảnh báo. Lớp RestS3Service mà bạn đang dùng là ổn cho việc xử lý với các đối tượng đơn lẻ. Khi bạn bắt đầu xử lý với các đối tượng phức hợp, bạn nên sử dụng phương án đa luồng để tăng tốc xử lý. JetS3t cung cấp lớp org.jets3t.service.multithread.S3ServiceSimpleMulti cho mục đích này. Bạn có thể đóng gói đối tượng s3Service có sẵn bằng cách sử dụng lớp này và hưởng lợi ích của các multiprocessors đó. Nó sẽ rất tiện lợi khi bạn làm sạch một thùng bằng cách xóa tất cả các đối tượng mà nó đang chứa.

Ví dụ 4. Xóa một thùng
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);

// delete a bucket – it must be empty first
s3Service.deleteBucket(bucket);


// create a multi threaded version of the RestService
S3ServiceSimpleMulti s3ServiceMulti = new S3ServiceSimpleMulti(s3Service);


// get all the objects from bucket
S3Object[] objects = s3Service.listObjects(bucket);

// clear the bucket by deleting all its objects
s3ServiceMulti.deleteObjects(bucket, objects);

Mỗi thùng được gắn với một ACL xác định quyền hạn đối với thùng đó và mức độ truy cập được cung cấp cho người dùng khác. Bạn có thể lấy ACL và in ra quyền hạn được nó cung cấp.

Ví dụ 5. Lấy ACL cho thùng
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);

// get the ACL and print it
AccessControlList acl = s3Service.getBucketAcl(bucket);
System.out.println(acl);

Quyền hạn mặc định cho thùng mới được khởi tạo và các đối tượng làm cho chúng thuộc về chủ của nó. Bạn có thể điều chỉnh quyền mặc định bằng cách thay đổi ACL cho một thùng và cấp quyền cho một nhóm người dùng để đọc, viết và có toàn quyền điều khiển trên thùng.

Ví dụ 6. Làm cho thùng và nội dung trong nó trở thành công cộng
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);

// get the ACL
AccessControlList acl = s3Service.getBucketAcl(bucket);

// give everyone read access
acl.grantPermission(GroupGrantee.ALL_USERS, Permission.PERMISSION_READ);

// save changes back to S3
bucket.setAcl(acl);
s3Service.putBucketAcl(bucket);

Bạn có thể kích hoạt một cách dễ dàng việc lưu lại nhật ký truy cập cho một thùng và lấy trạng thái việc lưu nhật ký hiện tại. Sau khi việc lưu nhật ký được kích hoạt, các lịch sử truy cập chi tiết cho từng tệp trong thùng đó được trữ trên S3. Tài khoản S3 của bạn sẽ bị tính phí cho không gian lưu trữ mà nhật ký đó sử dụng.

Ví dụ 7. Ghi nhật ký cho các thùng trên S3
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, “my bucket”);

// is logging enabled?
S3BucketLoggingStatus loggingStatus = s3Service.getBucketLoggingStatus(bucketName);
System.out.println(loggingStatus);

// enable logging
S3BucketLoggingStatus newLoggingStatus = new S3BucketLoggingStatus();

// set a prefix for your log files
newLoggingStatus.setLogfilePrefix(logFilePrefix);

// set the target bucket name
newLoggingStatus.setTargetBucketName(bucketName);

// give the log_delivery group permissions to read and write from the bucket
AccessControlList acl = s3Service.getBucketAcl(bucket);
acl.grantPermission(GroupGrantee.LOG_DELIVERY, Permission.PERMISSION_WRITE);
acl.grantPermission(GroupGrantee.LOG_DELIVERY, Permission.PERMISSION_READ_ACP);
bucket.setAcl(acl);

// save the changed ACL for the bucket to S3
s3Service.putBucketAcl(bucket);

// save the changes to the bucket logging
s3Service.setBucketLoggingStatus(bucketName, newLoggingStatus, true);
System.out.println("The bucket logging status is now enabled.");

Quản lý các đối tượng của bạn

Mỗi đối tượng chứa trong một thùng được biểu diễn bởi một org.jets3t.service.model.S3Object. Mỗi đối tượng S3Bucket cung cấp một phương thức toString() mà có thể được dùng để in các chi tiết quan trọng cho một đối tượng:

  • Tên của khóa
  • Tên của thùng chứa
  • Ngày chỉnh sửa cuối cùng
  • Bất cứ thông tin nào được gắn với đối tượng

Nó cũng cung cấp các phương thức để truy cập hàng loạt thuộc tính của một đối tượng, cùng với dữ liệu thông tin của nó.

Ví dụ 8. Liệt kê các đối tượng
// list objects in a bucket.
S3Object[] objects = s3Service.listObjects(bucket);

// print out the object details
if (objects.length == 0) {
   System.out.println("No objects found");
} else {
   for (S3Object o : objects) {
      System.out.println(o);
   }
}

Bạn có thể lọc danh sách đối tượng nhận được bằng cách cung cấp một tiền tố để lọc.

Ví dụ 9. Lọc danh sách các đối tượng
// list objects matching a prefix.
S3Object[] filteredObjects = s3Service.listObjects(bucket, “myprefix”, null);

// print out the object details
if (filteredObjects.length == 0) {
   System.out.println("No objects found");
} else {
   for (S3Object o : filteredObjects) {
      System.out.println(o);
   }
}

Mỗi đối tượng có thể có dữ liệu thông tin gắn với nó, như là kiểu nội dung, ngày chỉnh sửa, ... Bạn cũng có thể gắn dữ liệu thông tin cụ thể liên quan đến ứng dụng của bạn vào một đối tượng.

Ví dụ 10. Lấy dữ liệu thông tiên của đối tượng
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);

// getobjects matching a prefix
S3Object[] filteredObjects = s3Service.listObjects(bucket, “myprefix”, null);

if (filteredObjects.length == 0) {
   System.out.println("No matching objects found");
}else {
   
   // get the metadata for multiple objects.
   S3Object[] objectsWithHeadDetails = s3ServiceMulti.getObjectsHeads(bucket, 
      filteredObjects);

   // print out the metadata
   for (S3Object o : objectsWithHeadDetails) {
      System.out.println(o);
   }
}

Mỗi đối tượng mới được khởi tạo là riêng tư theo mặc định. Bạn có thể sử dụng JetS3t để tạo một địa chỉ URL được ký mà bất cứ ai cũng có thể sử dụng để tải dữ liệu của đối tượng về. Địa chỉ URL có thể được tạo để có hiệu lực chỉ trong một khoảng thời gian nhất định, nó sẽ hết hiệu lực khi quá hạn thời gian. Đối tượng vẫn là riêng tư, nhưng bạn có thể đưa URL cho bất cứ ai để họ tải nó về trong một khoảng thời gian ngắn.

Ví dụ 11. Tạo một địa chỉ URL được ký để tải đối tượng về
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);

// how long should this URL be valid?
int duration = Integer.parseInt(tokens.nextToken());
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, duration);
Date expiryDate = cal.getTime();

// create the signed url
String url = S3Service.createSignedGetUrl(bucketName, objectKey,
        awsCredentials, expiryDate);
System.out.println("You can use this public URL to access this file for the next " 
   + duration + " min - " + url);

S3 cho phép một đối tượng có dung lượng tối đa là 5 GB. Nếu các đối tượng của bạn có dung lượng lớn hơn thế, bạn sẽ cần chia chúng thành nhiều tệp, mỗi tệp có kích thước 5 GB, sau đó tải tất cả các phần lên S3.

Ví dụ 12. Tải đối tượng lên S3
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);

// create an object with the file data
File fileData = new File(“/my_file_to_upload”);
S3Object fileObject = new S3Object(bucket, fileData);

// put the data on S3
s3Service.putObject(bucket, fileObject);
System.out.println("Successfully uploaded object - " + fileObject);

JetS3t cung cấp một lớp DownloadPackage để dễ dàng gắn kết dữ liệu từ một đối tượng S3 với một tệp cục bộ và tự động ghi dữ liệu vào nó. Bạn có thể sử dụng tính năng này để tải các đối tượng từ S3 về một cách dễ dàng.

Ví dụ 13. Tải về từ S3
// get the bucket
S3Bucket bucket = getBucketFromName(s3Service, bucketName);

// get the object
S3Object fileObject = s3Service.getObject(bucket, fileName);

// associate a file with the object data
DownloadPackage[] downloadPackages = new DownloadPackage[1];
downloadPackages[0] = new DownloadPackage(fileObject,
                            new File(fileObject.getKey()));

// download objects to the associated files
s3ServiceMulti.downloadObjects(bucket, downloadPackages);
System.out.println("Successfully retrieved object to current directory");

Phần này đã xem xét một số hàm cơ bản cung cấp bởi bộ công cụ JetS3t, và cách sử dụng chúng để tương tác với S3. Xem Tài nguyên để biết thêm về dịch vụ S3 và một bài thảo luận chi tiết về bộ công cụ JetS3t.

Shell của S3

Các tương tác với S3, thông qua các đoạn mã nhỏ, có thể được đặt cùng với nhau để sử dụng sau này bằng cách tạo một chương trình Shell của S3 mà bạn có thể thực thi trên cửa sổ dòng lệnh. Bạn sẽ tạo một chương trình Java đơn giản mà chấp nhận khóa truy cập Amazon Web Services và khóa bí mật như các tham số, và trả lại một dấu nhắc dòng lệnh. Sau đó, bạn có thể gõ một ký tự hoặc vài kí tự, như là b để liệt kê các thùng hoặc om để liệt kê các đối tượng mà thỏa mãn một tiền tố cụ thể. Sử dụng chương trình này để thực nghiệm.

Chương trình shell chứa một hàm main() bao gồm các đoạn mã nhỏ mà bạn đang dùng trong bài viết này. Đoạn mã ví dụ cho chương trình shell S3 không được gộp ở đây. Mã nguồn đầy đủ của Shell S3, cùng với các phụ thuộc của nó, có trong phần Tải về. Bạn có thể thực thi shell bằng cách chạy tệp devworks-s3.jar.

Ví dụ 14. Thực thi Shell S3
java -jar devworks-s3.jar my_aws_access_key my_aws_secret_key

Bạn có thể gõ h tại bất cứ thời điểm nào trong Shell S3 để lấy danh sách các lệnh được hỗ trợ.

Hình 2. Hướng dẫn trong Shell S3
Hướng dẫn trong Shell S3

Một số phương thức hữu dụng hơn đã được thêm vào Shell S3. Bạn có thể mở rộng nó để thêm bất cứ chức năng nào bạn muốn để làm cho shell trở lên hữu dụng hơn nữa.


Tổng kết

Trong bài viết này, bạn đã tìm hiểu một số khái niệm cơ bản ẩn sau dịch vụ S3 của Amazon. Bộ công cụ JetS3t là một thư viện mã mở mà bạn có thể sử dụng để tương tác với S3. Bạn cũng đã học cách để tạo một Shell S3 đơn giản bằng cách sử dụng các đoạn mã nhỏ, cho nên bạn có thể tiếp tục thực nghiệm một cách dễ dàng với S3 bằng cách sử dụng cửa sổ dòng lệnh.

Phẩn 3 của loạt bài "Điện toán đám mây với Amazon Web Services" giải thích cách sử dụng đám mây điện toán Amazon Elastic Compute Cloud (EC2) để thực thi các máy chủ ảo trong đám mây.


Tải về

Mô tảTênKích thước
Mã ví dụdevworks-s3.zip2.93MB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=SOA và dịch vụ Web, Nguồn mở
ArticleID=390962
ArticleTitle=Điện toán đám mây với Amazon Web Services, Phần 2: Lưu trữ trong đám mây với Amazon Simple Storage Service (S3)
publish-date=05202009