NHANWEB

Chuyện tui học đòi sử dụng Amazon Web Services(AWS) P2

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.

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 IDSerect 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 autoloader
require ‘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”] <?php
use 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:

  1. Tạo một bucket từ root với tên là subdomain. Ví dụ: sub.domain.com
  2. Tạo một bucket mới với tên là bổ sung thêm www. Ví dụ www.sub.domain.com
  3. 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.
  4. Tạo một domain record như sau:
    • Name: sub
    • Type: CNAME
    • Value: s3.amazonaws.com
  5. Đợi record CNAME mới tạo cập nhật và sử dụng.
Cấu hình Amazon S3 để chuyển hướng sang một bucket khác

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 S3

Và đây là thống kê số tiền tôi đã bỏ ra cho S3 hàng ngày:

Biểu đồ chi phí Amazon S3

Tô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ợ.

Exit mobile version