AWS CDK创建CloudFormation模板报错:Trying to resolve() a Construct
问题根因
报错的直接触发原因是你将CfnJson构造实例本身直接传入了OpenIdConnectPrincipal的条件参数中。CDK在合成CloudFormation模板的解析阶段,仅支持将基础数据类型、Token、IResolvable实例嵌入资源属性,CfnJson本身是一个CDK Construct(资源构造对象),不属于可直接序列化到JSON策略的值类型,解析器尝试将Construct对象转为策略字段值时直接抛出解析错误。
另外你的代码存在冗余逻辑:创建Role时传入assumedBy参数后,CDK会自动生成对应的角色信任策略语句,你后续手动再添加一条完全相同的sts:AssumeRoleWithWebIdentity权限语句,会导致最终生成的信任策略出现重复条目,属于无效代码。
修复方案
- 传入条件配置时,不要直接传递
CfnJson实例,改为调用condition.getValue()获取CfnJson值的可解析Token引用,该引用可以被CDK正确识别并嵌入到策略文档中。 - 删除后续手动添加重复
assumeRolePolicy的冗余代码,避免生成重复的策略语句。
修复后的完整代码如下:
public class TestStack extends Stack { public TestStack(Construct parent) { super(parent, "test-stack"); String url = "https://my-provider-domain.s3.eu-central-1.amazonaws.com"; List<String> serviceAccounts = List.of("system:serviceaccount:account1", "system:serviceaccount:account2"); String providerId = url.replace("https://", ""); OpenIdConnectProvider provider = new OpenIdConnectProvider(this, providerId, OpenIdConnectProviderProps.builder() .url(url) .clientIds(List.of("sts.amazonaws.com")) .build()); CfnJson condition = new CfnJson(this, Names.uniqueId(provider) + "sub", CfnJsonProps.builder() .value(Map.of(provider.getOpenIdConnectProviderIssuer() + ":sub", serviceAccounts)) .build()); OpenIdConnectPrincipal principal = new OpenIdConnectPrincipal(provider, Map.of( "ForAnyValue:StringEquals", condition.getValue() )); Role role = new Role(this, "logshipperRole", RoleProps.builder() .assumedBy(principal) .build()); } }
修复后执行cdk synth即可正常合成模板,生成的IAM角色信任策略和你预期的规则完全一致。
内容的提问来源于stack exchange,提问作者Isabelle R.
相关产品推荐
相关产品推荐

