Trong phần trước, NhanWeb tui đã kể cho bạn nghe về trải nghiệm của mình với EC2 Instance.Trải nghiệm tiếp theo của tôi là với dịch vụ S3(Simple Storage Service) – một dịch vụ cho phép bạn lưu trữ những file tĩnh trên hệ thống của Amazon và truy suất chúng trên website của mình. Đây là một dịch vụ mà tui cho rằng rất có tiềm năng sử dụng ở Việt Nam.
Phụ mục
Tôi đi tìm hiểu Amazon S3
Amazon S3 (Simple Storage Service) là một trong những sản phẩm được tôi mong đợi có thể giải quyết được vấn đề lưu trữ những tệp tin tĩnh để phân phối đến người dùng và giảm áp lực request cho server hiện thời nhất. Đặt mục tiêu vào việc này nên tôi đã dành khá nhiều thời gian để tìm hiểu bảng giá, SDK của S3 dành cho PHP và IAM(AWS Identity and Access Management) nhiều nhất.
Theo đó, S3 tính tiền người dùng chủ yếu dựa vào băng thông mà người dùng sử dụng trong quá trình truy xuất file tĩnh. Giá của S3 cũng thay đổi tùy thuộc vào vùng địa lý khác nhau. Nhìn thấy Free Tier trong một năm của nó với 5Gb lưu trữ, 20.000 GET Request và 2.000 PUT Request mỗi tháng trong năm đầu tiên tôi cảm thấy khấp khởi trong lòng bởi nó phù hợp với nhu cầu của mình. Tôi quyết định nghiên cứu và tìm cách tích hợp S3 vào website của mình để hỗ trợ bộ phận biên tập tương tác trực tiếp với S3 thông qua Dashboard đã được tôi xây dựng thay vì sử dụng công cụ S3 Browser.
Nếu tích hợp thành công, tất cả hoạt động của đội ngũ Editor hầu như không thay đổi gì nên sẽ không tốn nhiều thời gian training cũng như không cẩn bổ sung thêm công cụ, không cần cấp thêm tài khoản upload….
Tóm lại là rất tiện.
Tích hợp S3 vào website
Để tích hợp Amazon S3 vào website, tôi đã download bộ PHP SDK của Amazon và upload vào bộ source code của website. Bạn có thể tìm thấy bộ SDK này ở đây. Việc tiến hành kết nối phải được thực hiện thông qua Access Key ID và Serect Access Key được tạo ra bằng cách truy cập vào đây. Để có được thứ này, ngoài việc đăng ký sử dụng dịch vụ, bạn cần phải tạo user,gắn user vào group và phân quyền truy cập cho Group, cho user trong IAM. Việc tạo Policy cho user hay group tương đối rắc rối và cũng ngốn của tôi hết 2 ngày để tìm hiểu.
Cuối cùng thì tôi cũng biết… sơ sơ về cách phân quyền. Đây là phân quyền để User có thể truy cập và có toàn quyền với một bucket của tôi:
[code] {"Version": "2014-7-22",
"Statement": [
{
"Sid": "Stmt1407817809000",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::nhanweb_bucket_name/*"
] }
] } [/code]
Để tìm hiểu về phân quyền trong bucket, bạn có thể đọc một vài viết hướng dẫn rất chi tiết tại đây.
Còn đây là đoạn mã kết nối với Amazon thông qua SDK mà bạn có thể tìm thấy trong Document của Amazon.
[code language=”php”] // Include the SDK using the Composer autoloaderrequire ‘vendor/autoload.php’;
use Aws\S3\S3Client;
// Instantiate the S3 client using your credential profile
$s3Client = S3Client::factory(array(
‘profile’ => ‘my_profile’,
));
[/code]
Để thuận tiện, tôi có viết một class giúp xử lý hầu hết các thao tác trên S3. Sẵn tiện, tôi đăng lên đây cho bạn nào có ý định làm việc với S3 để các bạn có thể xử dụng luôn cho tiện:
[code language=”php”] <?phpuse Aws\S3\S3Client;
class Amazons3{
/*Author: Nguyen Duy Nhan
Website: www.nhanweb.com*/
var $bucket = "nhanweb_bucket";
function connect(){
require aws/aws-autoloader.php’;
return S3Client::factory(array(
‘key’ => ‘Access Key ID’,
‘secret’ => ‘Serect Access Key’,
));
}
public function create_bucket($path){
$client = $this->connect();
$client->createBucket(array(‘Bucket’ => $this->bucket.$path, ‘LocationConstraint’ => ‘us-west-2’));
return $client->waitUntil(‘BucketExists’, array(‘Bucket’ => $this->bucket));
}
public function upload_object($filename, $pathToFile, $mime){
$client = $this->connect();
$client->putObject(array(
‘Bucket’ => (string)$this->bucket,
‘Key’ => $filename,
‘ContentType’ => $mime,
‘Body’ => fopen($pathToFile, ‘r+’),
‘ACL’ => ‘public-read’,
‘Metadata’ => array(
‘Expires’ => ‘2 years’,
)
));
return $client->waitUntilObjectExists(array(
‘Bucket’ => $this->bucket,
‘Key’ => $filename
));
}
public function delete_object($pathToFile){
echo $pathToFile;
$client = $this->connect();
$result = $client->deleteObjects(array(
‘Bucket’ => $this->bucket,
‘Objects’ => array(
array(
‘Key’ => $pathToFile,
),
)
));
}
public function list_object(){
$objects = $this->client->getIterator(‘ListObjects’, array(‘Bucket’ => $this->bucket));
//var_dump($objects);
foreach ($objects as $object) {
echo $object[‘Key’] . "\n";
}
// Use the plain API (returns ONLY up to 1000 of your objects).
$result = $this->client->listObjects(array(‘Bucket’ => $this->bucket));
echo "Keys retrieved!\n";
foreach ($result[‘Contents’] as $object) {
echo $object[‘Key’] . "\n";
}
}
}
[/code]Tùy theo nhu cầu của mình mà bạn code thêm để xử dụng nhé.
Sử dụng subdomain cho Amazon S3
Tôi mất khá nhiều thời gian để đọc tài liệu của Amazon trong đó có phần sử dụng domain riêng của mình cho các hình ảnh upload lên Amazon S3. Để sử dụng domain riêng bạn phải sử dụng thông qua Amazon Route 53. Nhưng để sử dụng subdomain cho S3 bạn chỉ việc thực hiện một số bước sau đây:
- Tạo một bucket từ root với tên là subdomain. Ví dụ: sub.domain.com
- Tạo một bucket mới với tên là bổ sung thêm www. Ví dụ www.sub.domain.com
- Tạo bucket www.sub.domain.com bạn chọn Properties, chọn tiếp Static Website Hosting và chọn Redirect all requests to another host name sau đó gõ sub.domain.com vào ô bên dưới.
- Tạo một domain record như sau:
- Name: sub
- Type: CNAME
- Value: s3.amazonaws.com
- Đợi record CNAME mới tạo cập nhật và sử dụng.
Và chi phí…
Sau hơn 10 ngày chạy thử nghiệm hệ thống với dung lượng ảnh tầm 2Gb với banwidth trung bình khá lớn (hơn 200Gb/ngày) tôi nhận ra rằng tôi đang bị rút máu một cách khủng khiếp. Bạn hãy xem cập nhật về chi phí thanh toán gần đây của tôi:
Chi phí Amazon S3Và đây là thống kê số tiền tôi đã bỏ ra cho S3 hàng ngày:
Biểu đồ chi phí Amazon S3Tôi nhẩm tính sơ sơ, mỗi tháng tôi sẽ tốn khoảng 250$ cho số lượng ảnh và băng thông cần thiết trong điều kiện website của tôi chỉ đứng yên ở mức đó thôi chứ không hề tăng trưởng truy cập. Một con số khiến tôi .. sợ.
Ròm says
Thế này thì chạy mất dép luôn, trước mình cũng có tìm hiểu về thằng này, đọc mấy bài trên mạng với bài của bác nữa @@. Xoắn hẳn luôn rồi >:D<
Nguyen says
Trước cũng đọc một bài viết hướng dẫn sử dụng dịch vụ này, cũng phải mất chi phí ban đầu 1$ phí đăng ký, sử dụng thấy loằng ngoằng quá, nản. Bỏ luôn, đọc xong bài này thì thấy sợ rồi!
Nguyễn Duy Nhân says
Mình khuyên là nên dùng thử, thực ra dịch vụ của nó khá hay (dù đúng là hơi loằng ngoằng).
Thach says
Chi phí cloud storage tại Amazon vẫn còn rẻ chán so với các đối thủ khác như Rackspace hay Heroku :D Nếu anh sử dụng ảnh thì đừng nên quăng lên S3 vì bandwith khá cao, em thì chỉ dùng nó cho việc backup, chỉ mất phí storage chứ không mất phí băng thông. =))
Nguyễn Duy Nhân says
@Thạch Phạm:
Anh cần sử dụng S3 vì mục đích tăng tốc độ đường truyền chứ ở VN chậm như rùa bò. Anh cũng đang tìm giải pháp khác chứ chưa gì hết tháng này đã đi hết 200$ rồi.
Tâm Phan says
Cho mình hỏi bill 250$ là 1 ngày bạn upload 2gb hình + 200gb bandwith mới ra giá đó hả ?
Tên vi phạm says
F*ckin’ amazing things here. I’m very happy to peer youhr post.
Thank you a lot and i am looking ahead to contact you. Will you kindly drop me
a mail?
Nguyễn Duy Nhân says
For what ?
Anyway, my email: contact[at]nhanweb.com
Thân says
Giảm tải file ảnh thì jetpack của wordpress có cái phần sử dụng server của WordPress để hiện ảnh trong bài viết mà.
Gặp người dùng theme eleven40 thấy vui vui :))
Nguyễn Duy Nhân says
Mình thích đơn giản, tập trung nội dung bài viết để rảnh tay viết bài bác ơi :D