Как я могу развернуть nginx на Fargate AWS в коде?

Скажем, у меня есть файл docker-compose, подобный следующему:

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80

Я хочу в идеале иметь возможность развернуть его на AWS Fargate (хотя я достаточно разочарован, чтобы взять ECS или что-то еще, что работает) — сейчас меня не волнуют объемы, масштабирование или что-либо еще, что может иметь сложность , Я только после минимума, чтобы я мог начать понимать, что происходит. Единственное предостережение в том, что это должно быть в коде — автоматическое развертывание, которое я могу запустить с сервера CI.

Является ли CloudFormation правильным инструментом? Кажется, я могу найти только примеры, которые состоят буквально из тысячи строк yaml или более, ни один из них не работает, и их невозможно отладить.


person rich    schedule 15.02.2019    source источник
comment
Я никогда не использовал компоновку Docker, но я создал конвейер CD (используя AWS CodePipeline), который создает образ Docker, отправляет его в AWS ECR, а затем развертывает в Fargate. Так что я бы сказал, да, использование Cloudformation — это хороший, хотя и болезненный путь. Ниже приведена настройка, которая может помочь вам начать работу. я адаптировал его из одного из моих проектов, может он и не работает на 100%, но по крайней мере шаблоны прошли линтинг. Я предполагаю, что вам нужно будет изменить код buildspec для работы с Docker compose.   -  person Milan Cermak    schedule 15.02.2019


Ответы (2)


Вы можете использовать инструмент AWS cdk, чтобы написать свою инфраструктуру в виде кода. По сути, это мета-фреймворк для создания шаблонов облачных формаций. Вот минимальный пример развертывания nginx в сервисе ecs fargate с балансировкой нагрузки и автомасштабированием, но вы можете просто удалить последнее выражение. Код быстро усложняется, когда вам нужно больше контроля над тем, что запускать.

import cdk = require('@aws-cdk/cdk');
import ec2 = require('@aws-cdk/aws-ec2');
import ecs = require('@aws-cdk/aws-ecs');
import ecr = require('@aws-cdk/aws-ecr');

export class NginxStack extends cdk.Stack {

    constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
        super(scope, id, props);

        const vpc = new ec2.VpcNetwork(this, 'MyApiVpc', {
            maxAZs: 1
        });

        const cluster = new ecs.Cluster(this, 'MyApiEcsCluster', {
            vpc: vpc
        });

        const lbfs = new ecs.LoadBalancedFargateService(this, 'MyApiLoadBalancedFargateService', {
            cluster: cluster,
            cpu: '256',
            desiredCount: 1,
            // The tag for the docker image is set dynamically by our CI / CD pipeline
            image: ecs.ContainerImage.fromDockerHub("nginx"),
            memoryMiB: '512',
            publicLoadBalancer: true,
            containerPort: 80
        });

        const scaling = lbfs.service.autoScaleTaskCount({
            maxCapacity: 5,
            minCapacity: 1
        });

        scaling.scaleOnCpuUtilization('MyApiCpuScaling', {
            targetUtilizationPercent: 10
        });

    }
}

Я добавил ссылку на конкретную версию CDK, потому что самая последняя сборка документации немного повреждена.

person Saskia    schedule 21.02.2019

ECS использует «Определения задач» вместо docker-compose. В определениях задач вы определяете, какой образ и порты использовать. Мы также можем использовать docker-compose, если используем AWS CLI. Но я еще не пробовал.

Таким образом, вы можете сначала создать кластер на основе ECS Fargate, а затем создать задачу или службу, используя определение задачи. Это поднимет контейнеры в Fargate.

person Jeevagan    schedule 18.02.2019