如何在cloudformation中指定子网和VPC ID?

时间:2016-10-29 22:37:02

标签: amazon-web-services amazon-ec2 amazon-vpc amazon-cloudformation

我不想创建新的子网和我已经创建的VPC,我希望我的cloudformation模板能够使用它们。

我在哪个参数中指定了这个,或者我对这是如何工作感到困惑?

当我查看“AWS :: EC2 :: VPC”和“AWS :: EC2 :: Subnet”的文档时,似乎这些资源仅用于创建 VPC,子网就是这个正确的吗?

我应该直接将实例资源指向我希望它使用的现有VPC和子网吗?

编辑:

例如,如果我的模板中有实例资源,我将其直接指向现有的子网,如下所示:

let rotate = a => a[0].map((col, c) => a.map((row, r) => a[r][c]).reverse())

验证模板时出现此错误:

{
  "Resources": {
    "MyServer": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "InstanceType": {
          "Ref": "InstanceType"
        },
"SubnetId": {
  "Ref": "subnet-abc123"
},
...

我尝试使用映射执行此操作但仍然出错。 我在映射中有这个:

Template contains errors.: Template format error: Unresolved resource dependencies [subnet-abc123] in the Resources block of the template

这在实例资源中:

  "Mappings": {
    "SubnetID": {
      "TopKey": {
        "Default": "subnet-abc123"
      }
    }

我在尝试验证时遇到此错误:

"SubnetId": {
  "Fn::FindInMap": [
    "SubnetID",
    {
      "Ref": "TopKey"
    },
    "Default"
  ]
}

2 个答案:

答案 0 :(得分:3)

Parameters部分指定它们,并在Resources部分中引用它们。 CF将允许您先选择 VPC ,然后选择子网

  "Parameters" : {

    "VpcId" : {
      "Type" : "AWS::EC2::VPC::Id",
      "Description" : "VPCId of Virtual Private Cloud (VPC).",
      "Default" : ""
    },

    "VpcSubnet": {
      "Description" : "SubnetId in VPC",
      "Type" : "AWS::EC2::Subnet::Id",
      "Default" : ""
    },


  "Resources" : {
    ...
    "Ec2Instance" : {
      "Properties" : {
        "SubnetId" : { "Ref" : "VpcSubnet" },

答案 1 :(得分:2)

如果您希望使用特定的VPC和子网,只需插入其值:

{
  "Resources": {
    "MyServer": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "InstanceType": "t2.micro",
        "SubnetId": "subnet-abc123",
        "ImageId": "ami-abcd1234"
      }
    }
}

子网始终属于VPC,因此指定子网将自动选择匹配的VPC。