AWS CDK创建IAM角色信任关系策略差异及实现方案咨询
问题1:两个信任策略的实际生效效果是否存在差异?
存在显著差异:
- 预期策略中,账号
<ABC>的根用户扮演角色时必须传入匹配的<ID>作为sts:ExternalId,账号<XYZ>的根用户扮演角色无需校验ExternalId。 - 实际生成的策略将两个账号合并到同一条Statement中,Condition对本条Statement内所有Principal生效,意味着两个账号扮演角色时都必须传入正确的ExternalId,
<XYZ>账号无需校验的逻辑完全失效。
问题2:如何调整CDK代码生成符合预期的信任策略?
你原有代码存在两处错误:
withConditions方法不会修改原Principal实例,而是返回一个添加了条件的新Principal实例,你没有承接返回值导致条件配置未生效。Role构造函数传入的externalIds参数是全局配置,会给所有信任实体统一添加ExternalId校验规则,导致两个账号被合并到同一条Statement、统一应用校验规则。
调整后的代码如下:
// XYZ账号:无需ExternalId校验 const xyzPrincipal = new AccountPrincipal('<XYZ>'); // ABC账号:需校验ExternalId,承接withConditions返回的新实例 const abcPrincipal = new AccountPrincipal('<ABC>').withConditions({ StringEquals: { "sts:ExternalId": "<ID>" } }); const role1 = new Role(this, 'role1', { roleName: "role1", description: "some description", // 传入两个独立配置的Principal,CDK会自动生成两条独立的Statement assumedBy: new CompositePrincipal(xyzPrincipal, abcPrincipal) // 删除全局externalIds配置 });
调整后CDK会为两个Principal分别生成独立的Statement,和你预期的策略结构、逻辑完全一致。
内容的提问来源于stack exchange,提问作者Anoop Kumar
相关产品推荐
相关产品推荐

