Назад | Перейти на главную страницу

Отправка SecurityGroupIngress во вложенный стек облачной информации

Не уверен, лучше ли здесь или ТАК спросить об этом ...

Я пытаюсь разделить наши шаблоны CloudFormation, чтобы сделать их удобнее и меньше.

Я столкнулся с проблемой, когда я хочу использовать «базовый» шаблон группы безопасности, который по существу пуст, а затем указать его вместе с параметрами для каждой группы безопасности, которую мне нужно создать.

Моя проблема связана с заполнением частей «SecurityGroupIngress / Egress», поскольку они содержат массивы json, и, насколько я понимаю, вы можете передавать только строки или числа через параметры.

Вот пример;

Родительский стек:

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "CloudFormation template to create all Security Groups",  
    "Resources": {
        "CommonSecurityGroupStack" : {
            "Type" : "AWS::CloudFormation::Stack",
            "DependsOn": [
            ],
            "Properties" : {
                "TemplateURL" : "https://s3.template.url/template.name",
                "TimeoutInMinutes" : "60",
                "Parameters": {
                    "VPC" : { "Ref": "VPC" },
                    "VpcCidrRange": { "Ref": "VpcCidrRange" },
                    "SecurityGroupIngress": { "Something here" },
                    "SecurityGroupName": "CommonSecurityGroup"
                }
            }
        }     
    }
}

Вложенный стек:

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "CloudFormation template to create a security group",
    "Parameters": {
        "VPC": {
            "Description": "Name of the VPC",
            "Type": "String"
        },
        "GroupDescription": {
            "Description": "Description of Security Group",
            "Type": "String"
        },
        "SecurityGroupIngress" : {
            "Description": "List of rules for the Security Group Ingress"
        },
        "VpcCidrRange": {
            "Description": "CIDR IP range",
            "Type": "String",
            "MinLength": "9",
            "MaxLength": "18",
            "Default": "0.0.0.0/0",
            "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
            "ConstraintDescription": "must be a valid CIDR range of the form x.x.x.x/x."
        },
        "SecurityGroupName": {
            "Description": "Name of the Security Group",
            "Type": "String"
        }
    },
    "Resources": {
        "SecurityGroup": {
            "DependsOn": [],
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": { "Ref": "GroupDescription" },
                "VpcId": {
                    "Ref": "VPC"
                },
                "SecurityGroupIngress": {"Ref" : "SecurityGroupIngress"},
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": { "Ref": "SecurityGroupName" }
                    }
                ]
            }
        }
    }
}

Мне нужен способ передать что-то, эквивалентное следующему, в стек в качестве параметра для заполнения SecurityGroupIngress свойство.

[
    {
        "IpProtocol": "tcp",
        "FromPort": "22",
        "ToPort": "22",
        "CidrIp": {
          "Ref": "VpcCidrRange"
        }
    },
    {
        "IpProtocol": "tcp",
        "FromPort": "443",
        "ToPort": "443",
        "CidrIp": {
          "Ref": "VpcCidrRange"
        }
    }
]

К сожалению, CloudFormation не так сложна. Вы ограничены типами данных, которые можно использовать в качестве параметров:

  • Струны
  • Список строк, разделенных запятыми
  • Различные типы ресурсов AWS, ни один из которых не является правилами входа.

Вместо этого попробуйте следующее:

  • Добавьте параметры для включения / исключения различных правил входа,
  • Переместите правила входа во вложенный стек как AWS::EC2::SecurityGroupIngress ресурсы и
  • Используйте условия, основанные на ваших параметрах, чтобы включать / исключать различные правила входа

Ссылки: