您可以将属性添加到您的 CDK 堆栈并在其他堆栈中引用这些属性。每个 CloudFormation 堆栈在幕后创建 outputs 和 parameters。 (这可能并不总是理想的,因为我的特定用例使重构和更新应用程序变得更加困难。)
// Pipeline contains an ECR repository we'd like to reference elsewhere
public class PipelineStack : Stack
{
public IRepository EcrRepository { get; }
public PipelineStack(Construct parent, string id, IPipelineStackProps props)
: base(parent, id, props)
{
EcrRepository = new Repository(
this,
"EcrRepository",
new RepositoryProps
{
// props
});
// rest of stack...
}
}
// Given IApiStackProps similar to:
public interface IApiStackProps : IStackProps
{
IRepository Repository { get; }
}
// Now we'd like to load an ECR task found in that referenced repository
public class ApiStack : Stack
{
public ApiStack(Construct parent, string id, IApiStackProps props)
: base(parent, id, props)
{
var repo = Repository.FromRepositoryName(
this,
"EcrRepository",
props.Repository.RepositoryName);
var container = new ContainerDefinition(
this,
"ApiContainer",
new ContainerDefinitionProps
{
TaskDefinition = taskDef,
Image = ContainerImage.FromEcrRepository(repo, imageTag.ValueAsString),
});
// rest of stack...
}
}
这允许您创建两个堆栈,非常简单地共享资源:
var app = new App(new AppProps());
var pipelineStack = new PipelineStack(app, "ExamplePipeline", new PipelineStackProps
{
// some props...
});
new ApiStack(app, apiStackName, new ApiStackProps
{
Repository = pipelineStack.EcrRepository,
});
这导致我创建了一系列堆栈,如下图所示,最顶层的堆栈需要来自下方的资源:
出于上述原因,根据个人经验,我建议远离过多的堆栈间依赖项。在可能的情况下,将“共享”或引用的资源移动到您可以扩展的基本堆栈中(.NET's Lazy<T> 使得仅在访问时创建资源变得容易)。使用这种共享基础方法,堆栈的数量可能会减少,并允许更轻松的长期支持和更新:
不幸的是,我没有关于第二种方法的良好公开示例,但是,上面的代码 sn-ps 来自我的 ECS CDK example repo,它在堆栈之间共享很多。