SlideShare a Scribd company logo
1 of 23
Download to read offline
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

More Related Content

What's hot

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
 

What's hot (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 to 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 to 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
 

More from 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
 

More from 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+が提供する運用・保守サービス
 

Recently uploaded

Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
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 2024The Digital Insurer
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
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 CVKhem
 
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?Igalia
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
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 Processorsdebabhi2
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
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 productivityPrincipled Technologies
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
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 RobisonAnna Loughnan Colquhoun
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
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 2024The Digital Insurer
 

Recently uploaded (20)

Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
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
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
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
 
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?
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
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
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
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
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
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
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
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
 

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