UNPKG

@artilleryio/platform-fargate

Version:
1 lines 1.77 kB
const assert=require("assert").strict,AWS=require("aws-sdk");class VPCSubnetFinder{constructor(opts){this.ec2=new AWS.EC2(opts)}async getRouteTables(vpcId){try{return(await this.ec2.describeRouteTables({Filters:[{Name:"vpc-id",Values:[vpcId]}]}).promise()).RouteTables}catch(err){throw err}}async findDefaultVpc(){try{var vpcRes=await this.ec2.describeVpcs({Filters:[{Name:"isDefault",Values:["true"]}]}).promise();return assert.ok(vpcRes.Vpcs.length<=1),1!==vpcRes.Vpcs.length?null:vpcRes.Vpcs[0].VpcId}catch(err){throw err}}async getSubnets(vpcId){try{return(await this.ec2.describeSubnets({Filters:[{Name:"vpc-id",Values:[vpcId]}]}).promise()).Subnets}catch(err){throw err}}isSubnetPublic(routeTables,subnetId){let subnetTable=routeTables.filter(rt=>{rt=rt.Associations.filter(assoc=>assoc.SubnetId&&assoc.SubnetId===subnetId);return assert.ok(rt.length<=1),1===rt.length});if(1!==(subnetTable=0===subnetTable.length?routeTables.filter(rt=>{rt=rt.Associations.filter(assoc=>!0===assoc.Main);return assert.ok(rt.length<=1),1===rt.length}):subnetTable).length)throw new Error("Could not locate routing table for subnet: subnet id: "+subnetId);return 0<subnetTable[0].Routes.filter(route=>route.GatewayId&&route.GatewayId.startsWith("igw-")).length}async findPublicSubnets(vpcId){vpcId=vpcId||await this.findDefaultVpc();const rts=await this.getRouteTables(vpcId);return(await this.getSubnets(vpcId)).filter(subnet=>this.isSubnetPublic(rts,subnet.SubnetId))}}async function main(){var f=new VPCSubnetFinder({region:process.env.REGION});try{var publicSubnets=await f.findPublicSubnets(process.env.VPC_ID);console.log(publicSubnets.map(s=>s.SubnetId).join("\n"))}catch(err){console.log(err)}}require.main==module&&main(),module.exports={VPCSubnetFinder:VPCSubnetFinder};