Pages

搜尋此網誌

2014年3月30日 星期日

AWS S3: 設定特定網站直接存取雲端圖片(不使用 accessKey ,secretKey)

AWS S3: 設定特定網站直接存取雲端圖片(不使用 accessKey ,secretKey)

關於 Amazon S3 的申請,可參考下列文章:

一旦申請完成,我們可以透過 Make Public 來使資源可以透過 url 直接存取,一旦設定完成可以使用下列範例網址直接存取而不需要 accessKey 以及 secretKey:

https://s3.amazonaws.com/upload.sample.net/attachment/XXXXXX/111111.jpg

這樣做有什麼好處?既然使用 S3 作為圖片或是檔案的來源,當然希望可以利用 S3 的服務分散網站運作所需資源,特別是圖檔呈現部分,其中包括圖檔 cache 的機制,也將由 S3 進行判斷。

不過若將 S3 存放的檔案設為 public 看來是最快的方式,卻令資源暴露在網際網路之中,有沒有更折衷的方式,只允許目標網站可以以不透過 accessKey 以及 secretKey 進行存取,單純透過 url?答案是可以的,首先點選 Edit bucket polocy,如下圖:

enter image description here

點選之後會跳出定義 bucket polocy 視窗,我們可以填入下列 json 格式:

{
    "Version": "2012-10-17",
    "Id": "S3PolicyId1",
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::upload.net/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "192.168.0. 1/24"
                }
            }
        },
        {
            "Sid": "Allow get requests originated from sample.net",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::upload.sample.net/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": [
                        "http://sample.net/*",
                        "http://dev.sample.net:8080/*",
                        "http://www.sample.net/*"
                    ]
                }
            }
        }
    ]
}

上述設定檔中,定義 aws:SourceIp 可以讓我們在主機上操作 S3 而不需要 accessKey 以及 secretKey,舉例來說可以透過如同 wget https://s3.amazonaws.com/upload.sample.net/attachment/XXXXXX/111111.jpg 來取得資源。

定義 aws:Referer 的話,則可以指定特定的 domain 才可以進行資源的存取,也就是說一旦使用者瀏覽 www.sample.net 這個網站時,則該瀏覽器在讀取圖檔時傳送目前所屬網址資訊(refer 屬性),則圖檔就可以直接透過 url 向 S3 取得檔案資源。

當然這些 polocy 變化百百種我們可以參考 aws 提供的範例進行修改:Example Cases for Amazon S3 Bucket Policies

結論

透過上述的設定,可以帶來的好處:

  1. S3 分散了資源載入所需系統效能,還有頻寬
  2. 判斷是否重新取得(http starus 200) 或是沒有變動使用快取(http starus 304) 交由 S3 判斷,自行開發的服務不需實作。
  3. 安全性與方便度兼具,可以直接透過 url 存取,又不致於暴露在網際網路之中,透過定義 polocy 指定特定的 domain 可以直接存取支援

經由這次對 S3 操作上的了解,若想要製作網站靜態資源的快取機制,也就不是難事,下一篇在說明如何自行開發快取機制。

張貼留言