Amazon S3
 Perl Web Client
?
http://aws.amazon.com/s3/
Repository   Repository   Repository




         Amazon S3



             Client
Repository   Repository   Repository




?            Amazon S3



                 Client
$
Repository   Repository   Repository




         Amazon S3



             Client
Repository   Repository   Repository




         Amazon S3

                   HTTP

             Client
Repository   Repository   Repository




         Amazon S3

                   HTTP

             Client
Repository   Repository   Repository




         Amazon S3

                   HTTP

             Client
Oggetto/File
Chiave => Valore
1 byte - 5 Gbyte
1 byte - 5 Gbyte
1 byte - 5 Gbyte
1 byte - 5 Gbyte

Non in scala!
Quanti ne volete
Bucket
Fino a 100
Nome Univoco
Net::Amazon::S3
->new()
use Net::Amazon::S3;
my $s3 = Net::Amazon::S3->new({
   aws_access_key_id => 'chiave-aws',
   aws_secret_access_key => 'shhhh!',
   retry => 1,
});
->new()
use Net::Amazon::S3;
my $s3 = Net::Amazon::S3->new({
      aws_access_key_id => 'chiave-aws',
      aws_secret_access_key => 'shhhh!',
   retry => 1,
});
->new()
use Net::Amazon::S3;
my $s3 = Net::Amazon::S3->new({
      aws_access_key_id => 'chiave-aws',
      aws_secret_access_key => 'shhhh!',
   retry => 1,
});

http://aws.amazon.com/s3/
retry
retry
secure
retry
secure
timeout
->buckets()
my $buckets = $s3->buckets();
my $owner =
   $buckets->{owner_displayname};
my $owner_id =
   $buckets->{owner_id};
say "Bucket di $proprietario ",
"($owner_id):";
->buckets()
my $aref = $buckets->{buckets};
for my $bucket (@$aref) {
    my $nome = $bucket->bucket();
    my $data = $bucket->creation_date();
    say "t$nome, creato il $data";
}
->add_bucket()

my $bucket = $s3->add_bucket({
      bucket => ’foto-pippo’,
      acl_short => ’public-read’,
      # location_constraint => ’EU’,
});
->add_bucket()

my $bucket = $s3->add_bucket({
      bucket => ’foto-pippo’,
      acl_short => ’public-read’,
      # location_constraint => ’EU’,
});
->add_bucket()

my $bucket = $s3->add_bucket({
      bucket => ’foto-pippo’,
      acl_short => ’public-read’,
      # location_constraint => ’EU’,
});
->add_bucket()

my $bucket = $s3->add_bucket({
      bucket => ’foto-pippo’,
      acl_short => ’public-read’,
      # location_constraint => ’EU’,
});
Dice il Saggio:
“No Lettere Maiuscole!”
acl_short?
public-read
private

public-read
private
authenticated-read
    public-read
private
authenticated-read
    public-read
 public-read-write
Eliminazione
Eliminazione

$s3->delete_bucket(
   {bucket => ’buttami-via’});
Eliminazione

$s3->delete_bucket(
   {bucket => ’buttami-via’});
$s3->delete_bucket($bucket);
Eliminazione

$s3->delete_bucket(
   {bucket => ’buttami-via’});
$s3->delete_bucket($bucket);
$bucket->delete_bucket();
Ricordate: 100 bucket!
Chiavi
list_bucket()

my $risultato = $s3->list_bucket({
      bucket => ’photo’,
});
Limiti
list_bucket()
my $risultato = $s3->list_bucket({
      bucket => ’photo’,
      max_keys => 100,
      prefix => ’immagini/’,
      delimiter => ’/’,
});
list_bucket()
my $risultato = $s3->list_bucket({
      bucket => ’photo’,
      max_keys => 100,
      prefix => ’immagini/’,
      delimiter => ’/’,
});
list_bucket()
my $risultato = $s3->list_bucket({
      bucket => ’photo’,
      max_keys => 100,
      prefix => ’immagini/’,
      delimiter => ’/’,
});
prefix
immagini/vacanze/IMG_0001.JPG
immagini/vacanze/IMG_0002.JGP
immagini/vacanze/IMG_0003.JGP
immagini/tizio.jpg
immagini/caio.png
lavoro/boh.pdf
list_bucket()
my $risultato = $s3->list_bucket({
      bucket => ’photo’,
      max_keys => 100,
      prefix => ’immagini/’,
      delimiter => ’/’,
});
prefix +
     delimiter
immagini/vacanze/IMG_0001.JPG
immagini/vacanze/IMG_0002.JGP
immagini/vacanze/IMG_0003.JGP
immagini/tizio.jpg
immagini/caio.png
lavoro/boh.pdf
risultato

immagini/vacanze
immagini/tizio.jpg
immagini/caio.png
risultato
                      prefisso
                     “comune”!
immagini/vacanze
immagini/tizio.jpg
immagini/caio.png
marker
lista di una “directory”

