Hank Lin

A new blog

開始用S3

| Comments

S3是什麼?

Amazon Simple Storage Service(S3) 是Amazon Web Service (AWS) 裡最早開始的服務之一. 雖然名字裡有一個Simple, 但是S3卻是一點也不簡單的服務! S3讓你任意的從internet上儲存, 讀取資料, 不用擔心硬碟爆掉, 還有server掛掉的問題. 簡單介紹完, 馬上來看看怎麼開始用S3.

申請AWS 帳號

因為這是有關AWS的第一篇文章, 所以我先走一次申請AWS的流程囉. 先到 http://aws.amazon.com/ , 點選 “Sign up for a free Amazon Web Services Account”. 你應該已經有Amazon的帳號了吧? 蝦米? 還沒有? 趕快建立一個吧! 如果是公司要用的就建立一個公司的帳號吧! 有Amazon帳號就打密碼, 再按”Sign in using our secure server”. 現在可以到 http://aws.amazon.com/s3 的網頁了, 再點選 “Sign Up For Amazon S3”, 這一頁就是要你填信用卡資料而已啦,  我知道你也是個無怨無悔為公司奉獻的員工, 但是也不要填入你的卡號啊! 公司應該有信用卡吧, 沒有的話趕快去生一張咩!

取得Keys

使用S3需要Access Key ID 及 Secret Access Key. 連到http://aws.amazon.com/, 選”Account”, 再選”Security Credentials”, 在”Access Key” 的tab那邊, 就可以看到你的這兩個key啦! secret access key 一定要安全的保管, access key id 則是用來辦別你是用哪一個secret access key的, 所以比較沒有關係.

選擇client

因為是在雲端裡, AWS的服務都有提供SOAP和REST兩種界面. 所以S3的client真是百百種啊! 好用不好用真的參差不齊, 以下是我的經驗囉!

  • S3fox 是firefox plugin, 有firefox就可以用, 方便你用GUI去操作, 最快上手.
  • jets3 用java寫的. 有API 也有GUI. 有完整實作S3的功能, 可是我嫌它有點肥, 好像java的library常常會這樣吼.
  • s3sync 用ruby寫的. 是我最常用的啦! 因為在shell 裡有時要傳個檔案還是懶得開GUI, 直接打指令就可以了, 好像很久沒更新了, 不過好用就好.
  • jclouds 也是用java寫的. 這套API是我覺得寫得最棒的! 但是這個project還很新, 很多文件都沒有, 所以我還在密切注意中!

至於我在開發的時候, 是用自己寫的library去使用S3 REST的界面啦, 因為我覺得java 的S3 library都不是很好用吔. 也許以後jclouds更成熟, 我就會改用他囉! 以下我就用最常用的s3sync來示範啦(其實是我懶得抓圖啦!). 先下載s3sync:

$ wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz
$ tar zxf s3sync.tar.gz
$ cd s3sync
$ mv s3config.yml.example s3config.yml

編輯s3config.yml

$ vim s3config.yml

把前兩個改成你的access key 和secret access key囉, 第3個砍掉就可以了!

aws_access_key_id: 11111111111111111111111
aws_secret_access_key: 222222222222222222222
ssl_cert_dir: /home/user/s3sync/certs

然後看一下README.txt 囉! 主要是告訴s3sync去哪裡找到設定, 我都是用:

$ export S3CONF=$我的s3sync安裝目錄

當然要有ruby啦! 沒有的話就裝一下咩!

$ sudo apt-get install ruby ruby1.8 libruby1.8 libopenssl-ruby libopenssl-ruby1.8

操作buckets

S3的兩個組成就是bucket和object. bucket就是S3裡面的最上層分類, 所有的objects 都是放在bucket裡, 一個bucket 可以放無限個objects, bucket name 在S3裡是唯一的. 一個帳號可以建立100個buckets, 不過相信我, 你不需要那麼多, 多了反而難管理. 一般來說就是以每一個application/domain 開一個bucket就夠了. bucket name 的限制是:

  • 3 ~ 255 個字, 可包含英文字母, 數字, periods(.), dashes(-), underscores(_)
  • 要數字或字母開頭
  • 不可長得像IP (192.168.1.1)

