我正在使用两个需要互相交流的简单网络应用。在AWS CloudFormation中,我有一个模板,用于创建EC2实例并在同一服务器上安装这两个应用程序(最终我将它们拆分,但现在它们仍然存在于同一个EC2实例上)。
作为EC2实例的一部分,我必须定义要使用的SecurityGroup。现在我一直在使用默认的,但我想动态地构建一个。在组中,我允许从我的机器进入SSH,以及从框到自身的几个端口。
当使用默认组时,我可以将服务器的公共IP添加到其自己的安全组,以允许它与自己进行通信。问题是在CloudFormation模板期间,我在SecurityGroup和EC2实例之间获得循环引用。实例需要启动SecurityGroup,并且该组需要包含EC2框的公共IP规则。
有没有更好的方法来做到这一点,或以某种方式锁定某些东西沿着" localhost"现在允许这些流量?
答案 0 :(得分:3)
您有几个选择:
AWS::EC2::SecurityGroup
中使用嵌入式入口和出口规则,而是使用AWS::EC2::SecurityGroupEgress
和AWS::EC2::SecurityGroupIngress
分开,如上所述here。看起来像:
"Resources" : {
"SelfRefSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Has access to itself",
"VpcId" : "vpc-xxxxxx"
}
},
"MySecurityGroupIngress" : {
"Type" : "AWS::EC2::SecurityGroupIngress",
"Properties" : {
"GroupId" : { "Ref" : "SelfRefSecurityGroup" },
"IpProtocol" : "tcp",
"ToPort" : "65535",
"FromPort" : "0",
"SourceSecurityGroupId" : { "Ref" : "SelfRefSecurityGroup" }
},
"DependsOn" : "SelfRefSecurityGroup"
}
最佳选择: 在框中创建2个主机条目(或者更好的是使用Route53 private hosted zone设置dns条目):
webapp1.com 127.0.0.1
webapp2.com 127.0.0.1
我不建议让盒子通过其公共IP与自己对话。可能你甚至会付出代价! (https://aws.amazon.com/ec2/pricing/on-demand/) 加上SG的额外维护。
答案 1 :(得分:0)
我们可以在创建过程中自行引用安全组,例如:
---
Description: Create a VPC with a SG which references itself
AWSTemplateFormatVersion: '2010-09-09'
Resources:
vpctester:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 172.16.0.0/23
EnableDnsSupport: false
EnableDnsHostnames: false
InstanceTenancy: default
Tags:
- Key: Name
Value: vpctester
sgtester:
Type: AWS::EC2::SecurityGroup
DependsOn: vpctester
Properties:
GroupDescription: vpc tester sg
VpcId:
Ref: vpctester
sgtesteringress:
Type: AWS::EC2::SecurityGroupIngress
DependsOn: sgtester
Properties:
GroupId:
Ref: sgtester
IpProtocol: tcp
FromPort: '0'
ToPort: '65535'
SourceSecurityGroupId:
Ref: sgtester
请阅读我的文章以获取更多信息: https://dev.to/anupamncsu/self-referencing-security-groups-on-aws-59gb