在AWS CFT中,如何引用现有VPC的CIDR

时间:2018-08-09 03:39:04

标签: amazon-web-services amazon-cloudformation

在CFT中,我想使用特定于VPC的CIDR的规则创建一个安全组。 CFT允许用户从其帐户中选择现有的VPC之一。

我使用该参数让用户选择VPC ID。

 "Parameters" : {
    "ExistingVPC": {
      "Description": "VPC ID",
      "Type": "AWS::EC2::VPC::Id"
    },

以及如何创建如下所示的安全组:

...
"InstanceSecurityGroup" : {

"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {

"VpcId" : { "Ref" : "ExistingVPC" },

"GroupDescription" : "Open protocol and ports required",

"SecurityGroupIngress" : [

{"IpProtocol" : "tcp", "FromPort" : "22",     "ToPort" : "22",     "CidrIp" : { "Ref" : "SSHLocation" } },

{"IpProtocol" : "tcp", "FromPort" : "8080",     "ToPort" : "8080",     "CidrIp" : { "Fn::GetAtt" : [ { "Ref" : "ExistingVPC" }, "CidrBlock"] } },

{"IpProtocol" : "tcp", "FromPort" : "8080",   "ToPort" : "8080",   "CidrIp" : { "Ref" : "SSHLocation" } }

],

"Tags" : [ {"Key" : "Application", "Value" : { "Ref" : "AWS::StackId"} }, {"Key" : "Name",     "Value" : {"Fn::Join": [ "", [ { "Ref" : "AWS::StackName" }, " SecurityGroup" ] ]} } ]       

}
},
...

我需要在VPC中打开8080端口,以使应用程序发布到服务器。

当然,Fn :: GetAtt根本不支持此语法。

{ "Fn::GetAtt" : [ { "Ref" : "ExistingVPC" }, "CidrBlock"] }

我非常感谢您的建议和解决方法。预先感谢。

1 个答案:

答案 0 :(得分:0)

它将引发模板验证错误:

  

模板验证错误:模板错误:每个Fn :: GetAtt对象都需要两个非空参数,即资源名称和资源属性

根据官方文档,您不能使用变量,因为它必须是堆栈中资源的逻辑资源ID。例如,您不能使用 Ref 来引用参数。

Source.

但是,如果此现有VPC是由同一区域内的另一个cloudformation堆栈创建的,则可以执行以下操作:

父堆栈输出部分

...
Outputs:
  VpcCidrBlock:
    Description: ExistingVPC's CIDR block.
    Value:
      Fn::GetAtt:
        - ExistingVPC
        - CidrBlock
    Export:
      Name: ExistingVPCBlock

而且,它可以在子堆栈中使用,如下所示:

...
Resources:
  Type: "AWS::EC2::SecurityGroupIngress"
  Properties:
    CidrIp:
      Fn::ImportValue: ExistingVPCBlock
    FromPort: 80
    IpProtocol: tcp
    ToPort: 80