但是為了virtual hosting 的功能, 最好是符合以下的額外條件:

  • 3 ~ 63 個字, 可包含小寫字母,數字, periods(.), dashes(-)
  • 不可dashes(-)結尾, eg: test-
  • 不可兩個periods(.)相連, eg: test..test
  • 不可periods(.)和橫線(-)相連, eg: test-.test , test.-test

virtual hosting可以很方便的access你的object, 例如我有一個bucket叫mysecret, 裡面有一個object 叫good.avi, 那這個object的URL就是

http://mysecret.s3.amazonaws.com/good.avi

或是用SSL的

https://mysecret.s3.amazonaws.com/good.avi

如果bucket name 不符合virtual hosting 的要求就只能用下面這種URL囉!

http://s3.amazonaws.com/my(秘)/good.avi

如果你很有分享的精神的話, 把good.avi設成public read, 那我可以在browser 直接打上面的URL去讀取到, 很方便的. 和bucket有關的還有location, access control, DNS caching, redirection等議題, 以後再討論囉! 現在來建立bucket了:

$ ./s3cmd.rb createbucket mysecret

如果你得到409 Conflict, 那就是這個bucket name已被別人用囉, 再想一個吧!

看看自己有哪些buckets:

$ ./s3cmd.rb listbuckets

看看mysecret裡有什麼objects?

$ ./s3cmd.rb list mysecret

關於listing objects 這個也是可以搞得很複雜啊! 以後再討論囉!

操作objects

object是用key 去識別的. object key在bucket裡不重覆就可以了, object key就不像bucket name有那麼多限制了, 可以是1 ~ 1024個UTF-8字元, 但是為了管理和使用上的方便, 取名就是一門藝術了, 這個議題也先擱著. object value就是你存的東西, 大小限制是 5 GB. (不錯吧! 剛好可以讓你放一整張DVD). 和object有關的還有key listing, metadata, 和access control等議題, 也是以後再討論囉. 現在該傳些好的東西和好朋友分享了.

$ ./s3cmd.rb put mysecret:good.avi /pathto/good.avi Content-Type:video/avi x-amz-acl:public-read

因為bucket和object 預設都是private 所以要特別說我要public read, 而為了日後自己的方便, Content-Type最好自己加上去, Content-Length則是s3sync會幫你加, 這在你只想偷窺(peek)一下這個物件是什麼的時候很好用, 而不用整個拿下來.

現在, 可以打開你最愛的browser, 打入網址:

http://mysecret.s3.amazonaws.com/good.avi

登登! 可以看到了! 但是怕被人發現, 還是砍掉吧!

$ ./s3cmd.rb delete mysecret:good.avi

bucket也一並砍掉重綀了, 反正只是先玩玩. bucket裡面有object的話要先砍光, 否則會失敗哦!

$ ./s3cmd.rb deletebucket mysecret

結語

你可能會說S3有什麼了不起? 有很多on-line storage services啊! 是沒錯, 但是跟其他付費的on-line storage比較的話:

  • S3有SLA, 比較可靠.
  • S3的下載速度還不錯. 如果從EC2讀取又更快了, 數據以後再整理上來.
  • 一個object 大小可以到5GB
  • 有unique URL可以直接access! 打死一堆storage services. 而且這URL還可以自定的.
  • 可以用Cloud Front 加快client下載的速度.
  • 有開放低階的REST, SOAP, 也有許多程式語言的API, GUI可用
  • 有支援BT下載, 但我沒試過

當然也不是沒有缺點啦, 最大的當然就是要花$囉! S3適合放靜態檔案, 像是圖檔, 影片檔(怎麼都是宅男的最愛), js/css/html也是不錯, 但是要處理版本的問題. 大的檔案, 文件等等都適合. 一些常改的資料就不要放在S3了, 一直讀讀寫寫效率是很差的. 善用S3的話可以解決很多資料存取的問題.