AMAZON SIMPLE
  STORAGE SERVICE
        (S3)
The Infinite Hard Drive in the Cloud
What is S3?
What is S3?
A RESTful (or SOAP) data storage API
What is S3?
A RESTful (or SOAP) data storage API
Supports HTTP and BitTorrent protocols
  Control headers to serve content straight from S3
What is S3?
A RESTful (or SOAP) data storage API
Supports HTTP and BitTorrent protocols
  Control headers to serve content straight from S3
Full access control per file or user
  Preauthorize direct uploads by users
What is S3?
A RESTful (or SOAP) data storage API
Supports HTTP and BitTorrent protocols
  Control headers to serve content straight from S3
Full access control per file or user
  Preauthorize direct uploads by users
Billed by capacity stored and transfer rates
Everything is Better Online!
Everything is Better Online!
Basic Usage
Basic Usage
Creating/Listing Buckets
  Globally unique “buckets” hold files on S3
#!/usr/bin/env ruby -KU
    $VERBOSE = nil

    require "rubygems"
    require "aws" # sudo gem install aws

    s3 = Aws::S3.new( "ACCESS_KEY_ID",
               "SECRET_ACCESS_KEY",
               :logger => Logger.new("/dev/null") )
    puts "Your buckets: " +
       s3.buckets.map { |b| b.name }.join(', ')
    puts

    print "Creating the bucket graysoftinc... "
    s3.bucket("graysoftinc", :create, "private")
    puts "Done."
    puts

    puts "Your buckets: " +
       s3.buckets.map { |b| b.name }.join(', ')




Creating/Listing Buckets
  Globally unique “buckets” hold files on S3
#!/usr/bin/env ruby -KU
    $VERBOSE = nil

    require "rubygems"
    require "aws" # sudo gem install aws

    s3 = Aws::S3.new( "ACCESS_KEY_ID",
               "SECRET_ACCESS_KEY",
               :logger => Logger.new("/dev/null") )
    puts "Your buckets: " +
       s3.buckets.map { |b| b.name }.join(', ')
    puts

    print "Creating the bucket graysoftinc... "
    s3.bucket("graysoftinc", :create, "private")
    puts "Done."
    puts

    puts "Your buckets: " +
       s3.buckets.map { |b| b.name }.join(', ')




Creating/Listing Buckets
  Globally unique “buckets” hold files on S3
#!/usr/bin/env ruby -KU
    $VERBOSE = nil

    require "rubygems"
    require "aws" # sudo gem install aws

    s3 = Aws::S3.new( "ACCESS_KEY_ID",
               "SECRET_ACCESS_KEY",
               :logger => Logger.new("/dev/null") )
    puts "Your buckets: " +
       s3.buckets.map { |b| b.name }.join(', ')
    puts

    print "Creating the bucket graysoftinc... "
    s3.bucket("graysoftinc", :create, "private")
    puts "Done."
    puts

    puts "Your buckets: " +
       s3.buckets.map { |b| b.name }.join(', ')




Creating/Listing Buckets
  Globally unique “buckets” hold files on S3
#!/usr/bin/env ruby -KU
    $VERBOSE = nil

    require "rubygems"
    require "aws" # sudo gem install aws

    s3 = Aws::S3.new( "ACCESS_KEY_ID",
               "SECRET_ACCESS_KEY",
               :logger => Logger.new("/dev/null") )
    puts "Your buckets: " +
       s3.buckets.map { |b| b.name }.join(', ')
    puts

    print "Creating the bucket graysoftinc... "
    s3.bucket("graysoftinc", :create, "private")
    puts "Done."
    puts

    puts "Your buckets: " +
       s3.buckets.map { |b| b.name }.join(', ')




Creating/Listing Buckets
  Globally unique “buckets” hold files on S3
#!/usr/bin/env ruby -KU
    $VERBOSE = nil

    require "rubygems"
    require "aws" # sudo gem install aws

    s3 = Aws::S3.new( "ACCESS_KEY_ID",
               "SECRET_ACCESS_KEY",
               :logger => Logger.new("/dev/null") )
    puts "Your buckets: " +
       s3.buckets.map { |b| b.name }.join(', ')
    puts

    print "Creating the bucket graysoftinc... "
    s3.bucket("graysoftinc", :create, "private")
    puts "Done."
    puts

    puts "Your buckets: " +
       s3.buckets.map { |b| b.name }.join(', ')




