Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何在cloudformation内的安全组中使用EC2 ip地址_Amazon Web Services_Amazon Cloudformation - Fatal编程技术网

Amazon web services 如何在cloudformation内的安全组中使用EC2 ip地址

Amazon web services 如何在cloudformation内的安全组中使用EC2 ip地址,amazon-web-services,amazon-cloudformation,Amazon Web Services,Amazon Cloudformation,我对cloudformation有点陌生,我很难在安全组中设置参数或查找有关如何引用EC2IP地址的信息。 这两者在我的堆栈中定义,我的SG依赖于EC2。这是我的SG: "3DEXPPLAT": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "3DPLAT SG", "SecurityGroupIngr

我对cloudformation有点陌生,我很难在安全组中设置参数或查找有关如何引用EC2IP地址的信息。 这两者在我的堆栈中定义,我的SG依赖于EC2。这是我的SG:

        "3DEXPPLAT": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "GroupDescription": "3DPLAT SG",
            "SecurityGroupIngress": [
                {
                    "IpProtocol": "tcp",
                    "FromPort": 80,
                    "ToPort": 80,
                    "CidrIp": {"Ref" : "CFAPA"}
                }
            ],
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "STACK_3DEXPSG"
                }
            ]
        },
        "Metadata": {
            "AWS::CloudFormation::Designer": {
                "id": "59898995-0f8d-4cbe-b315-c9c68df319b2"
            }
        },
        "DependsOn": [
            "CFAPA"
        ]
    }

那么,我应该在securitygroupingres中的CidrIp中添加什么来让我的SG使用我的EC2的私有IP呢?

这是错误的方法

您不应该引用内部节点的显式IP地址,而应该指定另一个安全组作为源()。一种常见的方法是为每个应用程序定义一个安全组,并将这些组连接到构成该应用程序的ELB、EC2和RDS实例

您最多可以将5个安全组连接到网络接口,因此此“内部通信”组可以是您可能使用的任何“外部通信”组的补充(例如,ELB上接受Internet流量的规则)


CloudFormation的一个警告:您将无法内联定义入口规则。相反,您需要一个单独的引用已经定义的安全组的IP。

在EC2实例上使用
Fn::Ref
时,您正在检索其实例Id。对于您的安全组,您需要IP(使用
Fn::GetAtt
),并且需要将其格式化为CIDR块(添加带有
Fn::Sub
的符号). 因此,假设
CFAPA
是您的EC2实例,这应该可以工作:

{
“3dexplat”:{
“类型”:“AWS::EC2::SecurityGroup”,
“财产”:{
“组描述”:“3DPLAT SG”,
“SecurityGroupIngress”:[
{
“IpProtocol”:“tcp”,
“FromPort”:80,
“白鼬”:80,
“CidrIp”:{
“Fn::Sub:“${CFAPA.PrivateIp}/32”
}
}
]
}
}
}
注:

  • 您不需要指定
    DependsOn
    属性,因为CloudFormation将根据引用来计算依赖关系。这简化了代码

  • 要确定要在名为
    PrivateIp
    Fn::GetAtt
    上使用的属性,您必须参考文档的“返回值”部分。这就是您注意到
    Fn::Ref
    返回实例Id的地方

  • 请记住,私有IP可能会发生变化。因此,您可能希望将
    CFAPA
    附加到另一个安全组,并基于安全组成员身份创建权限。但这是一个架构决策


我认为你不应该称之为“错误的方法”。问题在于如何在CloudFormation中引用私有IP,而我们没有足够的信息来理解计划中的体系结构。我同意通过SGs进行管理是可取的,但我们不应该在不了解全局的情况下进行判断。@tyron-如果我看到有人试图穿越繁忙的公路,我会告诉那个人这是个坏主意。当我看到有人在写一个脆弱的配置模板时也是如此。非常感谢,现在你解释了这一点,这对我来说非常有意义:)@Andrea我总是忘记如果只使用模板值,你不需要完整的
Fn::Sub
映射。再看一看,这会使事情简化一点。