Ошибка aws -ecs-patterns: кластеру для этой службы требуется емкость Ec2. Вызовите addXxxCapacity () в кластере - PullRequest
0 голосов
/ 05 мая 2020

Надеюсь, что кто-то может мне здесь помочь, согласно документации AWS CDK, если я объявляю свой VP C, тогда я не должен объявлять «емкость» , но когда я запускаю cdk synth Я получаю следующую ошибку ...

throw new Error (Validation failed with the following errors:\n ${errorList});

Ошибка: проверка завершилась неудачно со следующими ошибками: [PrerenderInfrasctutureStack / preRenderApp / Service ] Кластеру для этой услуги требуется емкость Ec2. Вызовите addXxxCapacity () в кластере.

вот мой код ... (надеюсь, Натан Пек это видит)

const ec2 = require('@aws-cdk/aws-ec2');
const ecsPattern = require('@aws-cdk/aws-ecs-patterns');
const ecs = require('@aws-cdk/aws-ecs');
class PrerenderInfrasctutureStack extends cdk.Stack {
  /**
   *
   * @param {cdk.Construct} scope
   * @param {string} id
   * @param {cdk.StackProps=} props
   */


  constructor(scope, id, props) {
    super(scope, id, props);

    const myVPC = ec2.Vpc.fromLookup(this, 'publicVpc', {
      vpcId:'vpc-xxx'
    });


    const preRenderApp = new ecsPattern.ApplicationLoadBalancedEc2Service(this, 'preRenderApp', {
      vpcId: myVPC,
      certificate: 'arn:aws:acm:ap-southeast-2:xxx:certificate/xxx', //becuase this is spcified, then the LB will automatically use HTTPS
      domainName: 'my-dev.com.au.',
      domainZone:'my-dev.com.au',
      listenerPort: 443,
      publicLoadBalancer: true,
      memoryReservationMiB: 8,
      cpu: 4096,
      desiredCount: 1,
      taskImageOptions:{
        image: ecs.ContainerImage.fromRegistry('xxx.dkr.ecr.region.amazonaws.com/express-prerender-server'), 
        containerPort: 3000
      },
    });


  }

}


module.exports = { PrerenderInfrasctutureStack }

1 Ответ

1 голос
/ 05 мая 2020

Это потому, что если вы явно не передаете кластер, он использует кластер по умолчанию, который существует в вашей учетной записи. Однако кластер по умолчанию начинается без емкости EC2, поскольку инстансы EC2 при запуске стоят денег. Вы можете использовать пустой кластер по умолчанию в режиме Fargate, поскольку Fargate не требует емкости EC2, он просто запускает ваш контейнер внутри Fargate, но кластер по умолчанию не будет работать с режимом EC2, пока вы не добавите экземпляры EC2 в кластер.

Простым решением здесь является переключение на ApplicationLoadBalancedFargateService, поскольку службы Fargate работают с использованием емкости Fargate, поэтому им не требуются экземпляры EC2 в кластере. В качестве альтернативы вы должны определить свой собственный кластер, используя что-то вроде:

// Create an ECS cluster
const cluster = new ecs.Cluster(this, 'Cluster', {
  vpc,
});

// Add capacity to it
cluster.addCapacity('DefaultAutoScalingGroupCapacity', {
  instanceType: new ec2.InstanceType("t2.xlarge"),
  desiredCapacity: 3,
});

Затем передайте этот кластер в качестве свойства при создании ApplicationLoadBalancedEc2Service

Надеюсь, это поможет!

...