Creating/Listing Buckets
  Globally unique “buckets” hold files on S3
Your buckets:

        Creating the bucket graysoftinc... Done.

        Your buckets: graysoftinc




Creating/Listing Buckets
  Globally unique “buckets” hold files on S3
Uploading/Listing Files
 Files are “objects” stored under “keys” on S3
#!/usr/bin/env ruby -KU
  $VERBOSE = nil

  require "rubygems"
  require "aws" # sudo gem install aws

  s3 = Aws::S3.new( "ACCESS_KEY_ID",
             "SECRET_ACCESS_KEY",
             :logger => Logger.new("/dev/null") )
  bucket = s3.bucket("graysoftinc")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts

  open(__FILE__) do |f|
   bucket.put("presentations/upload.rb", f)
  end
  bucket.copy_key("presentations/upload.rb", "ruby/upload.rb")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts "ruby/:",
     bucket.keys(:prefix => "ruby/").map { |k| k.name }




Uploading/Listing Files
 Files are “objects” stored under “keys” on S3
#!/usr/bin/env ruby -KU
  $VERBOSE = nil

  require "rubygems"
  require "aws" # sudo gem install aws

  s3 = Aws::S3.new( "ACCESS_KEY_ID",
             "SECRET_ACCESS_KEY",
             :logger => Logger.new("/dev/null") )
  bucket = s3.bucket("graysoftinc")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts

  open(__FILE__) do |f|
   bucket.put("presentations/upload.rb", f)
  end
  bucket.copy_key("presentations/upload.rb", "ruby/upload.rb")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts "ruby/:",
     bucket.keys(:prefix => "ruby/").map { |k| k.name }




Uploading/Listing Files
 Files are “objects” stored under “keys” on S3
#!/usr/bin/env ruby -KU
  $VERBOSE = nil

  require "rubygems"
  require "aws" # sudo gem install aws

  s3 = Aws::S3.new( "ACCESS_KEY_ID",
             "SECRET_ACCESS_KEY",
             :logger => Logger.new("/dev/null") )
  bucket = s3.bucket("graysoftinc")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts

  open(__FILE__) do |f|
   bucket.put("presentations/upload.rb", f)
  end
  bucket.copy_key("presentations/upload.rb", "ruby/upload.rb")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts "ruby/:",
     bucket.keys(:prefix => "ruby/").map { |k| k.name }




Uploading/Listing Files
 Files are “objects” stored under “keys” on S3
#!/usr/bin/env ruby -KU
  $VERBOSE = nil

  require "rubygems"
  require "aws" # sudo gem install aws

  s3 = Aws::S3.new( "ACCESS_KEY_ID",
             "SECRET_ACCESS_KEY",
             :logger => Logger.new("/dev/null") )
  bucket = s3.bucket("graysoftinc")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts

  open(__FILE__) do |f|
   bucket.put("presentations/upload.rb", f)
  end
  bucket.copy_key("presentations/upload.rb", "ruby/upload.rb")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts "ruby/:",
     bucket.keys(:prefix => "ruby/").map { |k| k.name }




Uploading/Listing Files
 Files are “objects” stored under “keys” on S3
#!/usr/bin/env ruby -KU
  $VERBOSE = nil

  require "rubygems"
  require "aws" # sudo gem install aws

  s3 = Aws::S3.new( "ACCESS_KEY_ID",
             "SECRET_ACCESS_KEY",
             :logger => Logger.new("/dev/null") )
  bucket = s3.bucket("graysoftinc")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts

  open(__FILE__) do |f|
   bucket.put("presentations/upload.rb", f)
  end
  bucket.copy_key("presentations/upload.rb", "ruby/upload.rb")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts "ruby/:",
     bucket.keys(:prefix => "ruby/").map { |k| k.name }




Uploading/Listing Files
 Files are “objects” stored under “keys” on S3
#!/usr/bin/env ruby -KU
  $VERBOSE = nil

  require "rubygems"
  require "aws" # sudo gem install aws

  s3 = Aws::S3.new( "ACCESS_KEY_ID",
             "SECRET_ACCESS_KEY",
             :logger => Logger.new("/dev/null") )
  bucket = s3.bucket("graysoftinc")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts

  open(__FILE__) do |f|
   bucket.put("presentations/upload.rb", f)
  end
  bucket.copy_key("presentations/upload.rb", "ruby/upload.rb")

  puts "Files:", bucket.keys.map { |k| k.name }
  puts "ruby/:",
     bucket.keys(:prefix => "ruby/").map { |k| k.name }




