【问题标题】:use existing vpc and security group when adding an ec2 instance添加 ec2 实例时使用现有的 vpc 和安全组
【发布时间】:2019-01-14 23:31:52
【问题描述】:

有很多示例代码,但是快速改进的 cdk 包并没有帮助我找到一些(我认为的)简单事物的工作示例。例如,即使是我在示例中找到的导入也失败了:

import { VpcNetworkRef } from '@aws-cdk/aws-ec2';
 error TS2724: Module '"../node_modules/@aws-cdk/aws-ec2/lib"' has no exported member 'VpcNetworkRef'. Did you mean 'IVpcNetwork'?

为什么示例 ec2 代码不显示原始 ec2 实例的创建?

有用的是示例 cdk 代码,它使用硬编码的 VpcId 和 SecurityGroupId(我会将它们作为上下文值传递)来创建一对新的子网(即,每个可用区 1 个),我们在其中放置一对EC2 实例数。

同样,实例的目标 VPC 和 SecurityGroup 已经存在。我们只是(今天)在添加新的 EC2 实例集时创建新的子网。

我们有许多不同的环境(一组 aws 基础设施),目前共享一个账户、VPC 和安全组。这将会改变,但我目前的目标是看看我们是否可以使用云开发工具包在这个现有模型中创建新的不同环境。我们今天有一个 CF 模板。

我不知道从哪里开始。引用现有 VPC 的示例未编译。

import { VpcNetworkRef } from '@aws-cdk/aws-ec2';
const vpc = VpcNetworkRef.import(this, 'unused', {vpcId, availabilityZones: ['unused']});

同样,实例的目标 VPC 和 SecurityGroup 已经存在。我们只是(今天)在添加新的 EC2 实例集时创建新的子网。

-----编辑-------->

关于 gitter 的讨论帮助我回答了这个问题以及如何添加裸实例

const vpc - ec2.VpcNetwork.import(this, 'YOUR-VPC-NAME', {
    vpcId: 'your-vpc-id',
    availabilityZones: ['list', 'some', 'zones'],
    publicSubnetIds: ['list', 'some', 'subnets'],
    privateSubnetIds: ['list', 'some', 'more'],
});

const sg = ec2.SecurityGroup.import(this, 'YOUR-SG-NAME', {
    securityGroupId: 'your-sg-id'
});

// can add subnets to existing..
const newSubnet = new ec2.VpcSubnet(this, "a name", {
    availablityZone: "us-west-2b",
    cidrBlock: "a.b.c.d/e",
    vpcId: vpc.vpcId
});

// add bare instance
new ec2.CfnInstance(this, "instance name", {
    imageId: "an ami",
    securityGroupIds: [sg.securityGroupId],
    subnetId: newSubnet.subnetId,
    instanceType: "an instance type",
    tags: [{ key: "key", value: "value"}]
});

不需要进一步的答案......对我来说。

【问题讨论】:

  • 你能提供一个可重现的代码sn-p吗?您看过 ec2 的完整示例吗?如果你的代码 sn-p 是完整的,你需要创建一个应用程序并正确堆栈。 'this' 必须指向应用程序、堆栈或构造。这个例子可能会有所帮助:github.com/awslabs/aws-cdk/blob/master/examples/…
  • 很清楚这个例子,它没有重复使用现有的 vpc、安全组、添加子网,甚至没有自动缩放组的原始 ec2 实例。但是感谢您的阅读。

标签: aws-cdk


【解决方案1】:
import ec2 = require('@aws-cdk/aws-ec2');

// looking up a VPC by its name
const vpc = ec2.Vpc.fromLookup(this, 'VPC', {
  vpcName: 'VPC-Name'
});


// looking up an SG by its ID
const sg = ec2.SecurityGroup.fromSecurityGroupId(this, 'SG', 'SG-ID')


// creating the EC2 instance
const instance = new ec2.Instance(this, 'Instance', {
  vpc: vpc,
  securityGroup: sg,
  instanceType: new ec2.InstanceType('m4.large'),
  machineImage: new ec2.GenericLinuxImage({
    'us-east-1': 'ami-abcdef' // <- add your ami-region mapping here
   }),
});

【讨论】:

  • 为什么文档不能有这样一个简单的例子,我不知道!谢谢@udondan
  • 我们可以使用名称标签导入 sg 吗?我可以看到带有名称标签的 VPC 导入
【解决方案2】:

我也遇到了导入现有 vpc/子网/安全组的问题。我相信它与原始帖子相比有所改变。以下是从 v1.18.0 开始的方法:

import cdk, { Construct, Stack, Subnet, StackProps } from '@aws-cdk/core';
import { SecurityGroup, SubnetType, Vpc } from "@aws-cdk/aws-ec2";

const stackProps: StackProps = {
  env: {
    region: 'your region',
    account: 'your account'
  },
};

export class MyStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id, stackProps);

    const vpc = Vpc.fromVpcAttributes(this, 'vpc', {
      vpcId: 'your vpc id',
      availabilityZones: ['your region'],
      privateSubnetIds: ['your subnet id']
    });

    //Get subnets that already exists off your current vpc. 
    const subnets = vpc.selectSubnets({subnetType: SubnetType.PRIVATE});

    //Create a subnet in the existing vpc
     const newSubnet = new Subnet(this, 'subnet', {
       availabilityZone: 'your zone', 
       cidrBlock: 'a.b.c.d/e', 
       vpcId: vpc.vpcId
     });

    //Get an existing security group.
    const securityGroup = SecurityGroup.fromSecurityGroupId(this, 'securitygroup', 'your security group id');

  }
}

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 2017-10-25
    • 1970-01-01
    • 2017-08-08
    • 2020-03-27
    • 2022-10-25
    • 2023-03-29
    • 2021-05-29
    • 2019-12-22
    相关资源
    最近更新 更多