2012-01-19 45 views
5

我最近閱讀了亞馬遜的新數據庫產品DynamoDB,並且必須承認它聽起來非常引人注目。然而,在我跑掉並開始重新編程我的模型層以利用塊上的新孩子之前,我需要一些更具體的細節。有誰知道抽象DynamoDB的Perl包還是那麼快?我將其稱爲'ORM'包,但在DynamoDB世界中沒有任何關係。是否有alpha版,beta版?我如何通過Perl訪問亞馬遜的dynamodb?DynamoDB Perl抽象

感謝

+0

我猜這是*太快*。 – Axeman

回答

0

這裏是如何的例子做它用perl

#!/usr/bin/perl 

use strict; 
use warnings; 

use Data::Dumper; 
use Net::Amazon::AWSSign; 
use XML::XPath; 
use XML::XPath::XMLParser; 

use LWP::UserAgent; 

use HTTP::Request::Common; 
use DateTime::Format::HTTP; 
use Digest::SHA qw(sha256 hmac_sha256_base64); 
use URI::Escape; 

my $iam_key_id = 'Your AWS Access Key'; 
my $iam_secret = 'Your Security tocken'; 

my $url = "https://sts.amazonaws.com/?" . 
"Action=GetSessionToken" . 
"&Version=2011-06-15"; 

my $awsSign = new Net::Amazon::AWSSign("$iam_key_id", "$iam_secret"); # New object 
my $awsSignedRESTURI = $awsSign->addRESTSecret($url); # Returns signed REST query URI for lwp-get, curl, etc. 

my $response = `curl -s "$awsSignedRESTURI"`; 
print Dumper($response); 

my $xp = XML::XPath->new(xml => $response); 
$xp->set_namespace('xx','https://sts.amazonaws.com/doc/2011-06-15/'); 
my $sessionToken = $xp->getNodeText('/xx:GetSessionTokenResponse/GetSessionTokenResult/Credentials/SessionToken'); 
my $accessKeyId = $xp->getNodeText('/xx:GetSessionTokenResponse/GetSessionTokenResult/Credentials/AccessKeyId'); 
my $secretAccessKey = $xp->getNodeText('/xx:GetSessionTokenResponse/GetSessionTokenResult/Credentials/SecretAccessKey'); 
print $sessionToken . "\n"; 

# SESSION TOKEN RECEIVED 

put('{"TableName":"Test","Item":{"Id":{"S":"1"},"name":{"S":"somedata"}}}'); 
print "-----------------------------\n"; 
get('{"TableName":"Test","Key":{"HashKeyElement":{"S":"1"}}}'); 

exit; 


sub get 
{ 
    my ($json) = @_; 

    perform('GetItem', $json); 
} 

sub put 
{ 
    my ($json) = @_; 

    perform('PutItem', $json); 
} 

sub perform 
{ 
    my ($target, $json) = @_; 

    my $class = 'DateTime::Format::HTTP'; 
    my $date = $class->format_datetime(DateTime->now); 

    my $tosign = 
    "POST\n" . 
    "/\n" . 
    "\n" . 
    "host:dynamodb.us-east-1.amazonaws.com\n" . 
    "x-amz-date:$date\n" . 
    "x-amz-security-token:" . $sessionToken . "\n" . 
    "x-amz-target:DynamoDB_20111205.$target\n" . 
    "\n" . 
    $json; 

    my $b64 = hmac_sha256_base64(sha256($tosign), $secretAccessKey); 
    while (length($b64) % 4) {$b64 .= '=';} 

    ##Dynamo request 
    my $string = 
    "POST http://dynamodb.us-east-1.amazonaws.com/ HTTP/1.1\n" . 
    "host: dynamodb.us-east-1.amazonaws.com\n" . 
    "x-amz-date: $date\n" . 
    "x-amzn-authorization: AWS3 AWSAccessKeyId=" . $accessKeyId . ",Algorithm=HmacSHA256,SignedHeaders=host;x-amz-date;x-amz-security-token;x-amz-target,Signature=$b64\n" . 
    "x-amz-target: DynamoDB_20111205.$target\n" . 
    "x-amz-security-token: " . $sessionToken . "\n" . 
    "content-type: application/x-amz-json-1.0\n" . 
    "connection: Keep-Alive\n" . 
    "user-agent: perl\n" . 
    "\n" . 
    $json; 

    my $req = HTTP::Request->parse($string); 

    my $ua = LWP::UserAgent->new; 

    print Dumper($ua->request($req)); 
} 
+0

有趣的是,本示例的第一部分來自我添加到AWS論壇上的主題的代碼。 https://forums.aws.amazon.com/message.jspa?messageID=314685#314685。 :-)但無論如何,謝謝。我已經在爲此工作,並且正在開發一些基於剛發佈的代碼的軟件包。 – MadHacker

+0

我應該謝謝你。我從你的帖子中得到了代碼,並找出其餘部分,並使其始終工作。我發佈了答案,認爲這可能對尋找解決方案的人有幫助。 – dineshr

+0

有趣的東西。期待使用隱藏這些細節的軟件包!看起來亞馬遜至少試圖在這方面有一些安全性,同時不會丟掉安全性。 – jjohn