Uploading/Listing Files
 Files are “objects” stored under “keys” on S3
Files:

               Files:
               presentations/upload.rb
               ruby/upload.rb
               ruby/:
               ruby/upload.rb




Uploading/Listing Files
 Files are “objects” stored under “keys” on S3
Files:

               Files:
               presentations/upload.rb
               ruby/upload.rb
               ruby/:
               ruby/upload.rb




Uploading/Listing Files
 Files are “objects” stored under “keys” on S3
Downloading a File
 You can stream files to and from S3
#!/usr/bin/env ruby -KU
 $VERBOSE = nil

 require "rubygems"
 require "aws" # sudo gem install aws

 s3 = Aws::S3Interface.new(
   "ACCESS_KEY_ID",
   "SECRET_ACCESS_KEY",
   :logger => Logger.new("/dev/null")
 )

 open("downloaded.rb", "w") do |f|
  s3.get("graysoftinc", "ruby/upload.rb") do |chunk|
   f << chunk
  end
 end




Downloading a File
 You can stream files to and from S3
#!/usr/bin/env ruby -KU
 $VERBOSE = nil

 require "rubygems"
 require "aws" # sudo gem install aws

 s3 = Aws::S3Interface.new(
   "ACCESS_KEY_ID",
   "SECRET_ACCESS_KEY",
   :logger => Logger.new("/dev/null")
 )

 open("downloaded.rb", "w") do |f|
  s3.get("graysoftinc", "ruby/upload.rb") do |chunk|
   f << chunk
  end
 end




Downloading a File
 You can stream files to and from S3
#!/usr/bin/env ruby -KU
 $VERBOSE = nil

 require "rubygems"
 require "aws" # sudo gem install aws

 s3 = Aws::S3Interface.new(
   "ACCESS_KEY_ID",
   "SECRET_ACCESS_KEY",
   :logger => Logger.new("/dev/null")
 )

 open("downloaded.rb", "w") do |f|
  s3.get("graysoftinc", "ruby/upload.rb") do |chunk|
   f << chunk
  end
 end




Downloading a File
 You can stream files to and from S3
The Details
The Details
The Good
The Good
Scalable: effectively
“unlimited” storage
The Good
Scalable: effectively
“unlimited” storage
Reliable: 99.9%
guaranteed uptime and
very redundant
The Good
Scalable: effectively
“unlimited” storage
Reliable: 99.9%
guaranteed uptime and
very redundant
Inexpensive: rates for
GB in cents
The Good
Scalable: effectively
“unlimited” storage
Reliable: 99.9%
guaranteed uptime and
very redundant
Inexpensive: rates for
GB in cents
Universal: everything
supports it
Transmit has FTP-like S3
Support in libraries, command-line tools, and programs
Transmit has FTP-like S3
Support in libraries, command-line tools, and programs
Transmit has FTP-like S3
Support in libraries, command-line tools, and programs
Transmit has FTP-like S3
Support in libraries, command-line tools, and programs
Transmit has FTP-like S3
Support in libraries, command-line tools, and programs
The Not-So-Good
The Not-So-Good
Not quite worldly:
servers in the U.S.,
California, and Ireland
The Not-So-Good
Not quite worldly:
servers in the U.S.,
California, and Ireland
Simple, but not quite
curl/wget simple
The Not-So-Good
Not quite worldly:
servers in the U.S.,
California, and Ireland
Simple, but not quite
curl/wget simple
The service is
“eventually consistent”
Eventual Consistency
All machines will “eventually” see the same data in S3
Now




    Eventual Consistency
All machines will “eventually” see the same data in S3
Eventually

                      Later
                                 Now




    Eventual Consistency
All machines will “eventually” see the same data in S3
Eventually

                      Later
                                 Now




    Eventual Consistency
All machines will “eventually” see the same data in S3

