96

我正在以编程方式添加和删除 AWS IAM 用户策略,并且我从应用这些策略中得到不一致的结果。

例如,这可能会也可能不会成功(我使用的是 Java 1.6.6 SDK):

  1. 从可以读取特定存储桶的用户开始
  2. 清除用户策略(列出策略,然后为每个策略调用“deleteUserPolicy”)
  3. 等到用户没有用户策略(调用“listUserPolicies”,直到它返回一个空集)
  4. 尝试从存储桶中读取(这应该会失败)

如果我在 #3 和 #4 之间放置一个断点并等待几秒钟,则用户无法从存储桶中读取,这是我所期望的。如果我删除断点,用户可以从存储桶中读取,这是错误的。

(当我添加策略然后访问资源时,这也是不一致的)

我想知道策略更改何时对组件(S3、SQS 等)产生影响,而不仅仅是对 IAM 系统产生影响。有什么方法可以从中获得收据或确认吗?或者也许有一定的时间等待?

是否有关于政策应用内部的任何文档?

(仅供参考,我从https://forums.aws.amazon.com/thread.jspa?threadID=140383&tstart=0复制了我的问题)

4

2 回答 2

86

“几乎立即”这个短语在IAM 常见问题解答中使用了 5 次,当然,这有点主观。

由于 AWS 是一个全球分布式系统,因此您的更改必须传播,并且整个系统似乎旨在支持可用性和分区容错性,而不是即时一致性。

我不知道您是否考虑过,但您完全有可能在流程的第 4 步看到一系列通过、失败、通过、通过、失败、失败、失败、失败......因为存储桶和存储桶中的对象实际上都不是一个地方的单一事物,正如 S3 中不同操作的混合一致性模型所证明的那样,其中新对象是立即一致的,而覆盖和删除最终是一致的...因此,策略对存储桶或对象是否“产生影响”的概念并不是一个完全有意义的概念,因为策略的应用本身几乎可以肯定是分布式事件。

为了确认这样的策略应用,AWS 需要公开(至少间接地)询问每个拥有该策略的复制副本的实体以查看它是否具有当前版本的能力......这可能是不切实际的,或者在像 S3 这样庞大的系统中至少可以说是笨拙的,它已经超过了惊人的2 万亿个对象,并且每秒处理超过 110 万个请求的峰值负载

AWS对此论坛帖子的官方回答提供了更多信息:

虽然您对 IAM 实体所做的更改会立即反映在 IAM API 中,但要在全球范围内反映信息可能需要相当长的时间。在大多数情况下,您所做的更改会在不到一分钟的时间内反映出来。网络状况有时可能会增加延迟,并且某些服务可能会缓存某些需要时间过期并被替换的非凭据信息。

在此期间要做什么的随附答案是“再试一次”。

我们建议在初始延迟后重试循环,因为在大多数情况下,您会很快看到您的更改。如果你睡着了,你的代码在大多数情况下会等待太久,并且对于罕见的异常可能还不够长。

我们积极监控复制系统的性能。但是像 S3 一样,我们只保证最终的一致性,而不是任何特定的上限。

于 2013-11-23T01:14:24.477 回答
32

我在这里有一个不那么科学的答案......但我认为它会帮助其他一些人感觉不那么疯狂:)。我一直在想事情没有工作,而他们只是花费了比我预期的更多的时间。

昨晚我添加了一个内联策略以允许主机从系统管理器获取参数。我认为它不起作用,因为更改后的几分钟(可能是 5 分钟左右),我的 CLI 命令仍然失败。然后,他们开始工作。所以,这是一个相当大的延迟。

刚才,我删除了该政策,在我的主机失去访问权限之前,我花了 2-3 分钟(足以用谷歌搜索并阅读其他页面)。

一般来说,事情对我来说也很活泼,但如果你很确定某件事应该有效,但事实并非如此,那就帮自己一个忙,然后等待 10 分钟。不幸的是,这使得 IAM 更改后的自动化听起来比我想象的要难!

于 2019-08-09T13:57:24.300 回答