我可以在同一个 CDK 部署代码中为 Loki 和 Grafana 创建 2 个或更多 ECS 任务吗?

Can I create 2 or more ECS task in the same CDK deploy code for Loki and Grafana?

我是使用打字稿的 AWS CDK 新手。我想知道我可以在同一个 CDK 部署代码中创建 2 个或更多 ECS 任务,还是我需要为每个创建单独的应用程序代码和不同的 ECS 任务?

此外,关于 Loki 和 Grafana 的任何想法是它们应该在同一个 ecs 任务中还是不同,或者如果我为每个创建 2 个单独的 ecs 任务都没关系?因为我将使用常见的 ALB,它分别在端口 3100 和 3000 上对 Loki 和 Grafana 具有不同的侦听器规则。

我的CDK.json

我收到以下错误:

Parse error on line 192:
... }      }    }  }],[ {  "appGrafan
--------------------^
Expecting '}', ',', got ']'

试过这个:

但仍然出现错误:

Parse error on line 190:
...     }    }  }, {"appGrafana": "npx 
-------------------^
Expecting 'STRING', got '{'

此外,在 IDE 中尝试过:

ashishkarpe in ~/code/docker-loki/deploy/cdk on branch pre > cdk ls
cdk.json: Unexpected token ; in JSON at position 5660
ashishkarpe in ~/code/docker-loki/deploy/cdk on branch pre > cdk diff
cdk.json: Unexpected token ; in JSON at position 5660
ashishkarpe in ~/code/docker-loki/deploy/cdk on branch pre > 

我不确定你为什么要修改 cdk.json。你不应该修改它。

我认为您混淆了几个概念。让我们首先从 CDK 开始。 CDK 可分为 3 个主要组件(Apps、Stacks 和 Constructs)。

Apps 是主要组件,从 java class 考虑它是主要组件。这是您的应用程序的入口点,将处理您应用程序内所有堆栈的创建。

接下来我们有一个堆栈,这被认为是一个范围内的一组元素。堆栈中的所有内容都被视为一个单元。一个很好的例子是管道的可视化。您可以在具有 Beta 堆栈和 Prod 堆栈的管道中。这可能会变得更加复杂,具体取决于您的配置方式。您可以将 Alpha、Beta、Gamma、Prod 作为不同阶段的一部分,但也可以将 NA、EU、CN 和 FE 作为您所在区域的一部分,并基于此创建很多组合。

最后但并非最不重要的一点是我们有构造,构造应包含您作为应用程序的一部分所需的 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 个不同 services/constructs 的应用程序(我不建议这样做,因为每次您需要部署这两个服务时都会同时部署,如果您配置不正确,两者都将失败部署)。一种结构是 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();