SlideShare una empresa de Scribd logo
1 de 23
Descargar para leer sin conexión
Browser	 Uploads	 to	 S3	 
                     using	 HTML	 POST	 Forms
                               @suz_lab




Saturday, December 17, 11
AWSで負荷分散が容易に!




Saturday, December 17, 11
(Upload)ファイル分散問題

                    •nfs?
                     •SPOF対策が面倒...
                    •s3fs?
                     •Heavyに利用すると嫌な思い出が...
                    •...
Saturday, December 17, 11
As-Is	 と	 To-Be




Saturday, December 17, 11
シーケンス




Saturday, December 17, 11
<form	 action="http://www.suz-lab.com.s3.amazonaws.com/"
	 	 	 	 	 	 	 	 	 	 method="post"	 enctype="multipart/form-data">
	 	 	 	 	 	 <input	 type="hidden"	 name="key"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="${filename}"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="AWSAccessKeyId"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="AAAAAAAAAAAAAAAAAAAA"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="acl"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="private"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="success_action_redirect"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="http://www.suz-lab.com/"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="policy"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="pppppppppppppppppppppppppppp"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="signature"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="ssssssssssssssssssssssssssss"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="Content-Type"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="text/plain"/>
	 	 	 	 	 	 <input	 type="file"	 	 	 name="file"/>
	 	 	 	 	 	 <input	 type="submit"	 name="button"	 value="Upload"/>
	 	 	 	 </form>
Saturday, December 17, 11
<form	 action="http://www.suz-lab.com.s3.amazonaws.com/"
	 	 	 	 	 	 	 	 	 	 method="post"	 enctype="multipart/form-data">
	 	 	 	 	 	 <input	 type="hidden"	 name="key"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="${filename}"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="AWSAccessKeyId"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="AAAAAAAAAAAAAAAAAAAA"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="acl"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="private"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="success_action_redirect"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="http://www.suz-lab.com/"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="policy"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="pppppppppppppppppppppppppppp"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="signature"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="ssssssssssssssssssssssssssss"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="Content-Type"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="text/plain"/>
	 	 	 	 	 	 <input	 type="file"	 	 	 name="file"/>
	 	 	 	 	 	 <input	 type="submit"	 name="button"	 value="Upload"/>
	 	 	 	 </form>
Saturday, December 17, 11
action

                    •       バケット名.s3.amazonaws.comを指定


                    •       http/httpsが指定可能
                     •りのバケット名は証明書エラー
                      www.suz-lab.comのようなドット区切

                            •   証明書が*.s3.amazonaws.comだから


Saturday, December 17, 11
<form	 action="http://www.suz-lab.com.s3.amazonaws.com/"
	 	 	 	 	 	 	 	 	 	 method="post"	 enctype="multipart/form-data">
	 	 	 	 	 	 <input	 type="hidden"	 name="key"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="${filename}"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="AWSAccessKeyId"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="AAAAAAAAAAAAAAAAAAAA"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="acl"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="private"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="success_action_redirect"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="http://www.suz-lab.com/"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="policy"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="pppppppppppppppppppppppppppp"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="signature"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="ssssssssssssssssssssssssssss"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="Content-Type"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="text/plain"/>
	 	 	 	 	 	 <input	 type="file"	 	 	 name="file"/>
	 	 	 	 	 	 <input	 type="submit"	 name="button"	 value="Upload"/>
	 	 	 	 </form>
Saturday, December 17, 11
key


                    •S3にアップロードされるオブジェクト
                     (ファイル)名を指定


                    •${filename}にするとアップロードする
                     ファイル名が利用される




Saturday, December 17, 11
<form	 action="http://www.suz-lab.com.s3.amazonaws.com/"
	 	 	 	 	 	 	 	 	 	 method="post"	 enctype="multipart/form-data">
	 	 	 	 	 	 <input	 type="hidden"	 name="key"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="${filename}"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="AWSAccessKeyId"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="AAAAAAAAAAAAAAAAAAAA"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="acl"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="private"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="success_action_redirect"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="http://www.suz-lab.com/"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="policy"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="pppppppppppppppppppppppppppp"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="signature"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="ssssssssssssssssssssssssssss"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="Content-Type"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="text/plain"/>
	 	 	 	 	 	 <input	 type="file"	 	 	 name="file"/>
	 	 	 	 	 	 <input	 type="submit"	 name="button"	 value="Upload"/>
	 	 	 	 </form>
