所以我有一个AWS CloudFormation模板,包含3个不同的实例'类型'(服务器,代理,中继)
我正在使用AutoScaling动态启动X类型的实例。
我的问题是我需要从模板的输出中获取这些服务器的所有IP,最好分成几个部分。
即
服务器:x.x.x.x y.y.y.y
继电器:z.z.z.z。
代理人:a.a.a.a
如何从输出中获取实例ID? (我可以从ID中获取IP)
附模板:
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "uDeploy Agent-Relay-Server",
"Parameters" : {
"keyName" : {
"Description" : "SSH key to enable access on the servers",
"Type" : "String",
"Default" : "nick-portal"
},
"ServerInstanceCount" : {
"Description" : "Number of Servers to start",
"Type" : "Number",
"Default" : "1"
},
"RelayInstanceCount" : {
"Description" : "Number of Agent Relays to start",
"Type" : "Number",
"Default" : "2"
},
"AgentInstanceCount" : {
"Description" : "Number of Agents to start",
"Type" : "Number",
"Default" : "4"
},
"ServerAMI" : {
"Description" : "",
"Type" : "String",
"Default" : "ami-7539b41c"
},
"RelayAMI" : {
"Description" : "",
"Type" : "String",
"Default" : "ami-7539b41c"
},
"AgentAMI" : {
"Description" : "",
"Type" : "String",
"Default" : "ami-7539b41c"
},
"ServerUserData" : {
"Description" : "",
"Type" : "String",
"Default" : "#!/bin/bash"
},
"RelayUserData" : {
"Description" : "",
"Type" : "String",
"Default" : "#!/bin/bash"
},
"AgentUserData" : {
"Description" : "",
"Type" : "String",
"Default" : "#!/bin/bash"
},
"Zone" : {
"Description" : "",
"Type" : "String",
"Default" : "us-east-1d"
}
},
"Resources" : {
"ServerLaunchConfig" : {
"Type" : "AWS::AutoScaling::LaunchConfiguration",
"Properties" : {
"KeyName" : { "Ref" : "keyName" },
"ImageId" : { "Ref" : "ServerAMI" },
"UserData" : { "Fn::Base64" : { "Ref" : "ServerUserData" } },
"SecurityGroups" : [ { "Ref" : "ServerSecurityGroup" }, { "Ref" : "SshSecurityGroup" } ],
"InstanceType" : "t1.micro"
}
},
"RelayLaunchConfig" : {
"Type" : "AWS::AutoScaling::LaunchConfiguration",
"Properties" : {
"KeyName" : { "Ref" : "keyName" },
"ImageId" : { "Ref" : "RelayAMI" },
"UserData" : { "Fn::Base64" : { "Ref" : "RelayUserData" } },
"SecurityGroups" : [ { "Ref" : "RelaySecurityGroup" }, { "Ref" : "SshSecurityGroup" } ],
"InstanceType" : "t1.micro"
}
},
"AgentLaunchConfig" : {
"Type" : "AWS::AutoScaling::LaunchConfiguration",
"Properties" : {
"KeyName" : { "Ref" : "keyName" },
"ImageId" : { "Ref" : "AgentAMI" },
"UserData" : { "Fn::Base64" : { "Ref" : "AgentUserData" } },
"SecurityGroups" : [ { "Ref" : "AgentSecurityGroup" }, { "Ref" : "SshSecurityGroup" } ],
"InstanceType" : "t1.micro"
}
},
"ServerAutoScalingGroup" : {
"Type" : "AWS::AutoScaling::AutoScalingGroup",
"Properties" : {
"AvailabilityZones" : [ { "Ref" : "Zone" } ],
"LaunchConfigurationName" : { "Ref" : "ServerLaunchConfig" },
"MinSize" : { "Ref" : "ServerInstanceCount" },
"MaxSize" : { "Ref" : "ServerInstanceCount" }
}
},
"RelayAutoScalingGroup" : {
"Type" : "AWS::AutoScaling::AutoScalingGroup",
"Properties" : {
"AvailabilityZones" : [ { "Ref" : "Zone" } ],
"LaunchConfigurationName" : { "Ref" : "RelayLaunchConfig" },
"MinSize" : { "Ref" : "RelayInstanceCount" },
"MaxSize" : { "Ref" : "RelayInstanceCount" }
}
},
"AgentAutoScalingGroup" : {
"Type" : "AWS::AutoScaling::AutoScalingGroup",
"Properties" : {
"AvailabilityZones" : [ { "Ref" : "Zone" } ],
"LaunchConfigurationName" : { "Ref" : "AgentLaunchConfig" },
"MinSize" : { "Ref" : "AgentInstanceCount" },
"MaxSize" : { "Ref" : "AgentInstanceCount" }
}
},
"RelaySecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable inbound 20080 and 7916 from Agents",
"SecurityGroupIngress" :
[
{
"IpProtocol" : "tcp",
"FromPort" : "20080",
"ToPort" : "20080",
"SourceSecurityGroupName" : { "Ref" : "AgentSecurityGroup" }
},
{
"IpProtocol" : "tcp",
"FromPort" : "7916",
"ToPort" : "7916",
"SourceSecurityGroupName" : { "Ref" : "AgentSecurityGroup" }
}
]
}
},
"ServerSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable inbound 8080 all and 7918 from Relays",
"SecurityGroupIngress" : [
{
"IpProtocol" : "tcp",
"FromPort" : "7918",
"ToPort" : "7918",
"SourceSecurityGroupName" : { "Ref" : "RelaySecurityGroup" }
},
{
"IpProtocol" : "tcp",
"FromPort" : "8080",
"ToPort" : "8080",
"CidrIp" : "0.0.0.0/0"
}
]
}
},
"AgentSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable no inbound",
"SecurityGroupIngress" : []
}
},
"SshSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable SSH from all",
"SecurityGroupIngress" : [
{
"IpProtocol" : "tcp",
"FromPort" : "22",
"ToPort" : "22",
"CidrIp" : "0.0.0.0/0"
}
]
}
}
},
"Outputs" : {
"Ip"
}
}
不,你不能将输出设置为ips。云形成负责自动调节组和自动调节启动配置,但它无法控制各个EC2实例,因此您无法从它们获取信息到输出中。
您可以在启动时编写在EC2实例上运行的内容,以使用ip值在堆栈上设置标记。但是当实例终止时,这可能很难维护。
在bash上并使用AWS CLI实用程序,您可以执行以下操作:
#!/bin/bash
AUTOSCALING_GROUP="mygroup"
aws ec2 describe-instances --filters \
"Name=tag:aws:autoscaling:groupName,Values=$AUTOSCALING_GROUP" \
"Name=instance-state-name,Values=running" | \
grep -o '\"i-[0-9a-f]\\+\"' | grep -o '[^\"]\\+'
这将输出'mygroup'自动缩放组中所有计算机的实例ID,每行一个。