使用Pulumi TypeScript在默认VPC/子网创建EC2实例遇阻求助
解决Pulumi TypeScript在默认VPC/子网创建EC2实例的问题
你遇到的核心问题有两个:一是错误地尝试“创建”默认VPC(AWS账户本身自带默认VPC,无需手动创建),二是未正确处理异步方法的返回值。以下是修正后的完整解决方案:
完整可运行代码示例
import * as aws from "@pulumi/aws"; // 获取账户中已存在的默认VPC const defaultVpc = await aws.ec2.getDefaultVpc({}); // 获取默认VPC下的所有子网ID const subnetIdsResult = await aws.ec2.getSubnetIds({ vpcId: defaultVpc.id, }); const subnetIds = subnetIdsResult.ids; // 创建允许基础访问的安全组(按需调整规则) const instanceSecurityGroup = new aws.ec2.SecurityGroup("ec2-sg", { vpcId: defaultVpc.id, ingress: [ { protocol: "tcp", fromPort: 22, toPort: 22, cidrBlocks: ["0.0.0.0/0"] }, { protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] }, ], egress: [ { protocol: "-1", fromPort: 0, toPort: 0, cidrBlocks: ["0.0.0.0/0"] }, ], tags: { Name: "EC2 Instance SG" }, }); // 创建EC2实例 const ec2Instance = new aws.ec2.Instance("default-vpc-instance", { // 动态获取最新Amazon Linux 2 AMI ami: aws.ec2.getAmi({ filters: [{ name: "name", values: ["amzn2-ami-hvm-*-x86_64-gp2"] }], owners: ["amazon"], mostRecent: true, }).then(ami => ami.id), instanceType: "t2.micro", // 使用默认VPC下的第一个子网 subnetId: subnetIds[0], vpcSecurityGroupIds: [instanceSecurityGroup.id], tags: { Name: "Default VPC EC2 Instance" }, }); // 输出实例公网IP方便访问 export const instancePublicIp = ec2Instance.publicIp;
关键修正点说明
- 正确获取默认VPC:用
await aws.ec2.getDefaultVpc()直接读取账户中已存在的默认VPC,避免了new aws.ec2.DefaultVpc带来的资源冲突问题。 - 异步方法处理:
aws.ec2.getSubnetIds是异步方法,必须用await等待返回结果,否则无法拿到有效的子网ID列表。 - 动态AMI选择:通过
getAmi动态获取最新系统镜像,避免硬编码AMI ID导致的跨区域或版本失效问题。
内容的提问来源于stack exchange,提问作者Kawaljeet Singh
相关产品推荐
相关产品推荐

