2

假设我有一个 docker-compose 文件,如下所示:

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

我希望能够将它理想地部署到 AWS Fargate(尽管我很沮丧,以至于我会采用 ECS 或其他任何可行的方法)——现在我不关心卷、扩展或其他任何可能具有复杂性的东西,我只是在最低限度之后,所以我可以开始了解发生了什么。唯一需要注意的是它需要在代码中 - 我可以从 CI 服务器启动的自动化部署。

CloudFormation 是正确的工具吗?我似乎只能找到一千行 yaml 或更多行的示例,它们都不起作用,而且无法调试。

4

2 回答 2

3

您可以使用AWS cdk工具将您的基础设施编写为代码。它基本上是一个创建 cloudformation 模板的元框架。这是将 nginx 部署到具有自动缩放功能的负载平衡 ecs fargate 服务的最小示例,但您可以只删除最后一个 to 表达式。当您需要更多地控制从什么开始时,代码会很快变得更加复杂

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 版本的链接,因为文档的最新版本有点损坏。

于 2019-02-21T13:55:08.023 回答
0

ECS 使用“任务定义”而不是 docker-compose。在任务定义中,您定义要使用的映像和端口。如果我们使用 AWS CLI,我们也可以使用 docker-compose。但我还没有尝试过。

因此,您可以先创建基于 ECS Fargate 的集群,然后使用任务定义创建任务或服务。这将在 Fargate 中打开容器。

于 2019-02-18T07:07:31.510 回答