Saturday, December 17, 11
acl

                    •       private
                    • public-read
                    • public-read-write
                    • authenticated-read
                    • bucket-owner-read
                    • bucket-owner-full-control


Saturday, December 17, 11
<form	 action="http://www.suz-lab.com.s3.amazonaws.com/"
	 	 	 	 	 	 	 	 	 	 method="post"	 enctype="multipart/form-data">
	 	 	 	 	 	 <input	 type="hidden"	 name="key"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="${filename}"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="AWSAccessKeyId"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="AAAAAAAAAAAAAAAAAAAA"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="acl"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="private"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="success_action_redirect"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="http://www.suz-lab.com/"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="policy"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="pppppppppppppppppppppppppppp"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="signature"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="ssssssssssssssssssssssssssss"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="Content-Type"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="text/plain"/>
	 	 	 	 	 	 <input	 type="file"	 	 	 name="file"/>
	 	 	 	 	 	 <input	 type="submit"	 name="button"	 value="Upload"/>
	 	 	 	 </form>
Saturday, December 17, 11
success_action_redirect


                    •アップロード完了後のリダイレクト先
                     •http://www.suz-lab.com/
                            ?bucket=www.suz-lab.com
                            &key=upload.txt
                            &etag=%22...%22



Saturday, December 17, 11
<form	 action="http://www.suz-lab.com.s3.amazonaws.com/"
	 	 	 	 	 	 	 	 	 	 method="post"	 enctype="multipart/form-data">
	 	 	 	 	 	 <input	 type="hidden"	 name="key"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="${filename}"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="AWSAccessKeyId"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="AAAAAAAAAAAAAAAAAAAA"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="acl"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="private"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="success_action_redirect"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="http://www.suz-lab.com/"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="policy"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="pppppppppppppppppppppppppppp"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="signature"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="ssssssssssssssssssssssssssss"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="Content-Type"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="text/plain"/>
	 	 	 	 	 	 <input	 type="file"	 	 	 name="file"/>
	 	 	 	 	 	 <input	 type="submit"	 name="button"	 value="Upload"/>
	 	 	 	 </form>
Saturday, December 17, 11
policy


                    •       JSONで記述されたポリシーをBase64で
                            エンコードしたもの


                    •       ポリシーには有効期限やフォームの
                            inputタグに記載された内容の条件など
                            を記述



Saturday, December 17, 11
require	 'base64'

json	 =	 <<"EOS"
{
	 	 "expiration":	 "2012-01-01T00:00:00Z",
	 	 "conditions":	 [
	 	 	 	 {"bucket":	 "www.suz-lab.com"},
	 	 	 	 ["starts-with",	 "$key",	 ""],
	 	 	 	 {"acl":	 "private"},
	 	 	 	 {"success_action_redirect":	 "http://www.suz-lab.com/"},
	 	 	 	 ["starts-with",	 "$Content-Type",	 ""],
	 	 	 	 ["content-length-range",	 0,	 1048576]
	 	 ]
}
EOS

policy	 =	 Base64.encode64(json).gsub("n","")

Saturday, December 17, 11
<form	 action="http://www.suz-lab.com.s3.amazonaws.com/"
	 	 	 	 	 	 	 	 	 	 method="post"	 enctype="multipart/form-data">
	 	 	 	 	 	 <input	 type="hidden"	 name="key"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="${filename}"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="AWSAccessKeyId"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="AAAAAAAAAAAAAAAAAAAA"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="acl"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="private"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="success_action_redirect"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="http://www.suz-lab.com/"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="policy"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="pppppppppppppppppppppppppppp"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="signature"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="ssssssssssssssssssssssssssss"/>
	 	 	 	 	 	 <input	 type="hidden"	 name="Content-Type"
	 	 	 	 	 	 	 	 	 	 	 	 	 value="text/plain"/>
	 	 	 	 	 	 <input	 type="file"	 	 	 name="file"/>
	 	 	 	 	 	 <input	 type="submit"	 name="button"	 value="Upload"/>
	 	 	 	 </form>
