在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"] }
我非常感谢您的建议和解决方法。预先感谢。
答案 0 :(得分:0)
它将引发模板验证错误:
模板验证错误:模板错误:每个Fn :: GetAtt对象都需要两个非空参数,即资源名称和资源属性
根据官方文档,您不能使用变量,因为它必须是堆栈中资源的逻辑资源ID。例如,您不能使用 Ref 来引用参数。
但是,如果此现有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