2012-01-19 7 views
5

Recentemente ho letto della nuova offerta DB di Amazon, DynamoDB, e devo ammettere che suona molto convincente. Tuttavia, prima di scappare e iniziare a riprogrammare il mio livello di modello per sfruttare il nuovo capretto sul blocco, ho bisogno di altre specifiche. Qualcuno sa di un pacchetto Perl che astrae il DynamoDB o è troppo presto? Lo chiamerei un pacchetto 'ORM', ma non ci sono relazioni nel mondo DynamoDB. Ce n'è uno in alpha, beta? Come posso accedere a dynamodb di amazon via Perl?DynamoDB Perl Abstraction

Grazie

+0

Sto indovinando che è troppo presto * *. – Axeman

risposta

0

Ecco un esempio di come Fallo usando 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

Divertente, la prima parte di questo esempio è dal mio codice che ho aggiunto a un thread nei forum di AWS. https://forums.aws.amazon.com/message.jspa?messageID=314685#314685. :-) Ma grazie comunque. Sono già al lavoro su questo e ho alcuni pacchetti in fase di sviluppo già basati sul codice che hai appena postato. – MadHacker

+0

Dovrei ringraziarti allora. Ho ricevuto il codice dal tuo post e ho capito il resto e ha funzionato fino alla fine. Ho postato la risposta, pensando che potrebbe essere utile per qualcuno alla ricerca di una soluzione. – dineshr

+0

Cose interessanti. Non vedo l'ora di utilizzare un pacchetto che nasconde questi dettagli! Sembra che Amazon stia cercando almeno di avere un po 'di sicurezza in questo mentre non getta via la sicurezza. – jjohn