SlideShare a Scribd company logo
1 of 102
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
?
!

More Related Content

What's hot

Mantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case studyMantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case studyDrupalDay
 
EcmaScript 6 & 7
EcmaScript 6 & 7EcmaScript 6 & 7
EcmaScript 6 & 7BENTOSA
 
Progetto di Basi di Dati
Progetto di Basi di DatiProgetto di Basi di Dati
Progetto di Basi di Datisegarva
 
PHP Template Engine (introduzione)
PHP Template Engine (introduzione)PHP Template Engine (introduzione)
PHP Template Engine (introduzione)Asmir Mustafic
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBStefano Dindo
 
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantSaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantTassi Francesco
 
Facebook Developer Garage Venice 2 parte
Facebook Developer Garage Venice 2 parteFacebook Developer Garage Venice 2 parte
Facebook Developer Garage Venice 2 parteAngelo Iacubino
 
Reverse Engineering per dispositivi IoT
Reverse Engineering per dispositivi IoTReverse Engineering per dispositivi IoT
Reverse Engineering per dispositivi IoTAndrea Lazzarotto
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.jseugenio pombi
 
jQuery - 4 | WebMaster & WebDesigner
jQuery - 4 | WebMaster & WebDesignerjQuery - 4 | WebMaster & WebDesigner
jQuery - 4 | WebMaster & WebDesignerMatteo Magni
 
Go reactive with Realm and Xamarin Forms - Andrea Ceroni - Codemotion Rome 2018
Go reactive with Realm and Xamarin Forms - Andrea Ceroni - Codemotion Rome 2018Go reactive with Realm and Xamarin Forms - Andrea Ceroni - Codemotion Rome 2018
Go reactive with Realm and Xamarin Forms - Andrea Ceroni - Codemotion Rome 2018Codemotion
 
Corso IFTS CyberSecurity Expert - Creazione di una CA con OpenSSL
Corso IFTS CyberSecurity Expert - Creazione di una CA con OpenSSLCorso IFTS CyberSecurity Expert - Creazione di una CA con OpenSSL
Corso IFTS CyberSecurity Expert - Creazione di una CA con OpenSSLMassimiliano Masi
 

What's hot (15)

Mantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case studyMantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case study
 
EcmaScript 6 & 7
EcmaScript 6 & 7EcmaScript 6 & 7
EcmaScript 6 & 7
 
Progetto di Basi di Dati
Progetto di Basi di DatiProgetto di Basi di Dati
Progetto di Basi di Dati
 
PHP Template Engine (introduzione)
PHP Template Engine (introduzione)PHP Template Engine (introduzione)
PHP Template Engine (introduzione)
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
 
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantSaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Facebook Developer Garage Venice 2 parte
Facebook Developer Garage Venice 2 parteFacebook Developer Garage Venice 2 parte
Facebook Developer Garage Venice 2 parte
 
Comandi bash
Comandi bashComandi bash
Comandi bash
 
Reverse Engineering per dispositivi IoT
Reverse Engineering per dispositivi IoTReverse Engineering per dispositivi IoT
Reverse Engineering per dispositivi IoT
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.js
 
jQuery - 4 | WebMaster & WebDesigner
jQuery - 4 | WebMaster & WebDesignerjQuery - 4 | WebMaster & WebDesigner
jQuery - 4 | WebMaster & WebDesigner
 
Go reactive with Realm and Xamarin Forms - Andrea Ceroni - Codemotion Rome 2018
Go reactive with Realm and Xamarin Forms - Andrea Ceroni - Codemotion Rome 2018Go reactive with Realm and Xamarin Forms - Andrea Ceroni - Codemotion Rome 2018
Go reactive with Realm and Xamarin Forms - Andrea Ceroni - Codemotion Rome 2018
 
Parlo al mio codice
Parlo al mio codiceParlo al mio codice
Parlo al mio codice
 
Corso IFTS CyberSecurity Expert - Creazione di una CA con OpenSSL
Corso IFTS CyberSecurity Expert - Creazione di una CA con OpenSSLCorso IFTS CyberSecurity Expert - Creazione di una CA con OpenSSL
Corso IFTS CyberSecurity Expert - Creazione di una CA con OpenSSL
 

Viewers also liked

#perl.it wants your bot
#perl.it wants your bot#perl.it wants your bot
#perl.it wants your botFlavio Poletti
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionIn a Rocket
 
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika AldabaLightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldabaux singapore
 

Viewers also liked (6)

#perl.it wants your bot
#perl.it wants your bot#perl.it wants your bot
#perl.it wants your bot
 
Perl Web Client
Perl Web ClientPerl Web Client
Perl Web Client
 
dotCloud and go
dotCloud and godotCloud and go
dotCloud and go
 
Nubilus Perl
Nubilus PerlNubilus Perl
Nubilus Perl
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming Convention
 
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika AldabaLightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
 

Similar to Amazon S3 in Perl

Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Codemotion
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritornolordarthas
 
jQuery - 2 | WebMaster & WebDesigner
jQuery - 2 | WebMaster & WebDesignerjQuery - 2 | WebMaster & WebDesigner
jQuery - 2 | WebMaster & WebDesignerMatteo Magni
 
jQuery - 2 | WebMaster & WebDesigner
jQuery - 2 | WebMaster & WebDesignerjQuery - 2 | WebMaster & WebDesigner
jQuery - 2 | WebMaster & WebDesignerMatteo Magni
 
Building Scala with Bazel - Scala Days
Building Scala with Bazel - Scala DaysBuilding Scala with Bazel - Scala Days
Building Scala with Bazel - Scala DaysNatan Silnitsky
 
Applicazioni distribuite con Symfony2
Applicazioni distribuite con Symfony2Applicazioni distribuite con Symfony2
Applicazioni distribuite con Symfony2Matteo Galli
 
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...Tsuneo Kurihara
 
Cinema On Streaming
Cinema On StreamingCinema On Streaming
Cinema On Streamingtave10
 
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...Codemotion
 
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaRobert Casanova
 

Similar to Amazon S3 in Perl (14)

Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
 
SaaS con Symfony2
SaaS con Symfony2SaaS con Symfony2
SaaS con Symfony2
 
jQuery - 2 | WebMaster & WebDesigner
jQuery - 2 | WebMaster & WebDesignerjQuery - 2 | WebMaster & WebDesigner
jQuery - 2 | WebMaster & WebDesigner
 
jQuery - 2 | WebMaster & WebDesigner
jQuery - 2 | WebMaster & WebDesignerjQuery - 2 | WebMaster & WebDesigner
jQuery - 2 | WebMaster & WebDesigner
 
Building Scala with Bazel - Scala Days
Building Scala with Bazel - Scala DaysBuilding Scala with Bazel - Scala Days
Building Scala with Bazel - Scala Days
 
Corso di php01
Corso di php01Corso di php01
Corso di php01
 
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
 
Applicazioni distribuite con Symfony2
Applicazioni distribuite con Symfony2Applicazioni distribuite con Symfony2
Applicazioni distribuite con Symfony2
 
Codemotion workshop
Codemotion workshopCodemotion workshop
Codemotion workshop
 
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
 
Cinema On Streaming
Cinema On StreamingCinema On Streaming
Cinema On Streaming
 
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
 
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguida
 

Amazon S3 in Perl