20

我正在以編程方式添加和刪除AWS IAM用戶策略,並且我得到這些策略應用程序的不一致結果。在AWS IAM策略有效之前應等待多久?

例如,這可能會或可能不會成功(我使用的是Java 1.6.6 SDK):

  1. 開始,可以從特定桶讀
  2. 清除用戶策略用戶(清單政策則要求每一個「deleteUserPolicy」)
  3. 等到用戶沒有用戶策略(稱爲「listUserPolicies」,直到它返回一個空集)
  4. 嘗試從桶閱讀(這應該失敗)

如果我在#3和#4之間放置了一個斷點並等待幾秒鐘,用戶就無法從桶中讀取數據,這正是我所期望的。如果我刪除斷點,用戶可以從桶中讀取,這是錯誤的。

(這也是不一致的,當我添加策略,然後訪問資源)

我想知道什麼時候改變政策已在部件上(S3,SQS等)的影響,不只是在IAM系統上。有沒有辦法從這個收據或確認收到?或者也許有一定的時間等待?

是否有關於政策應用內部的任何文檔?

(FYI我已經複製從https://forums.aws.amazon.com/thread.jspa?threadID=140383&tstart=0我的問題)

回答

24

短語「幾乎立即」在IAM FAQ使用5次,並且,當然,有些主觀。

由於AWS是一個全球分佈式系統,所以您的更改必須傳播,並且整個系統似乎旨在支持可用性和分區容差的即時一致性as opposed to

我不知道你是否考慮過它,但它完全在可能性範圍內,在你的流程的第4步中,你可以看到一系列的通過,失敗,通過,通過,失敗,失敗,失敗,失敗......因爲S3中不同的動作的模型證明了桶中的對象和桶中的對象實際上都不是單一的東西,在S3中不同的動作模型證明了這一點,其中新對象是直接一致的,而覆蓋和刪除最終是一致的......因此,對存儲桶或對象「有效」或不存在的策略概念並不是一個完全有意義的概念,因爲策略的應用本身幾乎可以肯定是一個分佈式事件。

要確認這樣的政策應用,需要AWS公開(至少間接)詢問具有該策略的複製副本的每個實體的能力,以查看其是否具有當前版本......這將在像S3這樣龐大的系統中說至少可以說是不切實際或笨拙的,S3已經超過了令人stag目結舌的2 trillion objects, and serves peak loads in excess of 1.1 million requests per second

官方AWS答案this forum post提供更多信息:

當您對IAM實體的​​變化立即反映在IAM的API,它可以採取明顯的時間才能反映全球的信息。在大多數情況下,您所做的更改反映在不到一分鐘的時間。網絡狀況有時可能增加延遲,並且某些服務可能會緩存某些非憑據信息,這些信息需要一段時間纔會過期並被替換。

隨之而來的答案是「再試一次」。

我們建議在輕微的初始延遲後重試循環,因爲在大多數情況下,您會看到您的更改反映得相當快。如果你睡覺了,在大多數情況下你的代碼將會等待太久,並且可能不足以應對罕見的例外情況。

我們主動監控複製系統的性能。但像S3一樣,我們只保證最終的一致性,而不是任何特定的上限。

+6

我通常會在5或10秒內看到變化。這絕對不是瞬間的,但它不是很慢。 –

+0

感謝您的回覆 - 幸運的是,這是測試代碼,我可以自由地基本拋棄現有的方法,做一些不同的事情。 –