Запуск двух контейнеров на Fargate с использованием CDK
Я хотел бы использовать Fargate для запуска двух контейнеров - один для основного бэкенда проекта, а другой для базы данных (MongoDB). Базовый пример, включенный в репозиторий GitHub, показывает, как запустить один контейнер на Fargate с использованием CDK, однако у меня все еще есть 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
});
}
}
Заранее спасибо.
1 ответ
Как правило, запуск базы данных в контейнере Fargate не рекомендуется, поскольку в настоящее время не существует хорошего решения для сохранения данных. Вы можете интегрировать ловушку, которая копирует данные в нечто вроде S3 до остановки задачи, но обычно такие решения очень хрупкие и не рекомендуются.
Возможно, вы захотите проверить DocumentDB в качестве альтернативы запуску ваших собственных экземпляров MongoDB, хотя поддержка конструкций DocumentDB в CDK еще не полностью реализована.
Другой вариант - запускать обычные задачи ECS и подключать том EBS к вашему экземпляру EC2. Затем вы можете использовать тома Docker для монтирования тома EBS в ваш контейнер. При таком подходе вам потребуется пометить метаданные экземпляра и использовать ограничение размещения ECS, чтобы убедиться, что ваша задача помещена в экземпляр, к которому подключен том EBS.
Если любой из этих подходов работает для вас, не стесняйтесь открывать запрос функции в хранилище CDK. Надеюсь это поможет!
Является ли AWS Fargate жестким требованием?
Если нет, вы можете выбрать простой ECS + Ec2, он поддерживает использование постоянных томов данных:
Задачи Fargate поддерживают только непостоянные тома хранения.
Для задач EC2 используйте тома данных в следующих типичных примерах:
- Чтобы предоставить постоянные тома данных для использования с контейнером
- Чтобы определить пустой непостоянный том данных и подключить его к нескольким контейнерам
- Совместное использование определенных объемов данных в разных местах в разных контейнерах в одном экземпляре контейнера
- Чтобы предоставить объем данных для вашей задачи, управляемый сторонним драйвером тома
Сам не пробовал, но похоже, что CDK стабильно поддерживает ECS + Ec2.
PS ссылка на базовый пример не работает, я безуспешно пытался найти новое место в репозитории нового примера.