Saturday, December 17, 11
signature



                    •       Base64でエンコードされたポリシーを
                            HMAC/SHA-1を使ってシークレットキー
                            でサインして、さらにBase64でエン
                            コードしたもの




Saturday, December 17, 11
require	 'base64'
            require	 'openssl'
            require	 'digest/sha1'

            ...

            signature	 =	 Base64.encode64(OpenSSL::HMAC.digest(
            	 	 	 	 OpenSSL::Digest::Digest.new('sha1'),
            	 	 	 	 "SECRET_KEY",	 policy
            )).gsub("n","")




Saturday, December 17, 11
まとめ

                    •負荷分散によるアップロードファイル
                     分散問題


                            •直接S3にファイルアップロードする
                             ことで解決


                             •S3の耐久性と可用性をダイレクト
                              に利用できるので負荷や障害にも
                              強いシステムに!
Saturday, December 17, 11
参考資料
                    •       Browser-Based	 Uploads	 Using	 POST
                            http://docs.amazonwebservices.com/AmazonS3/2006-03-01/
                            dev/UsingHTTPPOST.html



                    •       Browser	 Uploads	 to	 S3	 using	 HTML	 POST	 Forms
                            http://aws.amazon.com/articles/1434



                    •       Amazon	 Simple	 Storage	 Service:	 Browser-Based	 Uploads	 
                            using	 POST	 Proposal
                            http://doc.s3.amazonaws.com/proposals/post.html



Saturday, December 17, 11
cloudpack




Saturday, December 17, 11

Más contenido relacionado

La actualidad más candente

Google
GoogleGoogle
Google
soon
 
Authentication
AuthenticationAuthentication
Authentication
soon
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
elliando dias
 
Deploying
DeployingDeploying
Deploying
soon
 

La actualidad más candente (18)

Php summary
Php summaryPhp summary
Php summary
 
PHP API
PHP APIPHP API
PHP API
 
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK -  Nicola Iarocci - Co...RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK -  Nicola Iarocci - Co...
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
 
Let's write secure Drupal code! DUG Belgium - 08/08/2019
Let's write secure Drupal code! DUG Belgium - 08/08/2019Let's write secure Drupal code! DUG Belgium - 08/08/2019
Let's write secure Drupal code! DUG Belgium - 08/08/2019
 
php part 2
php part 2php part 2
php part 2
 
Google
GoogleGoogle
Google
 
Authentication
AuthenticationAuthentication
Authentication
 
Let's write secure drupal code! - Drupal Camp Pannonia 2019
Let's write secure drupal code! - Drupal Camp Pannonia 2019Let's write secure drupal code! - Drupal Camp Pannonia 2019
Let's write secure drupal code! - Drupal Camp Pannonia 2019
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
Deploying
DeployingDeploying
Deploying
 
Let's write secure Drupal code! - DrupalCamp Oslo, 2018
Let's write secure Drupal code! - DrupalCamp Oslo, 2018Let's write secure Drupal code! - DrupalCamp Oslo, 2018
Let's write secure Drupal code! - DrupalCamp Oslo, 2018
 
Perkenalan ReasonML
Perkenalan ReasonMLPerkenalan ReasonML
Perkenalan ReasonML
 
Introduction to ReasonML
Introduction to ReasonMLIntroduction to ReasonML
Introduction to ReasonML
 
HirshHorn theme: how I created it
HirshHorn theme: how I created itHirshHorn theme: how I created it
HirshHorn theme: how I created it
 
Let's write secure Drupal code! - Drupal Camp Poland 2019
Let's write secure Drupal code! - Drupal Camp Poland 2019Let's write secure Drupal code! - Drupal Camp Poland 2019
Let's write secure Drupal code! - Drupal Camp Poland 2019
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 
Not Really PHP by the book
Not Really PHP by the bookNot Really PHP by the book
Not Really PHP by the book
 