Amazon's Simple Storage Service (S3)

  • 1.
    AMAZON SIMPLE STORAGE SERVICE (S3) The Infinite Hard Drive in the Cloud
  • 2.
  • 3.
    What is S3? ARESTful (or SOAP) data storage API
  • 4.
    What is S3? ARESTful (or SOAP) data storage API Supports HTTP and BitTorrent protocols Control headers to serve content straight from S3
  • 5.
    What is S3? ARESTful (or SOAP) data storage API Supports HTTP and BitTorrent protocols Control headers to serve content straight from S3 Full access control per file or user Preauthorize direct uploads by users
  • 6.
    What is S3? ARESTful (or SOAP) data storage API Supports HTTP and BitTorrent protocols Control headers to serve content straight from S3 Full access control per file or user Preauthorize direct uploads by users Billed by capacity stored and transfer rates
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
    Creating/Listing Buckets Globally unique “buckets” hold files on S3
  • 12.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) puts "Your buckets: " + s3.buckets.map { |b| b.name }.join(', ') puts print "Creating the bucket graysoftinc... " s3.bucket("graysoftinc", :create, "private") puts "Done." puts puts "Your buckets: " + s3.buckets.map { |b| b.name }.join(', ') Creating/Listing Buckets Globally unique “buckets” hold files on S3
  • 13.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) puts "Your buckets: " + s3.buckets.map { |b| b.name }.join(', ') puts print "Creating the bucket graysoftinc... " s3.bucket("graysoftinc", :create, "private") puts "Done." puts puts "Your buckets: " + s3.buckets.map { |b| b.name }.join(', ') Creating/Listing Buckets Globally unique “buckets” hold files on S3
  • 14.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) puts "Your buckets: " + s3.buckets.map { |b| b.name }.join(', ') puts print "Creating the bucket graysoftinc... " s3.bucket("graysoftinc", :create, "private") puts "Done." puts puts "Your buckets: " + s3.buckets.map { |b| b.name }.join(', ') Creating/Listing Buckets Globally unique “buckets” hold files on S3
  • 15.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) puts "Your buckets: " + s3.buckets.map { |b| b.name }.join(', ') puts print "Creating the bucket graysoftinc... " s3.bucket("graysoftinc", :create, "private") puts "Done." puts puts "Your buckets: " + s3.buckets.map { |b| b.name }.join(', ') Creating/Listing Buckets Globally unique “buckets” hold files on S3
  • 16.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) puts "Your buckets: " + s3.buckets.map { |b| b.name }.join(', ') puts print "Creating the bucket graysoftinc... " s3.bucket("graysoftinc", :create, "private") puts "Done." puts puts "Your buckets: " + s3.buckets.map { |b| b.name }.join(', ') Creating/Listing Buckets Globally unique “buckets” hold files on S3
  • 17.
    Your buckets: Creating the bucket graysoftinc... Done. Your buckets: graysoftinc Creating/Listing Buckets Globally unique “buckets” hold files on S3
  • 18.
    Uploading/Listing Files Filesare “objects” stored under “keys” on S3
  • 19.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) bucket = s3.bucket("graysoftinc") puts "Files:", bucket.keys.map { |k| k.name } puts open(__FILE__) do |f| bucket.put("presentations/upload.rb", f) end bucket.copy_key("presentations/upload.rb", "ruby/upload.rb") puts "Files:", bucket.keys.map { |k| k.name } puts "ruby/:", bucket.keys(:prefix => "ruby/").map { |k| k.name } Uploading/Listing Files Files are “objects” stored under “keys” on S3
  • 20.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) bucket = s3.bucket("graysoftinc") puts "Files:", bucket.keys.map { |k| k.name } puts open(__FILE__) do |f| bucket.put("presentations/upload.rb", f) end bucket.copy_key("presentations/upload.rb", "ruby/upload.rb") puts "Files:", bucket.keys.map { |k| k.name } puts "ruby/:", bucket.keys(:prefix => "ruby/").map { |k| k.name } Uploading/Listing Files Files are “objects” stored under “keys” on S3
  • 21.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) bucket = s3.bucket("graysoftinc") puts "Files:", bucket.keys.map { |k| k.name } puts open(__FILE__) do |f| bucket.put("presentations/upload.rb", f) end bucket.copy_key("presentations/upload.rb", "ruby/upload.rb") puts "Files:", bucket.keys.map { |k| k.name } puts "ruby/:", bucket.keys(:prefix => "ruby/").map { |k| k.name } Uploading/Listing Files Files are “objects” stored under “keys” on S3
  • 22.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) bucket = s3.bucket("graysoftinc") puts "Files:", bucket.keys.map { |k| k.name } puts open(__FILE__) do |f| bucket.put("presentations/upload.rb", f) end bucket.copy_key("presentations/upload.rb", "ruby/upload.rb") puts "Files:", bucket.keys.map { |k| k.name } puts "ruby/:", bucket.keys(:prefix => "ruby/").map { |k| k.name } Uploading/Listing Files Files are “objects” stored under “keys” on S3
  • 23.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) bucket = s3.bucket("graysoftinc") puts "Files:", bucket.keys.map { |k| k.name } puts open(__FILE__) do |f| bucket.put("presentations/upload.rb", f) end bucket.copy_key("presentations/upload.rb", "ruby/upload.rb") puts "Files:", bucket.keys.map { |k| k.name } puts "ruby/:", bucket.keys(:prefix => "ruby/").map { |k| k.name } Uploading/Listing Files Files are “objects” stored under “keys” on S3
  • 24.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) bucket = s3.bucket("graysoftinc") puts "Files:", bucket.keys.map { |k| k.name } puts open(__FILE__) do |f| bucket.put("presentations/upload.rb", f) end bucket.copy_key("presentations/upload.rb", "ruby/upload.rb") puts "Files:", bucket.keys.map { |k| k.name } puts "ruby/:", bucket.keys(:prefix => "ruby/").map { |k| k.name } Uploading/Listing Files Files are “objects” stored under “keys” on S3
  • 25.
    Files: Files: presentations/upload.rb ruby/upload.rb ruby/: ruby/upload.rb Uploading/Listing Files Files are “objects” stored under “keys” on S3
  • 26.
    Files: Files: presentations/upload.rb ruby/upload.rb ruby/: ruby/upload.rb Uploading/Listing Files Files are “objects” stored under “keys” on S3
  • 27.
    Downloading a File You can stream files to and from S3
  • 28.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3Interface.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) open("downloaded.rb", "w") do |f| s3.get("graysoftinc", "ruby/upload.rb") do |chunk| f << chunk end end Downloading a File You can stream files to and from S3
  • 29.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3Interface.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) open("downloaded.rb", "w") do |f| s3.get("graysoftinc", "ruby/upload.rb") do |chunk| f << chunk end end Downloading a File You can stream files to and from S3
  • 30.
    #!/usr/bin/env ruby -KU $VERBOSE = nil require "rubygems" require "aws" # sudo gem install aws s3 = Aws::S3Interface.new( "ACCESS_KEY_ID", "SECRET_ACCESS_KEY", :logger => Logger.new("/dev/null") ) open("downloaded.rb", "w") do |f| s3.get("graysoftinc", "ruby/upload.rb") do |chunk| f << chunk end end Downloading a File You can stream files to and from S3
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
    The Good Scalable: effectively “unlimited”storage Reliable: 99.9% guaranteed uptime and very redundant
  • 36.
    The Good Scalable: effectively “unlimited”storage Reliable: 99.9% guaranteed uptime and very redundant Inexpensive: rates for GB in cents
  • 37.
    The Good Scalable: effectively “unlimited”storage Reliable: 99.9% guaranteed uptime and very redundant Inexpensive: rates for GB in cents Universal: everything supports it
  • 38.
    Transmit has FTP-likeS3 Support in libraries, command-line tools, and programs
  • 39.
    Transmit has FTP-likeS3 Support in libraries, command-line tools, and programs
  • 40.
    Transmit has FTP-likeS3 Support in libraries, command-line tools, and programs
  • 41.
    Transmit has FTP-likeS3 Support in libraries, command-line tools, and programs
  • 42.
    Transmit has FTP-likeS3 Support in libraries, command-line tools, and programs
  • 43.
  • 44.
    The Not-So-Good Not quiteworldly: servers in the U.S., California, and Ireland
  • 45.
    The Not-So-Good Not quiteworldly: servers in the U.S., California, and Ireland Simple, but not quite curl/wget simple
  • 46.
    The Not-So-Good Not quiteworldly: servers in the U.S., California, and Ireland Simple, but not quite curl/wget simple The service is “eventually consistent”
  • 47.
    Eventual Consistency All machineswill “eventually” see the same data in S3
  • 48.
    Now Eventual Consistency All machines will “eventually” see the same data in S3
  • 49.
    Eventually Later Now Eventual Consistency All machines will “eventually” see the same data in S3
  • 50.
    Eventually Later Now Eventual Consistency All machines will “eventually” see the same data in S3