You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS CDK创建CloudFormation模板报错:Trying to resolve() a Construct

问题根因

报错的直接触发原因是你将CfnJson构造实例本身直接传入了OpenIdConnectPrincipal的条件参数中。CDK在合成CloudFormation模板的解析阶段,仅支持将基础数据类型、Token、IResolvable实例嵌入资源属性,CfnJson本身是一个CDK Construct(资源构造对象),不属于可直接序列化到JSON策略的值类型,解析器尝试将Construct对象转为策略字段值时直接抛出解析错误。
另外你的代码存在冗余逻辑:创建Role时传入assumedBy参数后,CDK会自动生成对应的角色信任策略语句,你后续手动再添加一条完全相同的sts:AssumeRoleWithWebIdentity权限语句,会导致最终生成的信任策略出现重复条目,属于无效代码。

修复方案
  1. 传入条件配置时,不要直接传递CfnJson实例,改为调用condition.getValue()获取CfnJson值的可解析Token引用,该引用可以被CDK正确识别并嵌入到策略文档中。
  2. 删除后续手动添加重复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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 02:46:12