Home > Software engineering >  The argument of type "undefined" cannot be assigned to the parameter of type "Constru
The argument of type "undefined" cannot be assigned to the parameter of type "Constru

Time:01-31

I tried example code from the AWS CDK documentation, but it didn't work as expected.

CDK version 2.62.2 in Typescript. Everywhere (this, is standing there is is a declaration error. The argument of type "undefined" cannot be assigned to the parameter of type "Construct".

Code:

import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

declare const vpc: ec2.Vpc;

// 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,
});

const taskDefinition = new ecs.Ec2TaskDefinition(this, 'TaskDef');

taskDefinition.addContainer('DefaultContainer', {
  image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
  memoryLimitMiB: 512,
});

// Instantiate an Amazon ECS Service
const ecsService = new ecs.Ec2Service(this, 'Service', {
  cluster,
  taskDefinition,
});

CodePudding user response:

TL;DR The error is telling you that the this keyword is undefined. Move your instantiation code to a construct subclass constructor.


A construct's first argument is its scope, or parent construct. You are right to use the this keyword as the scope, but it is undefined as your code is currently written. The idomatic CDK way to to define constructs is inside the constructor of a construct subclass, typically a Stack. Inside the Stack's constructor, this will refer to the Stack instance.

The vpc variable is also undefined in your code. By convention, the CDK docs use Typescript variable declaration statements to keep the examples shorter. Strictly speaking it's not causing an error, but it's probably not the behaviour you are expecting. If you don't want to use the default Vpc which will be created for you if the vpc prop is undefined, you need to instantiate a Vpc rather than just declare the vpc variable.

class MyStack extends Stack {
  constructor(scope: App, id: string, props?: StackProps) {
    super(scope, id, props);

    const vpc = new ec2.Vpc(this, 'Vpc', { maxAzs: 2 });

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

The aws-samples/aws-cdk-examples repo has several complete working ECS examples for EC2.

CodePudding user response:

On the part where you are trying to create a new ecs.Cluster you are passing along an "Undefined" VPC. As you are only declaring the const without setting any value.

To create a new VPC you should modify the line from:

declare const vpc: ec2.Vpc;

To something like:

const vpc = new ec2.Vpc(this, 'TheVPC')

Documentation on this is found at https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html

  • Related