我正在評估在平臺中使用Cognito開發人員認證的身份和S3存儲的選項。基本上,我想要做的是爲每個客戶創建一個單獨的S3存儲桶和Cognito身份。在這一點上,我們不需要爲每個用戶單獨使用Cognito身份,我們只使用身份來允許訪問S3存儲。在這種情況下,我們需要支持數百個客戶(如此數百個具有相關Cognito身份的存儲桶)。爲池中的每個Cognito身份提供單個S3存儲桶的最佳方式
我發現了幾個如何使用單個S3存儲桶內的專用文件夾執行此操作的示例(請參閱Example 1和Example 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個字符)。
我在這一點上摸不着頭腦,試圖想出一個可行的方法。任何建議將不勝感激。
我正在嘗試使用「每桶公司」戰略,而不是每個用戶。每家公司可能有數百個或數千個用戶,但每個公司只有一個Cognito身份。我熟悉S3請求速率和性能考慮因素,這就是爲什麼我想要跨多個存儲區傳播訪問。我確信,共享單個存儲分區的所有用戶在某個時刻都會遇到問題。它不會花費很長時間才能達到每桶100個請求/秒的限制。我想我必須從亞馬遜那裏得到一些關於如何處理這個問題的建議。 – Mike
我建議你試試看,在做一些奇怪的事情之前,避免你可能沒有的問題。像DropBox這樣的公司已經將S3用於更大規模的事情(但我不知道他們的存儲桶設置)。 –
約翰的答案中的例子是Cognito推薦的方法,通過Cognito降低對S3存儲桶的訪問。它可以讓你避免你提到的角色限制。我的第一個建議是嘗試他所說的話,用一個桶。如果你發現這是真正的阻塞,你可能能夠添加額外的屬性到角色中的資源數組? –