jQuery Basic API
jQuery Basic APIjQuery Basic API
jQuery Basic API
 

Similar a Browser Uploads to S3 using HTML POST Forms

Zendcon 2007 Api Design
Zendcon 2007 Api DesignZendcon 2007 Api Design
Zendcon 2007 Api Design
unodelostrece
 
Simple Web Apps With Sinatra
Simple Web Apps With SinatraSimple Web Apps With Sinatra
Simple Web Apps With Sinatra
a_l
 
Advanced Structured Data: Beyond Rich Snippets
Advanced Structured Data: Beyond Rich SnippetsAdvanced Structured Data: Beyond Rich Snippets
Advanced Structured Data: Beyond Rich Snippets
Justin Briggs
 
Html5 advanced part2
Html5 advanced part2Html5 advanced part2
Html5 advanced part2
Suresh Balla
 
[제1회 루씬 한글분석기 기술세미나] solr로 나만의 검색엔진을 만들어보자
[제1회 루씬 한글분석기 기술세미나] solr로 나만의 검색엔진을 만들어보자[제1회 루씬 한글분석기 기술세미나] solr로 나만의 검색엔진을 만들어보자
[제1회 루씬 한글분석기 기술세미나] solr로 나만의 검색엔진을 만들어보자
Donghyeok Kang
 

Similar a Browser Uploads to S3 using HTML POST Forms (20)

elasticsearch basics workshop
elasticsearch basics workshopelasticsearch basics workshop
elasticsearch basics workshop
 
Node.js - Demnächst auf einem Server in Ihrer Nähe
Node.js - Demnächst auf einem Server in Ihrer NäheNode.js - Demnächst auf einem Server in Ihrer Nähe
Node.js - Demnächst auf einem Server in Ihrer Nähe
 
PostgreSQL's Secret NoSQL Superpowers
PostgreSQL's Secret NoSQL SuperpowersPostgreSQL's Secret NoSQL Superpowers
PostgreSQL's Secret NoSQL Superpowers
 
Php
PhpPhp
Php
 
Karan chanan
Karan chananKaran chanan
Karan chanan
 
Karan - form search
Karan - form searchKaran - form search
Karan - form search
 
jQuery: Tips, tricks and hints for better development and Performance
jQuery: Tips, tricks and hints for better development and PerformancejQuery: Tips, tricks and hints for better development and Performance
jQuery: Tips, tricks and hints for better development and Performance
 
Zendcon 2007 Api Design
Zendcon 2007 Api DesignZendcon 2007 Api Design
Zendcon 2007 Api Design
 
FamilySearch Reference Client
FamilySearch Reference ClientFamilySearch Reference Client
FamilySearch Reference Client
 
Simple Web Apps With Sinatra
Simple Web Apps With SinatraSimple Web Apps With Sinatra
Simple Web Apps With Sinatra
 
Empezando con Twig
Empezando con TwigEmpezando con Twig
Empezando con Twig
 
Kphpug beginners-2
Kphpug beginners-2Kphpug beginners-2
Kphpug beginners-2
 
The Web Is Changing — From Strings to Things
The Web Is Changing — From Strings to ThingsThe Web Is Changing — From Strings to Things
The Web Is Changing — From Strings to Things
 
Advanced Structured Data: Beyond Rich Snippets
Advanced Structured Data: Beyond Rich SnippetsAdvanced Structured Data: Beyond Rich Snippets
Advanced Structured Data: Beyond Rich Snippets
 
Undercover Pods / WP Functions
Undercover Pods / WP FunctionsUndercover Pods / WP Functions
Undercover Pods / WP Functions
 
Elasticsearch – mye mer enn søk! [JavaZone 2013]
Elasticsearch – mye mer enn søk! [JavaZone 2013]Elasticsearch – mye mer enn søk! [JavaZone 2013]
Elasticsearch – mye mer enn søk! [JavaZone 2013]
 
