Classic ASP สร้าง Pre-signed GET Object

เนื่องจากว่าที่ทำงาน มี Classic ASP application มีการดึงรูป นศ. จาก FTP(localhost) มาแสดงหน้า profile ของ นศ.
ความต้องการใหม่คือย้ายรูปจาก local filesystem/FTP(localhost) ไปไว้ใน Object storage

ก็เลยไปค้นในเน็ต ว่ามีใครบ้างที่ทำไว้แล้ว ก็เจอข้อมูลตามนี้

http://stackoverflow.com/questions/14126243/hash-hmac-in-using-pure-classic-asp

https://precompiled.wordpress.com/2007/11/26/hmac-sha1-encryptie-onder-classic-asp/

https://forums.aws.amazon.com/message.jspa?messageID=147377

เลยได้ลอง coding ทดสอบ จึงได้ code ที่ทำงานได้ตามต้องการ ตามนี้

<%@ Language=VBScript %>
<%

Dim awskey, awsscret, requestSign, objKey, bucket, host, proto
Dim expire, sig, result, url1, url2
Dim sha1

awskey = "access key"
awsscret = "secret"

expire = 1457400000 'unix timestamp to expire
bucket = "bucket name"
objKey = "object key"
host = "s3.example.com"
proto = "https"

requestSign = "GET" & vbLf & vbLf & vbLf & expire & vbLf & "/" & bucket & "/" & objKey

set sha1 = GetObject("script:" & Server.MapPath("sha1.wsc"))
sha1.hexcase = 0

result = sha1.b64_hmac_sha1(awsscret, requestSign)
sig = Server.URLEncode(result & "=")
url1 = proto & "://" & host & "/" & bucket & "/" & objKey & "?AWSAccessKeyId=" & awskey & "&Signature=" & sig & "&Expires=" & expire
url2 = proto & "://" & bucket & "." & host & "/" & objKey & "?AWSAccessKeyId=" & awskey & "&Signature=" & sig & "&Expires=" & expire

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title>S3</title>
</head>
<body>
            Request Signature  : <%= requestSign %> <br/>
            HMAC-SHA1 result: <%= result %> <br/>
            Signature result: <%= sig %> <br/>
            URL Path style: <a href="<%= url1 %>" target="_blank"><%= url1 %></a> <br/>
            URL Virtual style: <a href="<%= url2 %>" target="_blank"><%= url2 %></a> <br/>
</body>
</html>


<%
'Free resource
Set sha1 = Nothing
%>

 

sha1.wsc ค้นใน Google ได้มาจาก  http://uwblog.googlecode.com/svn/trunk/includes/sha1.wsc

และสำรองไว้แล้วใน Github เผื่ออนาคตมันหายไป

Ceph Object Gateway & S3 API

ลองเล่น Ceph S3 โดยใช้ AWS PHP SDK v2 http://docs.aws.amazon.com/aws-sdk-php/v2/guide/installation.html

ไม่มีอะไร มาแชร์ข้อสังเกตุที่เจอดังนี้

<?php
require 'vendor/autoload.php';


use Aws\S3\S3Client;

/*
* ต้องทำ wildcard ชี้ *.s3.example.com ไปยัง Ceph RadosGW node
* เพราะว่า bucket student.image จะชี้ไปที่ student.image.s3.example.com
*/
$s3 = S3Client::factory([
        'key' => 'photo.student key',
        'secret' => 'photo.student secret',
        'endpoint' => 'http://s3.example.com'  
        ]);

/* สร้าง bucket student.image */
$s3->createBucket(['Bucket' => 'student.image']);


/* 
* ทดสอบตั้งค่า ACL ให้ Bucket โดยที่การ putBucketAcl() จะเป็นการทับ ACL เดิมทั้งหมด
* ดังนั้น จึงต้องใส่ค่า Owner และ Grant Owner ด้วย
*/
$result = $s3->putBucketAcl([
    'Owner' => [
        'DisplayName' => 'Students Photo Bucket',
        'ID' => 'photo.student',
    ],
    'Grants' => [
        [
            'Grantee' => [
              'Type' => 'CanonicalUser',
              'ID' => 'photo.student',
            ],
            'Permission' => 'FULL_CONTROL',
        ],
        /* grant read uid=photo.student.ro ให้ อ่านรายชื่อ object ใน bucket student.image ได้ */
        [
            'Grantee' => [
              'Type' => 'CanonicalUser',
              'ID' => 'photo.student.ro',
            ],
            'Permission' => 'READ',
        ],
    ],
    'Bucket' => 'student.image',
]);

/* dump ACL bucket student.image */
var_dump($s3->getBucketAcl([
    'Bucket' => 'student.image',
]));



/* ทำการ upload test.jpg พร้อมกำหนด ACL */
$s3->putObject([
  'Bucket' => 'student.image',
  'Key'    => 'test',
  'Body'   => fopen("test.jpg", 'r'),
  'GrantRead' => 'id=photo.student.ro',
  'GrantFullControl' => 'id=photo.student',
]);


/* ทดสอบด้วย Read only account */
$s3ro = S3Client::factory([
 'key' => 'photo.student.ro key',
 'secret' => 'photo.student.ro secret',
 'endpoint' => 'http://s3.example.com' 
]);


/* ทำการสร้าง url สำหรับเรียกดู test.jpg โดย url จะมีอายุ 1 นาที */
$command = $s3ro->getCommand('GetObject', [
 'Bucket' => 'student.image',
 'Key' => 'test',
]);
$signedUrl = $command->createPresignedUrl('+1 minutes');
echo "{$signedUrl}\n";

ทดลอง Ceph & Object storage gateway

พอดีกำลังสนใจด้าน object storage เลยทดสอบติดตั้ง Ceph ลงใน vm
ที่เขียน blog นี้ไว้ เพราะต้องการบันทึกบัญหาต่างๆ
เช่น ตอนที่ลอง รัน ceph-deploy osd โดย reinstall os ใหม่ใน osd node ทำให้ mon nodes คิดว่า osd node ที่ลบแล้วลงไปใหม่ มัน down
สถานะ cluster เลยไม่พร้อมสำหรับการเขียนข้อมูลลงไป
แล้วพอ ceph-deploy rgw ก็เลยไม่ทำงาน

วิธีการติดตั้ง ก็ไปอ่านตาม web เอาได้เลย
http://docs.ceph.com/docs/master/start/quick-start-preflight/#ceph-deploy-setup