我在AWS IAM的应用程序中面临一种奇怪的行为,即自动创建用户和角色。
我的操作顺序是:
CreateUser
; CreateAccessKey
; GetUser
以获取帐户ID。我需要这样做,因为我只有root密钥和秘密; CreateRole
发送操作AssumeRolePolicyDocument
,其中Principal是此创建的用户。执行第4步时,我会收到MalformedPolicyDocument
(Invalid principal in policy: "AWS":"arn:aws:iam::123412341234:user/newuser"
)。
但是,如果在第4步之前我延迟了15秒,那么它运行没有任何问题。
是否有任何工作流程我不需要坚持使用固定延迟,例如阅读一些IAM Web服务以检查用户是否已准备好使用?
答案 0 :(得分:3)
正如我对Deterministically creating and tagging EC2 instances的回答所述,AWS API通常只需视为eventually consistent。
具体来说,我提到假设每个单独的API动作完全由AWS 独立运作是合理的,即它本身就是微服务。这解释了为什么即使在Amazon EC2或您的AWS Identity and Access Management (IAM)等服务中,对一个导致资源状态更改的API操作的调用也不一定对其中的(所有)其他API操作可见。该服务正好 - 这正是您所经历的,即使创建的用户已经可以看到其他IAM API GetUser
之一,但对于不同的IAM API操作{{1}尚不可见}。
解决此固有特性的正确工作流程是使用Exponential backoff策略重复所需的API调用,直到成功(或达到配置的超时),这在异步通信方案中无论如何都是好的做法。多个AWS SDKs同时为指数支持的重试提供集成支持,通常透明地应用,但是如果需要,可以根据具体情况进行定制,例如:为非常高延迟的场景等扩展任何默认超时。