Html5 advanced part2
Html5 advanced part2Html5 advanced part2
Html5 advanced part2
 
How to build a High Performance PSGI/Plack Server
How to build a High Performance PSGI/Plack Server How to build a High Performance PSGI/Plack Server
How to build a High Performance PSGI/Plack Server
 
[제1회 루씬 한글분석기 기술세미나] solr로 나만의 검색엔진을 만들어보자
[제1회 루씬 한글분석기 기술세미나] solr로 나만의 검색엔진을 만들어보자[제1회 루씬 한글분석기 기술세미나] solr로 나만의 검색엔진을 만들어보자
[제1회 루씬 한글분석기 기술세미나] solr로 나만의 검색엔진을 만들어보자
 
Emmet cheat-sheet
Emmet cheat-sheetEmmet cheat-sheet
Emmet cheat-sheet
 

Más de Hiroyasu Suzuki

VIOPS09 AWSで実現するクラウドと物理製品の融合
VIOPS09 AWSで実現するクラウドと物理製品の融合VIOPS09 AWSで実現するクラウドと物理製品の融合
VIOPS09 AWSで実現するクラウドと物理製品の融合
Hiroyasu Suzuki
 
VYATTA USERS MEETING Spring 2014
VYATTA USERS MEETING Spring 2014VYATTA USERS MEETING Spring 2014
VYATTA USERS MEETING Spring 2014
Hiroyasu Suzuki
 
実践!AWSクラウドデザインパターン
実践!AWSクラウドデザインパターン実践!AWSクラウドデザインパターン
実践!AWSクラウドデザインパターン
Hiroyasu Suzuki
 
CDP キャンペーンサイト編 UPDATE
CDP キャンペーンサイト編 UPDATECDP キャンペーンサイト編 UPDATE
CDP キャンペーンサイト編 UPDATE
Hiroyasu Suzuki
 
CDP(キャンペーンサイト編)
CDP(キャンペーンサイト編)CDP(キャンペーンサイト編)
CDP(キャンペーンサイト編)
Hiroyasu Suzuki
 
Amazon Web Services(AWS)とcloudpack について
Amazon Web Services(AWS)とcloudpack についてAmazon Web Services(AWS)とcloudpack について
Amazon Web Services(AWS)とcloudpack について
Hiroyasu Suzuki
 
AWStatsでS3&CloudFrontのアクセス解析
AWStatsでS3&CloudFrontのアクセス解析AWStatsでS3&CloudFrontのアクセス解析
AWStatsでS3&CloudFrontのアクセス解析
Hiroyasu Suzuki
 
AWStatsでS3&CloudFrontのアクセス解析
AWStatsでS3&CloudFrontのアクセス解析AWStatsでS3&CloudFrontのアクセス解析
AWStatsでS3&CloudFrontのアクセス解析
Hiroyasu Suzuki
 
RDS(MySQL)の利用と注意点
RDS(MySQL)の利用と注意点RDS(MySQL)の利用と注意点
RDS(MySQL)の利用と注意点
Hiroyasu Suzuki
 
雲(AWS)に願いを!
雲(AWS)に願いを!雲(AWS)に願いを!
雲(AWS)に願いを!
Hiroyasu Suzuki
 
cloudpack(AWS運用事業)一周年でわかってきたこと
cloudpack(AWS運用事業)一周年でわかってきたことcloudpack(AWS運用事業)一周年でわかってきたこと
cloudpack(AWS運用事業)一周年でわかってきたこと
Hiroyasu Suzuki
 
AWSでスケールアウト&スケールアップ
AWSでスケールアウト&スケールアップAWSでスケールアウト&スケールアップ
AWSでスケールアウト&スケールアップ
Hiroyasu Suzuki
 
AWSのcloudpack流フルマネージメント
AWSのcloudpack流フルマネージメントAWSのcloudpack流フルマネージメント
AWSのcloudpack流フルマネージメント
Hiroyasu Suzuki
 
