2017-04-26 17 views
0

我正在評估在平臺中使用Cognito開發人員認證的身份和S3存儲的選項。基本上,我想要做的是爲每個客戶創建一個單獨的S3存儲桶和Cognito身份。在這一點上,我們不需要爲每個用戶單獨使用Cognito身份,我們只使用身份來允許訪問S3存儲。在這種情況下,我們需要支持數百個客戶(如此數百個具有相關Cognito身份的存儲桶)。爲池中的每個Cognito身份提供單個S3存儲桶的最佳方式

我發現了幾個如何使用單個S3存儲桶內的專用文件夾執行此操作的示例(請參閱Example 1Example 2)。我認爲在我們的案例中,對於所有客戶而言,單個存儲桶不會成爲可行的解決方案,原因有很多(其中一個原因是S3 API速率限制顯然與獨特存儲桶相關)。

我試圖創建客戶分區的訪問策略,只允許訪問特定Cognito身份,即

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:DeleteObject", 
     "s3:DeleteObjectVersion", 
     "s3:GetObject", 
     "s3:GetObjectVersion", 
     "s3:PutObject" 
     ], 
     "Resource": [ 
     "arn:aws:s3:::CUSTOMER-BUCKET/*" 
     ], 
     "Principal": { 
     "AWS": "my IAM role for Cognito" 
     }, 
     "Condition": { 
     "StringEquals": { 
      "cognito-identity.amazonaws.com:sub": [ 
      "us-east-1:customer's cognito identity" 
      ] 
     } 
     } 
    } 
    ] 
} 

但S3不承認cognito-identity.amazonaws.com:sub條件。

如果我附上一個類似的政策,以用於Cognito身份池的IAM角色,即是

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:DeleteObject", 
     "s3:DeleteObjectVersion", 
     "s3:GetObject", 
     "s3:GetObjectVersion", 
     "s3:PutObject" 
     ], 
     "Resource": [ 
     "arn:aws:s3:::CUSTOMER-BUCKET/*" 
     ], 
     "Condition": { 
     "StringEquals": { 
      "cognito-identity.amazonaws.com:sub": [ 
      "us-east-1:customer's cognito identity" 
      ] 
     } 
     } 
    } 
    ] 
} 

看來工作,但顯然我必須添加一個策略爲每個標識和鬥組合,這會遇到可添加到單個角色的內聯策略的大小限制(總共10240個字符)。

我在這一點上摸不着頭腦,試圖想出一個可行的方法。任何建議將不勝感激。

回答

1

您絕對應該使用單個存儲桶而不是每個用戶存儲一個存儲桶。甚至不考慮「每桶用戶」策略。

您應該看看使用IAM Policy Variables來創建適用於所有用戶的一個策略。

您可以在S3策略中使用Cognito ID作爲前綴。見S3前綴部分IAM Roles文檔中:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Action": ["s3:ListBucket"], 
     "Effect": "Allow", 
     "Resource": ["arn:aws:s3:::mybucket"], 
     "Condition": {"StringLike": {"s3:prefix": ["${cognito-identity.amazonaws.com:sub}/*"]}} 
    }, 
    { 
     "Action": [ 
     "s3:GetObject", 
     "s3:PutObject" 
     ], 
     "Effect": "Allow", 
     "Resource": ["arn:aws:s3:::mybucket/${cognito-identity.amazonaws.com:sub}/*"] 
    } 
    ] 
} 

然後用戶可以將其同S3桶的子目錄中訪問的對象。

至於關於使用一個桶的擔心,我建議你嘗試一下,然後看看問題是否真的產生。 Amazon S3具有高度的可擴展性,被一些非常大的Web服務所使用,因此它可能會支持您的使用情況。參見:Amazon S3 Request Rate and Performance Considerations

+0

我正在嘗試使用「每桶公司」戰略,而不是每個用戶。每家公司可能有數百個或數千個用戶,但每個公司只有一個Cognito身份。我熟悉S3請求速率和性能考慮因素,這就是爲什麼我想要跨多個存儲區傳播訪問。我確信,共享單個存儲分區的所有用戶在某個時刻都會遇到問題。它不會花費很長時間才能達到每桶100個請求/秒的限制。我想我必須從亞馬遜那裏得到一些關於如何處理這個問題的建議。 – Mike

+0

我建議你試試看,在做一些奇怪的事情之前,避免你可能沒有的問題。像DropBox這樣的公司已經將S3用於更大規模的事情(但我不知道他們的存儲桶設置)。 –

+0

約翰的答案中的例子是Cognito推薦的方法,通過Cognito降低對S3存儲桶的訪問。它可以讓你避免你提到的角色限制。我的第一個建議是嘗試他所說的話,用一個桶。如果你發現這是真正的阻塞,你可能能夠添加額外的屬性到角色中的資源數組? –

相關問題