如何使用Python aws_cdk.cx_api构建CDK Cloud Assembly
问题根因
- 第一个类型匹配错误:
Python版CloudAssemblyBuilder.add_artifact的参数结构和TS版不同:TS的addArtifact直接接收完整的ArtifactManifest对象,而Python版是将manifest的各个属性拆分为独立参数。你之前错误地将整个ArtifactManifest对象传入了properties参数,同时手动指定了错误的ASSET_MANIFEST类型(原栈是CloudFormation栈类型,和资产清单类型不匹配),导致类型校验失败。 - 第二个栈溢出错误:
Stack Assembly对象内部包含指向父级Cloud Assembly的反向引用,跨语言序列化的jsii层处理循环引用时触发无限递归,最终栈溢出,因此不能直接将整个Stack Assembly对象作为参数传入。
修正后的代码
import os import subprocess import aws_cdk.cx_api as cxapi import aws_cdk.cloud_assembly_schema as cxschema class MyClass(): # 修正方法缩进、补全入参 def synth(self, original_stack_name, TEMP_OUT): ASSEMBLY_PATH = 'igor_cdk' result = subprocess.run(['cdk', 'synth', '-o', ASSEMBLY_PATH], stdout=subprocess.PIPE) my_stuff = result.stdout.decode('utf-8') new_stack_name = original_stack_name + TEMP_OUT print(new_stack_name) cloud_assembly = cxapi.CloudAssembly(ASSEMBLY_PATH) orig_stack_assembly = cloud_assembly.get_stack_by_name(original_stack_name) logical_Ids = orig_stack_assembly.find_metadata_by_type("aws:cdk:logicalId") cab = cxapi.CloudAssemblyBuilder(ASSEMBLY_PATH) orig_manifest = orig_stack_assembly.manifest # 拆分manifest属性逐个传入,不手动指定错误类型 cab.add_artifact( id=new_stack_name, type=orig_manifest.type, properties=orig_manifest.properties, metadata=orig_manifest.metadata, dependencies=orig_manifest.dependencies ) # 补全汇编构建步骤,对应TS版的cab.buildAssembly() final_assembly = cab.build_assembly() return final_assembly.get_stack_by_name(new_stack_name)
额外说明
如果需要修改栈的配置,直接修改orig_manifest.properties内的对应字段再传入即可,比如修改模板路径可以调整template_file属性。如果你的需求确实是生成资产清单而非CloudFormation栈,则需要自行构造符合AssetManifestProperties结构的对象传入properties参数,不可直接复用栈的manifest属性。
内容的提问来源于stack exchange,提问作者Balkyto
相关产品推荐
相关产品推荐

