2012-01-19 20 views
5

Recientemente leí acerca de la nueva oferta DB de Amazon, DynamoDB, y debo admitir que suena muy convincente. Sin embargo, antes de salir corriendo y comenzar a reprogramar mi capa de Modelo para aprovechar el nuevo chico en el bloque, necesito más detalles. ¿Alguien sabe de un paquete de Perl que abstrae DynamoDB o es demasiado pronto? Yo lo llamaría un paquete 'ORM', pero no hay relaciones en el mundo de DynamoDB. ¿Hay uno en alfa, beta? ¿Cómo puedo acceder a dynamodb de Amazon vía Perl?DynamoDB Perl Abstracción

Gracias

+0

supongo que es demasiado pronto * *. – Axeman

Respuesta

0

Aquí es un ejemplo de cómo hacerlo 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

Es curioso, la primera parte de este ejemplo proviene de mi código que agregué a un hilo en los foros de AWS. https://forums.aws.amazon.com/message?jspa?messageID=314685#314685. :-) Pero gracias de cualquier manera. Ya estoy trabajando en esto y tengo algunos paquetes en desarrollo que ya están basados ​​en el código que acaba de publicar. – MadHacker

+0

Debería agradecerte entonces. Obtuve el código de tu publicación y descubrí el resto y lo hice funcionar de principio a fin. Publiqué la respuesta, pensando que podría ser útil para alguien que busca una solución. – dineshr

+0

Cosas interesantes. ¡Ansioso por usar un paquete que oculte estos detalles! Parece que Amazon al menos está tratando de tener algo de seguridad al respecto, sin descartar la seguridad. – jjohn