如何使用非默认VPC在Pulumi中创建EC2实例?

问题描述

我试图在Pulumi中创建AWS基础设施(VPC,安全组,EC2实例),但是遇到了障碍。即:

我正在使用Pulumi创建一个VPC,该VPC在认情况下会自动创建子网,网关和路由表,这对我来说很好。此后,我创建安全组。至此为止一切都很好,没有问题。 但是,当我尝试创建EC2实例时,我想在刚刚创建的VPC上创建它,并且由于它是动态的,因此在创建它们之前我将不知道VPC和子网ID。

在创建EC2实例时,您需要告诉它在哪个子网中创建实例。这是我开始遇到麻烦的地方。我创建的VPC提供了子网ID的Promise ,但是我什至无法访问子网ID甚至得到一个-没有任何返回。

很明显,我忽略了一些重要的事情,但是在任何文档或示例中似乎都找不到此流程的任何示例。这是我用来构造VPC并尝试获取子网的2个功能

创建VPC:

createVPC() {
        const CIDRBLOCK = "10.0.0.0/16"
        const NUM_AVAILABILITY_ZOnes = 2
    
        const vpc = new awsx.ec2.Vpc(this.basename + "_vpc",{
            cidrBlock: CIDRBLOCK,numberOfAvailabilityZones: NUM_AVAILABILITY_ZOnes,subnets: [{type : "public"},{type : "private"}],});
        return vpc;
    }

子网查找:

private async waitForPromise(prom : Promise<Output<string>[]>) {
        await prom;
        console.log((await prom).toString());
        return prom;
    }

    private getsubnet(vpc : awsx.ec2.Vpc) {
        if (this.subnetID === "") {
            let subnetids = this.waitForPromise(vpc.privatesubnetIds)
            subnetids.then((ids) => { ids[0].apply((id) => this.subnetID = id) });
        }
        return this.subnetID;
    }

有什么想法吗?对于上下文,我也是Typescript的新手,所以我可能只是不了解某些概念。也欢迎您提供反馈。

解决方法

使用pulumi.output方法对我有用:

      const fleetvpc = new awsx.ec2.Vpc(vpcName,{
        cidrBlock : vpcCidr,subnets: [ 
            {type: "public"},],numberOfNatGateways: 0,tags: { "Name": vpcName}
    });

    const az1_pub_subnet = pulumi.output(fleetvpc.publicSubnetIds.then(ids => ids[0])) 
    const az2_pub_subnet = pulumi.output(fleetvpc.publicSubnetIds.then(ids => ids[1]))