我在AWS IAM的应用程序中面临一种奇怪的行为,以自动创建用户和角色。
我的操作顺序是:
- 发送操作
CreateUser
; - 为此创建的用户发送操作
CreateAccessKey
; - 为此创建的用户发送操作
GetUser
以获取帐户 ID。我需要这样做,因为我只有根密钥和秘密; - 发送一个操作
CreateRole
,其中主体是此创建的用户AssumeRolePolicyDocument
。
当我执行步骤 4 时,我收到一个MalformedPolicyDocument
( Invalid principal in policy: "AWS":"arn:aws:iam::123412341234:user/newuser"
)。
但是,如果在步骤 4 之前我放置了 15 秒的延迟,它会毫无问题地运行。
是否有任何工作流程不需要坚持固定延迟,例如阅读一些 IAM 网络服务以检查用户是否已准备好使用?
正如我在确定性创建和标记 EC2 实例的回答中所述,AWS API 通常仅需要被视为最终一致性。
具体来说,我提到,假设每个 API 操作都完全由 AWS 独立运行是合理的,即它本身就是一个微服务。这就解释了为什么即使在 Amazon EC2 等服务中,或者在您的案例中 AWS 身份和访问管理 (IAM),对导致资源状态更改的一个 API 操作的调用不一定立即对该服务中的(所有其他)其他 API 操作可见 - 这正是您正在经历的,即即使创建的用户已经对其他 IAM API 之一可见GetUser
, 对于其他 IAM API 操作CreateRole
尚不可见。
解决此固有特征的正确工作流是使用指数退避策略重复所需的 API 调用,直到成功(或达到配置的超时),这在异步通信方案中无论如何都是很好的做法。同时,一些 AWS 开发工具包通过指数级支持提供对重试的集成支持,这通常是透明地应用的,但如果需要,可以针对特定场景进行定制,例如,为非常高延迟的情况延长任何默认超时等。