我不确定你为什么要修改 cdk.json。你不应该修改它。
我认为你混合了几个概念。让我们首先从 CDK 开始。CDK 可分为 3 个主要组件(Apps、Stacks 和 Constructs)。
应用程序是主要组件,可以将其视为 java 类的主要组件。这是应用程序的入口点,将处理应用程序内所有堆栈的创建。
接下来我们有一个堆栈,这被认为是一个范围内的一组元素。堆栈中的所有内容都被视为一个单元。一个很好的例子是管道的可视化。您可以在带有 Beta 堆栈和 Prod 堆栈的管道中使用。这可能会变得更加复杂,具体取决于您的配置方式。您可以将 Alpha、Beta、Gamma、Prod 作为不同阶段的一部分,但也可以将 NA、EU、CN 和 FE 作为您所在区域的一部分,并在此基础上创建很多组合。
最后但并非最不重要的一点是,我们有 Construct,construct 应该包含作为应用程序一部分所需的 aws 资源。有些可以像创建 S3 存储桶一样简单,而另一些可以像创建和 S3 存储桶一样复杂,它向主题发布通知,并且只允许某些人读取和写入存储桶(S3 策略)。
import { App, Stack, StackProps } from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
class HelloCdkStack extends Stack {
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props);
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true
});
}
}
const app = new App();
new HelloCdkStack(app, "HelloCdkStack");
使用上面的例子。我们正在创建一个只有 1 个堆栈的应用程序,在这种情况下,S3 是一个构造。
我没有关于 grafana-loki 的上下文,所以我假设它们是您想要单独使用的 2 个组件。在您的示例中,您想要创建一个具有 2 个不同服务/结构的应用程序(我不建议这样做,因为每次您需要部署这两个服务时都会同时部署,如果您配置不正确,两者都将无法部署) . 一种结构是 Grafana,另一种是 Loki,每个结构都有一个使用不同端口的 ecs 组件。
那么您将如何应用程序来处理上述内容。您将需要创建 2 个构造。一个给 Grafana,另一个给 Loki。此构造将由您的堆栈调用,因此它可以创建每个构造的资源,然后合成它们。
class GrafanaConstruct extends Construct {
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props);
// Create Fargate component
}
}
class LokiConstruct extends Construct {
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props);
// Create Fargate component
}
}
class GrafranaAndLokiCdkStack extends Stack {
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props);
new LokiConstruct(this, "LokiConstruct", props);
new GrafanaConstruct(this, "GrafanaConstruct", props);
}
}
const app = new App();
new GrafranaAndLokiCdkStack(app, "GrafranaAndLokiCdkStack");
app.synth();