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

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...Codemotion
 
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/2019Balázs Tatár
 
Google
GoogleGoogle
Googlesoon
 
Authentication
AuthenticationAuthentication
Authenticationsoon
 
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 2019Balázs Tatár
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applicationselliando dias
 
Deploying
DeployingDeploying
Deployingsoon
 
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, 2018Balázs Tatár
 
Perkenalan ReasonML
Perkenalan ReasonMLPerkenalan ReasonML
Perkenalan ReasonMLRiza Fahmi
 
Introduction to ReasonML
Introduction to ReasonMLIntroduction to ReasonML
Introduction to ReasonMLRiza Fahmi
 
HirshHorn theme: how I created it
HirshHorn theme: how I created itHirshHorn theme: how I created it
HirshHorn theme: how I created itPaul Bearne
 
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 2019Balázs Tatár
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVCAlive Kuo
 
Not Really PHP by the book
Not Really PHP by the bookNot Really PHP by the book
Not Really PHP by the bookRyan Kilfedder
 

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

elasticsearch basics workshop
elasticsearch basics workshopelasticsearch basics workshop
elasticsearch basics workshopMathieu Elie
 
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äheRalph Winzinger
 
PostgreSQL's Secret NoSQL Superpowers
PostgreSQL's Secret NoSQL SuperpowersPostgreSQL's Secret NoSQL Superpowers
PostgreSQL's Secret NoSQL SuperpowersAmanda Gilmore
 
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 PerformanceJonas De Smet
 
Zendcon 2007 Api Design
Zendcon 2007 Api DesignZendcon 2007 Api Design
Zendcon 2007 Api Designunodelostrece
 
FamilySearch Reference Client
FamilySearch Reference ClientFamilySearch Reference Client
FamilySearch Reference ClientDallan Quass
 
Simple Web Apps With Sinatra
Simple Web Apps With SinatraSimple Web Apps With Sinatra
Simple Web Apps With Sinatraa_l
 
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 ThingsMarkus Lanthaler
 
Advanced Structured Data: Beyond Rich Snippets
Advanced Structured Data: Beyond Rich SnippetsAdvanced Structured Data: Beyond Rich Snippets
Advanced Structured Data: Beyond Rich SnippetsJustin Briggs
 
Undercover Pods / WP Functions
Undercover Pods / WP FunctionsUndercover Pods / WP Functions
Undercover Pods / WP Functionspodsframework
 
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]foundsearch
 
Html5 advanced part2
Html5 advanced part2Html5 advanced part2
Html5 advanced part2Suresh Balla
 
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 Masahiro Nagano
 
[제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 - form search
Karan - form searchKaran - form search
Karan - form search
 
Karan chanan
Karan chananKaran chanan
Karan chanan
 
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

JAWS-UGコンテナ支部#2「EC2」から「ECS」へ
JAWS-UGコンテナ支部#2「EC2」から「ECS」へJAWS-UGコンテナ支部#2「EC2」から「ECS」へ
JAWS-UGコンテナ支部#2「EC2」から「ECS」へ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 2014Hiroyasu Suzuki
 
実践!AWSクラウドデザインパターン
実践!AWSクラウドデザインパターン実践!AWSクラウドデザインパターン
実践!AWSクラウドデザインパターンHiroyasu Suzuki
 
CDP キャンペーンサイト編 UPDATE
CDP キャンペーンサイト編 UPDATECDP キャンペーンサイト編 UPDATE
CDP キャンペーンサイト編 UPDATEHiroyasu 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

[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 

Último (20)

[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 

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