2013年2月27日 星期三

筆記:Python 使用 Boto 將照片上傳至 S3 (加上存取限制)

Basic

前一陣子在實作一個供使用者上傳照片的功能
想當然爾,現在應該比較不流行自己 Host 這些照片
於是我使用了 Amazon S3 的服務來解決這個問題
  1. 想單純玩看看 S3, Amazon 本身的 AWS Management Console 就很好用了,支援上傳、下載、設定權限 …
  2. 想在 Command Line 的環境下玩 S3,s3cmd 是一個方便的工具,推薦一玩 …
  3. 至於我的需求,是使用 Python 自動化地完成上傳照片的工作,因此 boto 成為了我的首選,使用方式就請直接參考文件吧: An Introduction to boto’s S3 interface

若是要用 2. 3. 的方式,記得產生 AWS access key and AWS secret key 即可
以上講的內容都沒什麼特別的(若無其事的吐槽自己?)

Public vs. Private

Boto 提供了一些包好的 function, 能使用 Access Control List (ACL) 的存取機制來管理 S3 上的檔案
有需要使用的朋友可以自行參閱 Boto 的 文件

補充說明一下,AWS Management Console 介面所提供便捷的檔案「權限設定
其實背後也是用 ACL 的機制來管理檔案

對我而言,我想要實作的功能是:「將照片傳到 S3 後,設為公開,不接受外連」
因此,我先透過 AWS Management Console 將整個 bucket 設為公開:
-> 點選 Properties -> 選擇要公開的 bucket -> 按下 Add more permissions 
-> 新增 Everyone 使用者 -> 勾選 List (Read) 的權限
接著,接著繼續操作:
#使用 Amazon S3 Bucket Policy 的存取機制來設定外連的限制
-> 點選 Edit bucket policy -> 填入以下範例(需修改)
{
  "Version":"2008-10-17",
  "Id":"http referer policy example",
  "Statement":[
    {
      "Sid":"Allow get requests referred by www.mysite.com and mysite.com",
      "Effect":"Allow",
      "Principal":"*",
      "Action":"s3:GetObject",
      "Resource":"arn:aws:s3:::example-bucket/*",
      "Condition":{
        "StringLike":{
          "aws:Referer":[
            "http://www.mysite.com/*",
            "http://mysite.com/*"
          ]
        }
      }
    }
  ]
}
範例來自 官方菜單

如此一來,簡單的上傳與基本版防外連功能就完成了!
補充:記得上傳時幫照片設一下 meta data,諸如 cache-control 之類的屬性,以節省開銷 XD

2 則留言:

  1. 您好: 能否就 boto 相關心得,到 PyCon Taiwan 投成演講呢? (google 搜 tw.pycon)

    回覆刪除
    回覆
    1. 其實我也是這次 pycon 的志工 XDDD


      前幾天 Keith 寄信向我噓寒問暖時,也有順便催稿 ...
      對於 boto 其實我不太熟,要以此為講題有點勉強
      由於本月月底我可能會在 Taipei.py 分享使用 bottle web framework 的經驗
      因此我偏好趁著本週週末整理資料時
      再來評估這些經驗是不是能夠投個閃電秀、或是常規的演講


      一起加油!Go!

      刪除