AWS+でスケールアウト&スケールアップ
AWS+でスケールアウト&スケールアップAWS+でスケールアウト&スケールアップ
AWS+でスケールアウト&スケールアップ
Hiroyasu Suzuki
 
AWS+が提供する運用・保守サービス
AWS+が提供する運用・保守サービスAWS+が提供する運用・保守サービス
AWS+が提供する運用・保守サービス
Hiroyasu Suzuki
 

Más de Hiroyasu Suzuki (20)

JAWS-UGコンテナ支部#2「EC2」から「ECS」へ
JAWS-UGコンテナ支部#2「EC2」から「ECS」へJAWS-UGコンテナ支部#2「EC2」から「ECS」へ
JAWS-UGコンテナ支部#2「EC2」から「ECS」へ
 
VIOPS09 AWSで実現するクラウドと物理製品の融合
VIOPS09 AWSで実現するクラウドと物理製品の融合VIOPS09 AWSで実現するクラウドと物理製品の融合
VIOPS09 AWSで実現するクラウドと物理製品の融合
 
VYATTA USERS MEETING Spring 2014
VYATTA USERS MEETING Spring 2014VYATTA USERS MEETING Spring 2014
VYATTA USERS MEETING Spring 2014
 
実践!AWSクラウドデザインパターン
実践!AWSクラウドデザインパターン実践!AWSクラウドデザインパターン
実践!AWSクラウドデザインパターン
 
Vyatta AWS
Vyatta AWSVyatta AWS
Vyatta AWS
 
CDP キャンペーンサイト編 UPDATE
CDP キャンペーンサイト編 UPDATECDP キャンペーンサイト編 UPDATE
CDP キャンペーンサイト編 UPDATE
 
cdp-night-01
cdp-night-01cdp-night-01
cdp-night-01
 
CDP in NAGOYA
CDP in NAGOYACDP in NAGOYA
CDP in NAGOYA
 
AWS & cloudpack & CDP
AWS & cloudpack & CDPAWS & cloudpack & CDP
AWS & cloudpack & CDP
 
CDP(キャンペーンサイト編)
CDP(キャンペーンサイト編)CDP(キャンペーンサイト編)
CDP(キャンペーンサイト編)
 
Amazon Web Services(AWS)とcloudpack について
Amazon Web Services(AWS)とcloudpack についてAmazon Web Services(AWS)とcloudpack について
Amazon Web Services(AWS)とcloudpack について
 
AWStatsでS3&CloudFrontのアクセス解析
AWStatsでS3&CloudFrontのアクセス解析AWStatsでS3&CloudFrontのアクセス解析
AWStatsでS3&CloudFrontのアクセス解析
 
AWStatsでS3&CloudFrontのアクセス解析
AWStatsでS3&CloudFrontのアクセス解析AWStatsでS3&CloudFrontのアクセス解析
AWStatsでS3&CloudFrontのアクセス解析
 
RDS(MySQL)の利用と注意点
RDS(MySQL)の利用と注意点RDS(MySQL)の利用と注意点
RDS(MySQL)の利用と注意点
 
雲(AWS)に願いを!
雲(AWS)に願いを!雲(AWS)に願いを!
雲(AWS)に願いを!
 
cloudpack(AWS運用事業)一周年でわかってきたこと
cloudpack(AWS運用事業)一周年でわかってきたことcloudpack(AWS運用事業)一周年でわかってきたこと
cloudpack(AWS運用事業)一周年でわかってきたこと
 
AWSでスケールアウト&スケールアップ
AWSでスケールアウト&スケールアップAWSでスケールアウト&スケールアップ
AWSでスケールアウト&スケールアップ
 
AWSのcloudpack流フルマネージメント
AWSのcloudpack流フルマネージメントAWSのcloudpack流フルマネージメント
AWSのcloudpack流フルマネージメント
 
AWS+でスケールアウト&スケールアップ
AWS+でスケールアウト&スケールアップAWS+でスケールアウト&スケールアップ
AWS+でスケールアウト&スケールアップ
 
AWS+が提供する運用・保守サービス
AWS+が提供する運用・保守サービスAWS+が提供する運用・保守サービス
AWS+が提供する運用・保守サービス
 

