Как получить идентификатор подсети по имени или cidr

Мне нужно получить идентификатор подсети из имени подсети или cidr для развертывания шлюза nat. Как я могу получить идентификатор подсети? Или у кого-нибудь есть лучшая практика использования функции машинописного текста? Извините, я новичок в машинописи.

export class VpcTestStack extends cdk.Stack {
  svc = 'common';
  env  = 'test';
  cidr = '10.10';
  vpc: ec2.CfnVPC;

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

    this.vpc = new ec2.CfnVPC(this, 'vpc', {
      ...
    });

    this.subnet_creation(this.availabilityZones[0], 'public-01-a', '.0.0/20');
    this.subnet_creation(this.availabilityZones[2], 'public-01-c', '.16.0/20');
    ...
    this.subnet_creation(this.availabilityZones[0], 'private-03-a', '.192.0/20');
    this.subnet_creation(this.availabilityZones[2], 'private-03-c', '.208.0/20');

    this.nat_creation('a', 'public-02-a')
    this.nat_creation('c', 'public-02-c')

  }

  subnet_creation(availability_zone: string, subnet_name: string, subnet_cidr: string) 
  {
    new ec2.CfnSubnet(this, 'subnet-' + subnet_name, {
      availabilityZone: availability_zone,
      cidrBlock: this.cidr + subnet_cidr,
      vpcId: this.vpc.ref,
      tags: [ { key: 'Name', value: this.svc + '-' + this.env + '-' + subnet_name } ]
    });
  }

  nat_creation(az: string, subnet_name: string)
  {
    const natgw_eip = new ec2.CfnEIP(this, 'natgw-eip-' + az, {
      domain: 'vpc'
    });

    new ec2.CfnNatGateway(this, 'natgw-' + az, {
      allocationId: natgw_eip.attrAllocationId,
      subnetId: ???, <---------------------------------------------------------------------- Here
      tags: [ { key: 'Name', value: this.svc + '-' + this.env + '-natgw' + az } ]
    });
  }
}


person Hugo Bang    schedule 10.02.2021    source источник


Ответы (1)


Мы можем захватить созданную подсеть и сослаться на нее (равно как! Ref в Cloudformation)

const myPublicSubnetOne: ec2.CfnSubnet = this.subnet_creation(
  this.availabilityZones[0],
  "public-01-a",
  ".0.0/20"
);

Нам нужно вернуть подсеть из этого метода

  subnet_creation(
    availability_zone: string,
    subnet_name: string,
    subnet_cidr: string
  ) {
    const subnet = new ec2.CfnSubnet(this, "subnet-" + subnet_name, {
      availabilityZone: availability_zone,
      cidrBlock: this.cidr + subnet_cidr,
      vpcId: this.vpc.ref,
      tags: [
        { key: "Name", value: this.svc + "-" + this.env + "-" + subnet_name },
      ],
    });
    return subnet;
  }

Добавьте ввод в свою функцию nat_creation и обозначьте subnetId: myPubSubnet.ref,

  nat_creation(az: string, myPubSubnet: ec2.CfnSubnet) {
    const natgw_eip = new ec2.CfnEIP(this, "natgw-eip-" + az, {
      domain: "vpc",
    });
    new ec2.CfnNatGateway(this, "natgw-" + az, {
      allocationId: natgw_eip.attrAllocationId,
      subnetId: myPubSubnet.ref,
      tags: [{ key: "Name", value: this.svc + "-" + this.env + "-natgw" + az }],
    });
  }

передать саму подсеть вместо строки.

this.nat_creation("a", myPublicSubnetOne);
person Balu Vyamajala    schedule 10.02.2021
comment
Спасибо за ваш ответ. Не могли бы вы исправить следующую ошибку? return new TSError (DiagnosticText, DiagnosisCodes) ^ TSError: ⨯ Невозможно скомпилировать TypeScript: lib / vpc-ingress-alpha-stack.ts: 38: 11 - ошибка TS2322: Тип «void» не может быть назначен типу «CfnSubnet». 38 const myPublicSubnetOne: ec2.CfnSubnet = this.subnet_creation (this.availabilityZones [0], 'public-01-a', '.0.0 / 20'); ~~~~~~~~~~~~~~~~~ - person Hugo Bang; 10.02.2021
comment
@HugoBang нам нужно вернуть подсеть из метода subnet_creation обновленный ответ с дополнительными деталями. - person Balu Vyamajala; 10.02.2021
comment
Это работает хорошо. Большое тебе спасибо!! - person Hugo Bang; 10.02.2021