首页 > 解决方案 > 如何在 cloudformation 内的安全组中使用 EC2 ip 地址

问题描述

我对 cloudformation 有点陌生,我无法参数化或查找有关如何在我的安全组中引用 ec2 IP 地址的信息。两者在我的堆栈中定义,我的 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"
        ]
    }

那么,我应该在 SecurityGroupIngress 中放入我的 CidrIp 以使我的 SG 使用我的 EC2 的私有 IP?

标签: amazon-web-servicesamazon-cloudformation

解决方案


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

{
    "3DEXPPLAT": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "GroupDescription": "3DPLAT SG",
            "SecurityGroupIngress": [
                {
                    "IpProtocol": "tcp",
                    "FromPort": 80,
                    "ToPort": 80,
                    "CidrIp": {
                        "Fn::Sub": "${CFAPA.PrivateIp}/32"
                    }
                }
            ]
        }
    }
}

笔记:

  • 您不需要指定DependsOn属性,因为 CloudFormation 会因为引用而找出依赖关系。这简化了代码。

  • 要确定要使用的属性Fn::GetAtt被调用PrivateIp,您必须参考AWS::EC2::Instance文档的“返回值”部分。这是您注意到Fn::Ref返回实例 ID 的地方。

  • 请记住,私有 IP 可能会更改。因此,您可能希望将 附加CFAPA到另一个安全组并根据安全组成员身份创建权限。这是一个架构决定。


推荐阅读