my %ricerca = (
     bucket   => ’photo’,
     prefix   => ’immagini/’,
     delimiter => ’/’,
);
lista di una “directory”
while (1) {
    my $risultato = $s3->list_bucket(%ricerca)
       or die ’errore’;
    say "dir : $_" for @{ $risultato->{common_prefixes} };
    say "file: $_->{key}" for @{ $risultato->{keys} };
    last unless $risultato->{is_truncated};
    $impostazioni_ricerca{marker} =
       $risultato->{next_marker};
}
lista di una “directory”
while (1) {
    my $risultato = $s3->list_bucket(%ricerca)
       or die ’errore’;
    say "dir : $_" for @{ $risultato->{common_prefixes} };
    say "file: $_->{key}" for @{ $risultato->{keys} };
    last unless $risultato->{is_truncated};
    $impostazioni_ricerca{marker} =
       $risultato->{next_marker};
}
lista di una “directory”
while (1) {
    my $risultato = $s3->list_bucket(%ricerca)
      or die ’errore’;
    say "dir : $_" for @{ $risultato->{common_prefixes} };
    say "file: $_->{key}" for @{ $risultato->{keys} };
    last unless $risultato->{is_truncated};
    $impostazioni_ricerca{marker} =
      $risultato->{next_marker};
}
lista di una “directory”
while (1) {
    my $risultato = $s3->list_bucket(%ricerca)
       or die ’errore’;
    say "dir : $_" for @{ $risultato->{common_prefixes} };
    say "file: $_->{key}" for @{ $risultato->{keys} };
    last unless $risultato->{is_truncated};
    $impostazioni_ricerca{marker} =
       $risultato->{next_marker};
}
lista di una “directory”
while (1) {
    my $risultato = $s3->list_bucket(%ricerca)
       or die ’errore’;
    say "dir : $_" for @{ $risultato->{common_prefixes} };
    say "file: $_->{key}" for @{ $risultato->{keys} };
    last unless $risultato->{is_truncated};
    $impostazioni_ricerca{marker} =
       $risultato->{next_marker};
}
lista di una “directory”
while (1) {
    my $risultato = $s3->list_bucket(%ricerca)
       or die ’errore’;
    say "dir : $_" for @{ $risultato->{common_prefixes} };
    say "file: $_->{key}" for @{ $risultato->{keys} };
    last unless $risultato->{is_truncated};
    $impostazioni_ricerca{marker} =
       $risultato->{next_marker};
}
Perl, baby
lista di una “directory”
my $risultato = $s3->list_bucket_all({
   bucket   => ’photo’,
   prefix   => ’immagini/’,
   delimiter => ’/’,
});
say "dir : $_"
   for @{ $risultato->{common_prefixes} };
say "file: $_->{key}"
   for @{ $risultato->{keys} };
Oggetti, finalmente!
Aggiunta

my $bucket =
   $s3->bucket(’bucket-lavoro’);
$bucket->add_key(’un/file/allegro‘
   => "Ciao a tutti!n");
Aggiunta
$bucket->add_key(chiave => ‘valore!’,
   {
         content_type => ’text/plain’,
         acl_short => ’public-read’,
         ’x-amz-meta-info’ => ’baz!!!’,
     }
);
Aggiunta

$bucket->add_key_filename(
    ‘mio/file.txt’,
    ‘/path/to/file.txt’,
)
Download

my $bucket =
   $s3->bucket(’il-mio-bucket’);
my $dati =
   $bucket->get_key(’un/file/allegro’);
Download

my $bucket =
   $s3->bucket(’il-mio-bucket’);
my $dati =
   $bucket->get_key(’un/file/allegro’);
Download
$dati = {
     content_type => ‘text/plain’,
     etag => ‘44b6...f367’,
     content => “Ciao a tutti!n”,
     # ...
};
Download

my $bucket =
   $s3->bucket(’il-mio-bucket’);
my $dati =
   $bucket->get_key_filename(
      ’un/file/allegro’, undef,
      ‘/salvalo/qui’);
Download
per eccellenza
public_read
public_read_write
http://
bucket.s3.amazonaws.com/
          chiave
http://
polettix.s3.amazonaws.com/
       tmp/pwc.tar.gz
Net::Amazon::S3::ACL
Attori
Attori

• proprietario
Attori

• proprietario
• altro utente Amazon S3
Attori

• proprietario
• altro utente Amazon S3
• tutti gli utenti Amazon S3
Attori

• proprietario
• altro utente Amazon S3
• tutti gli utenti Amazon S3
• tutti
Diritti
Diritti

• lettura
Diritti

• lettura
• scrittura
Diritti

• lettura
• scrittura
• lettura ACP
Diritti

• lettura
• scrittura
• lettura ACP
• scrittura ACP
Diritti

• lettura
• scrittura
• lettura ACP
• scrittura ACP
• controllo completo
N::A::S::ACL
use Net::Amazon::S3::ACL;
my $acl =
   Net::Amazon::S3::ACL->new();
my $acl_xml =
   $bucket->get_acl(’etc/passwd’);
$acl->parse($acl_xml);
say $acl->stringify(); # XML
say $acl->dump();        # YAML, se presente
->add()

$acl->add(
     ’foo@example.com’ => ’WRITE’,
     ALL              => ’READ’,
     ’dfadffadf...‘   => ’*’,
);
set_acl()

$bucket->set_acl({
      key    => $chiave,
      acl_xml => $acl->stringify(),
});
Upload da esterni
Net::Amazon::S3::Policy
F M
Net::Amazon::S3::Policy
       T
    R
F M
Net::Amazon::S3::Policy
       T
    R
         Friendly
?
!

Amazon S3 in Perl