DynamoDB Perl Абстракция - PullRequest
       7

DynamoDB Perl Абстракция

5 голосов
/ 19 января 2012

Я недавно читал о новом предложении Amazon для БД, DynamoDB, и должен признать, что это звучит очень убедительно. Однако, прежде чем я убегу и начну перепрограммировать свой слой модели, чтобы воспользоваться преимуществами нового ребенка в блоке, мне нужно больше подробностей. Кто-нибудь знает о пакете Perl, который абстрагирует DynamoDB, или это слишком рано? Я бы назвал это пакетом ORM, но в мире DynamoDB нет никаких отношений. Есть ли в альфа, бета? Как я могу получить доступ к Dynamodb Amazon через Perl?

Спасибо

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

Вы также можете использовать мой Perl-модуль Net :: Amazon :: DynamoDB (@MadHacker: я взял на себя смелость адаптировать ваш код подписи выше).

0 голосов
/ 31 января 2012

Вот пример того, как это сделать, используя 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 голосов
/ 24 января 2012

Я написал интерфейс для DynamoDB на JavaScript Я также программист Perl Пожалуйста, посмотрите на приведенный пример, он очень похож на Perl

См. Пример и ссылку для скачивания здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...