我想使用Fargate运行两个容器-一个用于主项目的后端,另一个用于数据库(MongoDB)。 GitHub存储库中的The basic example展示了如何使用CDK在Fargate上运行单个容器,但是我仍然遇到2个问题:
我已经弄清楚了如何(类似于)解决第一个问题,类似于实现ecs.LoadBalancedFargateService
的方式,但是第二个问题仍然存在。
作为参考,这是我到目前为止在stack.ts
中所拥有的(其余是cdk init app --language typescript
为您生成的基本样板):
import cdk = require("@aws-cdk/cdk");
import ec2 = require("@aws-cdk/aws-ec2");
import ecs = require("@aws-cdk/aws-ecs");
import elbv2 = require("@aws-cdk/aws-elasticloadbalancingv2");
const {ApplicationProtocol} = elbv2;
export class AppStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Create VPC and Fargate Cluster
const vpc = new ec2.VpcNetwork(this, "FargateVPC", {
maxAZs: 2
});
const cluster = new ecs.Cluster(this, "Cluster", {vpc});
// Create task definition
const fargateTaskDefinition = new ecs.FargateTaskDefinition(this, "FargateTaskDef", {
memoryMiB: "512",
cpu: "256"
});
// Create container from local `Dockerfile`
const appContainer = fargateTaskDefinition.addContainer("Container", {
image: ecs.ContainerImage.fromAsset(this, "Image", {
directory: ".."
})
});
// Set port mapping
appContainer.addPortMappings({
containerPort: 5000
});
// Create container from DockerHub image
const mongoContainer = fargateTaskDefinition.addContainer("MongoContainer", {
image: ecs.ContainerImage.fromDockerHub("mongo")
});
// Set port mapping
mongoContainer.addPortMappings({
containerPort: 27017
});
// Create service
const service = new ecs.FargateService(this, "Service", {
cluster,
taskDefinition: fargateTaskDefinition,
desiredCount: 2
});
// Configure task auto-scaling
const scaling = service.autoScaleTaskCount({
maxCapacity: 5
});
scaling.scaleOnCpuUtilization("CpuScaling", {
targetUtilizationPercent: 70
});
// Create service with built-in load balancer
const loadBalancer = new elbv2.ApplicationLoadBalancer(this, "AppLB", {
vpc,
internetFacing: true
});
// Allow incoming connections
loadBalancer.connections.allowFromAnyIPv4(new ec2.TcpPort(5000), "Allow inbound HTTP");
// Create a listener and listen to incoming requests
const listener = loadBalancer.addListener("Listener", {
port: 5000,
protocol: ApplicationProtocol.Http
});
listener.addTargets("ServiceTarget", {
port: 5000,
protocol: ApplicationProtocol.Http,
targets: [service]
});
// Output the DNS where you can access your service
new cdk.Output(this, "LoadBalancerDNS", {
value: loadBalancer.dnsName
});
}
}
谢谢。
答案 0 :(得分:1)
通常,不建议在Fargate容器中运行数据库,因为当前还没有很好的持久数据解决方案。您可以 集成一个挂钩,该挂钩可以在任务停止之前将数据复制到S3之类的东西中,但是通常这类解决方案非常脆弱,因此不建议使用。
您可能想签出DocumentDB来代替运行自己的MongoDB实例,尽管CDK中对DocumentDB构造的支持尚未完全充实。
另一种替代方法是运行常规ECS任务,并在您的EC2实例上附加一个EBS卷。然后,您可以使用docker卷将EBS卷挂载到您的容器。使用这种方法,您需要标记实例元数据并使用ECS放置约束,以确保您的任务放置在已附加EBS卷的实例上。
如果这两种方法都适合您,请随时在CDK repository上打开功能请求。希望这会有所帮助!
答案 1 :(得分:0)
AWS Fargate是否有硬性要求?
如果没有,您可以选择简单的ECS + Ec2,它supports使用持久数据量:
Fargate任务仅支持非永久性存储卷。
对于EC2任务,请在以下常见示例中使用数据量:
- 提供用于容器的永久数据量
- 要定义一个空的非持久数据卷并将其安装在多个容器上
- 要在同一容器实例的不同容器上的不同位置共享定义的数据量
- 为由第三方卷驱动程序管理的任务提供数据量
我自己还没有尝试过,但是CDK似乎对ECS + Ec2具有稳定的支持。
PS到基本示例的链接已断开,我试图找到新位置,但是在新的example repository中没有成功。