# NAME

AWS::S3 - Lightweight interface to Amazon S3 (Simple Storage Service)

<div>

   <a href='https://travis-ci.org/leejo/AWS-S3?branch=master'><img src='https://travis-ci.org/leejo/AWS-S3.svg?branch=master' /></a>
   <a href='https://coveralls.io/r/leejo/AWS-S3?branch=master'><img src='https://coveralls.io/repos/leejo/AWS-S3/badge.png?branch=master' alt='Coverage Status' /></a>
</div>

# SYNOPSIS

   use AWS::S3;

   my $s3 = AWS::S3->new(
     access_key_id     => 'E654SAKIASDD64ERAF0O',
     secret_access_key => 'LgTZ25nCD+9LiCV6ujofudY1D6e2vfK0R4GLsI4H',
   );

   # Add a bucket:
   my $bucket = $s3->add_bucket(
     name    => 'foo-bucket',
   );

   # Set the acl:
   $bucket->acl( 'private' );

   # Add a file:
   my $new_file = $bucket->add_file(
     key       => 'foo/bar.txt',
     contents  => \'This is the contents of the file',
   );

   # You can also set the contents with a coderef:
   # Coderef should eturn a reference, not the actual string of content:
   $new_file = $bucket->add_file(
     key       => 'foo/bar.txt',
     contents  => sub { return \"This is the contents" }
   );

   # Get the file:
   my $same_file = $bucket->file( 'foo/bar.txt' );

   # Get the contents:
   my $scalar_ref = $same_file->contents;
   print $$scalar_ref;

   # Update the contents with a scalar ref:
   $same_file->contents( \"New file contents" );

   # Update the contents with a code ref:
   $same_file->contents( sub { return \"New file contents" } );

   # Delete the file:
   $same_file->delete();

   # Iterate through lots of files:
   my $iterator = $bucket->files(
     page_size   => 100,
     page_number => 1,
   );
   while( my @files = $iterator->next_page )
   {
     warn "Page number: ", $iterator->page_number, "\n";
     foreach my $file ( @files )
     {
       warn "\tFilename (key): ", $file->key, "\n";
       warn "\tSize: ", $file->size, "\n";
       warn "\tETag: ", $file->etag, "\n";
       warn "\tContents: ", ${ $file->contents }, "\n";
     }# end foreach()
   }# end while()

   # You can't delete a bucket until it's empty.
   # Empty a bucket like this:
   while( my @files = $iterator->next_page )
   {
     map { $_->delete } @files;

     # Return to page 1:
     $iterator->page_number( 1 );
   }# end while()

   # Now you can delete the bucket:
   $bucket->delete();

# DESCRIPTION

AWS::S3 attempts to provide an alternate interface to the Amazon S3 Simple Storage Service.

**NOTE:** Until AWS::S3 gets to version 1.000 it will not implement the full S3 interface.

**Disclaimer:** Several portions of AWS::S3 have been adopted from [Net::Amazon::S3](https://metacpan.org/pod/Net::Amazon::S3).

**NOTE:** AWS::S3 is NOT a drop-in replacement for [Net::Amazon::S3](https://metacpan.org/pod/Net::Amazon::S3).

**TODO:** CloudFront integration.

# CONSTRUCTOR

Call `new()` with the following parameters.

## access\_key\_id

Required.  String.

Provided by Amazon, this is your access key id.

## secret\_access\_key

Required.  String.

Provided by Amazon, this is your secret access key.

## secure

Optional.  Boolean.

Default is `0`

## endpoint

Optional.  String.

Default is `s3.amazonaws.com`

## ua

Optional.  Should be an instance of [LWP::UserAgent](https://metacpan.org/pod/LWP::UserAgent) or a subclass of it.

Defaults to creating a new instance of [LWP::UserAgent::Determined](https://metacpan.org/pod/LWP::UserAgent::Determined)

# PUBLIC PROPERTIES

## access\_key\_id

String.  Read-only

## secret\_access\_key

String.  Read-only.

## secure

Boolean.  Read-only.

## endpoint

String.  Read-only.

## ua

[LWP::UserAgent](https://metacpan.org/pod/LWP::UserAgent) object.  Read-only.

## owner

[AWS::S3::Owner](https://metacpan.org/pod/AWS::S3::Owner) object.  Read-only.

# PUBLIC METHODS

## buckets

Returns an array of [AWS::S3::Bucket](https://metacpan.org/pod/AWS::S3::Bucket) objects.

## bucket( $name )

Returns the [AWS::S3::Bucket](https://metacpan.org/pod/AWS::S3::Bucket) object matching `$name` if found.

Returns nothing otherwise.

## add\_bucket( name => $name, location => 'us-west-1' )

Attempts to create a new bucket with the name provided. The location parameter is optional
and, as per the AWS docs, will default to "us-east-1".

On success, returns the new [AWS::S3::Bucket](https://metacpan.org/pod/AWS::S3::Bucket)

On failure, dies with the error message.

See [AWS::S3::Bucket](https://metacpan.org/pod/AWS::S3::Bucket) for details on how to use buckets (and access their files).

# SEE ALSO

[The Amazon S3 API Documentation](http://docs.amazonwebservices.com/AmazonS3/latest/API/)

[AWS::S3::Bucket](https://metacpan.org/pod/AWS::S3::Bucket)

[AWS::S3::File](https://metacpan.org/pod/AWS::S3::File)

[AWS::S3::FileIterator](https://metacpan.org/pod/AWS::S3::FileIterator)

[AWS::S3::Owner](https://metacpan.org/pod/AWS::S3::Owner)

# AUTHOR

Originally John Drago `[email protected]`, currently maintained by Lee Johnson (LEEJO) `[email protected]`
with contributions from Evan Carroll, Robin Clarke, Ulrich Kautz, simbabque, Dave Rolsky

# LICENSE

This software is Free software and may be used and redistributed under the same
terms as any version of perl itself.

Copyright John Drago 2011 all rights reserved.