Último

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Último (20)

AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 

Browser Uploads to S3 using HTML POST Forms

  • 1. Browser Uploads to S3 using HTML POST Forms @suz_lab Saturday, December 17, 11
  • 3. (Upload)ファイル分散問題 •nfs? •SPOF対策が面倒... •s3fs? •Heavyに利用すると嫌な思い出が... •... Saturday, December 17, 11
  • 4. As-Is と To-Be Saturday, December 17, 11
  • 6. <form action="http://www.suz-lab.com.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> <input type="hidden" name="key" value="${filename}"/> <input type="hidden" name="AWSAccessKeyId" value="AAAAAAAAAAAAAAAAAAAA"/> <input type="hidden" name="acl" value="private"/> <input type="hidden" name="success_action_redirect" value="http://www.suz-lab.com/"/> <input type="hidden" name="policy" value="pppppppppppppppppppppppppppp"/> <input type="hidden" name="signature" value="ssssssssssssssssssssssssssss"/> <input type="hidden" name="Content-Type" value="text/plain"/> <input type="file" name="file"/> <input type="submit" name="button" value="Upload"/> </form> Saturday, December 17, 11
  • 7. <form action="http://www.suz-lab.com.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> <input type="hidden" name="key" value="${filename}"/> <input type="hidden" name="AWSAccessKeyId" value="AAAAAAAAAAAAAAAAAAAA"/> <input type="hidden" name="acl" value="private"/> <input type="hidden" name="success_action_redirect" value="http://www.suz-lab.com/"/> <input type="hidden" name="policy" value="pppppppppppppppppppppppppppp"/> <input type="hidden" name="signature" value="ssssssssssssssssssssssssssss"/> <input type="hidden" name="Content-Type" value="text/plain"/> <input type="file" name="file"/> <input type="submit" name="button" value="Upload"/> </form> Saturday, December 17, 11
  • 8. action • バケット名.s3.amazonaws.comを指定 • http/httpsが指定可能 •りのバケット名は証明書エラー www.suz-lab.comのようなドット区切 • 証明書が*.s3.amazonaws.comだから Saturday, December 17, 11
  • 9. <form action="http://www.suz-lab.com.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> <input type="hidden" name="key" value="${filename}"/> <input type="hidden" name="AWSAccessKeyId" value="AAAAAAAAAAAAAAAAAAAA"/> <input type="hidden" name="acl" value="private"/> <input type="hidden" name="success_action_redirect" value="http://www.suz-lab.com/"/> <input type="hidden" name="policy" value="pppppppppppppppppppppppppppp"/> <input type="hidden" name="signature" value="ssssssssssssssssssssssssssss"/> <input type="hidden" name="Content-Type" value="text/plain"/> <input type="file" name="file"/> <input type="submit" name="button" value="Upload"/> </form> Saturday, December 17, 11
  • 10. key •S3にアップロードされるオブジェクト (ファイル)名を指定 •${filename}にするとアップロードする ファイル名が利用される Saturday, December 17, 11
  • 11. <form action="http://www.suz-lab.com.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> <input type="hidden" name="key" value="${filename}"/> <input type="hidden" name="AWSAccessKeyId" value="AAAAAAAAAAAAAAAAAAAA"/> <input type="hidden" name="acl" value="private"/> <input type="hidden" name="success_action_redirect" value="http://www.suz-lab.com/"/> <input type="hidden" name="policy" value="pppppppppppppppppppppppppppp"/> <input type="hidden" name="signature" value="ssssssssssssssssssssssssssss"/> <input type="hidden" name="Content-Type" value="text/plain"/> <input type="file" name="file"/> <input type="submit" name="button" value="Upload"/> </form> Saturday, December 17, 11
  • 12. acl • private • public-read • public-read-write • authenticated-read • bucket-owner-read • bucket-owner-full-control Saturday, December 17, 11
  • 13. <form action="http://www.suz-lab.com.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> <input type="hidden" name="key" value="${filename}"/> <input type="hidden" name="AWSAccessKeyId" value="AAAAAAAAAAAAAAAAAAAA"/> <input type="hidden" name="acl" value="private"/> <input type="hidden" name="success_action_redirect" value="http://www.suz-lab.com/"/> <input type="hidden" name="policy" value="pppppppppppppppppppppppppppp"/> <input type="hidden" name="signature" value="ssssssssssssssssssssssssssss"/> <input type="hidden" name="Content-Type" value="text/plain"/> <input type="file" name="file"/> <input type="submit" name="button" value="Upload"/> </form> Saturday, December 17, 11
  • 14. success_action_redirect •アップロード完了後のリダイレクト先 •http://www.suz-lab.com/ ?bucket=www.suz-lab.com &key=upload.txt &etag=%22...%22 Saturday, December 17, 11
  • 15. <form action="http://www.suz-lab.com.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> <input type="hidden" name="key" value="${filename}"/> <input type="hidden" name="AWSAccessKeyId" value="AAAAAAAAAAAAAAAAAAAA"/> <input type="hidden" name="acl" value="private"/> <input type="hidden" name="success_action_redirect" value="http://www.suz-lab.com/"/> <input type="hidden" name="policy" value="pppppppppppppppppppppppppppp"/> <input type="hidden" name="signature" value="ssssssssssssssssssssssssssss"/> <input type="hidden" name="Content-Type" value="text/plain"/> <input type="file" name="file"/> <input type="submit" name="button" value="Upload"/> </form> Saturday, December 17, 11
  • 16. policy • JSONで記述されたポリシーをBase64で エンコードしたもの • ポリシーには有効期限やフォームの inputタグに記載された内容の条件など を記述 Saturday, December 17, 11
  • 17. require 'base64' json = <<"EOS" { "expiration": "2012-01-01T00:00:00Z", "conditions": [ {"bucket": "www.suz-lab.com"}, ["starts-with", "$key", ""], {"acl": "private"}, {"success_action_redirect": "http://www.suz-lab.com/"}, ["starts-with", "$Content-Type", ""], ["content-length-range", 0, 1048576] ] } EOS policy = Base64.encode64(json).gsub("n","") Saturday, December 17, 11
  • 18. <form action="http://www.suz-lab.com.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> <input type="hidden" name="key" value="${filename}"/> <input type="hidden" name="AWSAccessKeyId" value="AAAAAAAAAAAAAAAAAAAA"/> <input type="hidden" name="acl" value="private"/> <input type="hidden" name="success_action_redirect" value="http://www.suz-lab.com/"/> <input type="hidden" name="policy" value="pppppppppppppppppppppppppppp"/> <input type="hidden" name="signature" value="ssssssssssssssssssssssssssss"/> <input type="hidden" name="Content-Type" value="text/plain"/> <input type="file" name="file"/> <input type="submit" name="button" value="Upload"/> </form> Saturday, December 17, 11
  • 19. signature • Base64でエンコードされたポリシーを HMAC/SHA-1を使ってシークレットキー でサインして、さらにBase64でエン コードしたもの Saturday, December 17, 11
  • 20. require 'base64' require 'openssl' require 'digest/sha1' ... signature = Base64.encode64(OpenSSL::HMAC.digest( OpenSSL::Digest::Digest.new('sha1'), "SECRET_KEY", policy )).gsub("n","") Saturday, December 17, 11
  • 21. まとめ •負荷分散によるアップロードファイル 分散問題 •直接S3にファイルアップロードする ことで解決 •S3の耐久性と可用性をダイレクト に利用できるので負荷や障害にも 強いシステムに! Saturday, December 17, 11
  • 22. 参考資料 • Browser-Based Uploads Using POST http://docs.amazonwebservices.com/AmazonS3/2006-03-01/ dev/UsingHTTPPOST.html • Browser Uploads to S3 using HTML POST Forms http://aws.amazon.com/articles/1434 • Amazon Simple Storage Service: Browser-Based Uploads using POST Proposal http://doc.s3.amazonaws.com/proposals/post.html Saturday, December 17, 11