Запуск двух контейнеров на Fargate с использованием CDK - PullRequest
0 голосов
/ 05 февраля 2019

Я бы хотел использовать Fargate для запуска двух контейнеров - один для основного бэкенда проекта, а другой для базы данных (MongoDB). Базовый пример , включенный в репозиторий GitHub, показывает, как запустить один контейнер на Fargate с использованием CDK, однако у меня все еще есть 2 проблемы:

  1. В примере не показано, какзапустить два контейнера.
  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 Ответ

0 голосов
/ 08 февраля 2019

Как правило, запускать базу данных в контейнере Fargate не рекомендуется, поскольку в настоящее время не существует хорошего решения для сохранения данных.Вы могли бы интегрировать ловушку, которая копирует данные в нечто вроде S3 до остановки задачи, но обычно такие решения очень хрупкие и не рекомендуются.

Возможно, вы захотите проверить DocumentDB в качестве альтернативы запуску ваших собственных экземпляров MongoDB, хотя поддержка конструкций DocumentDB в CDK еще не полностью реализована.

Другой альтернативой является запуск обычных задач ECS и присоединение тома EBS.на вашем экземпляре EC2.Затем вы можете использовать тома Docker для монтирования тома EBS в ваш контейнер.При таком подходе вам потребуется пометить метаданные экземпляра и использовать ограничение размещения ECS, чтобы убедиться, что ваша задача помещена в экземпляр, к которому подключен том EBS.

Если один из этих подходов вам подходитне стесняйтесь открывать запрос функции в CDK хранилище .Надеюсь, это поможет!

...