Выходы не генерируются в зависимости от условия - PullRequest
0 голосов
/ 20 сентября 2019

В моем шаблоне cf я определил набор условий, и эти условия также вызываются в разделе ресурсов, однако, когда я пытаюсь сгенерировать выходные данные, используя условия, которые не работают должным образом.

{
    "AWSTemplateFormatVersion": "2010-09-09",

    "Description": "CloudFormation to Deploy EMR clusters",

    "Parameters": {
        "Applications": {
            "Default": "Core Hadoop",
            "Description": "Installed Applications",
            "Type": "String",
            "AllowedValues" : ["Core Hadoop","HBase"],
            "ConstraintDescription": "Must be valid Applications"
        },
        "awsRegion": {
            "Default" : "<my-region>",
            "Description": "awsRegion",
            "Type": "String"
        },
        "Ec2KeyName": {
            "Default": "<my-key.pem>",
            "Description": "Ec2KeyName",
            "Type": "String"
        }
    },
    "Resources": {
        "EMRCluster1": {
            "Type" : "AWS::EMR::Cluster",
            "Condition" : "CH", 
            "Properties" : {
                "Applications" :  [
                    {
                        "Name": "Hadoop"
                    },
                    {
                        "Name": "Hive"
                    },
                    {
                        "Name": "Hue"
                    },
                    {
                      "Name": "Pig"
                    },
                    {
                      "Name": "Mahout"
                    },
                    {
                      "Name": "Tez"
                    }
                ]
            }
        }
        "EMRCluster2": {
            "Type" : "AWS::EMR::Cluster",
            "Condition" : "HB", 
            "Properties" : {
                "Applications": [
                    {
                        "Name": "Hadoop"
                    },
                    {
                        "Name": "Hive"
                    },
                    {
                        "Name": "Hue"
                    },
                    {
                        "Name": "HBase"
                    },
                    {
                        "Name": "Phoenix"
                    },
                    {
                       "Name": "ZooKeeper"
                    }
                ]
            }
        }
    }

    "Conditions" : {
    "CH" : {"Fn::Equals" : [{"Ref" : "Applications"}, "Core Hadoop"]},
    "HB" : {"Fn::Equals" : [{"Ref" : "Applications"}, "HBase"]}
    },
    "Outputs": {
    "MasterPublicDnsName": {
        "Condition" : "CH",
        "Value": {
        "Fn::GetAtt": [
        "EMRCluster1",
        "MasterPublicDNS"
        ]
        },
        "Description": "MasterPublicDNS for cluster"
    },
    "MasterPublicDnsName": {
        "Condition" : "HB",
        "Value": {
        "Fn::GetAtt": [
        "EMRCluster2",
        "MasterPublicDNS"
        ]
        },
        "Description": "MasterPublicDNS for cluster"
    }
    }

Ожидается: Если я выбираю «CH» в параметрах, то он должен давать кластерные данные masterdns, а если я выбираю «HB», то он должен предоставлять masterdns кластера 2

Actual: Если я выбираю «HB», который является последним разделом в выводе,это даст мне masterdns cluster2, однако, если я выберу раздел «CH» в разделе облачных данных, я получу «Выходы не найдены».

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

1 Ответ

1 голос
/ 20 сентября 2019

Проблема, вероятно, существует, потому что вы используете одно и то же имя для обоих выходов.Поскольку поведение JSON с дублирующимися ключами не определено, язык реализации может выбирать, как вести себя в этой ситуации.Предположительно, во второй раз, когда вы используете MasterPublicDnsName в качестве выходного имени, вы перезаписываете первое имя, что согласуется с наблюдаемым вами поведением.

Вы можете выбрать два разных имени,но это может затруднить использование перекрестных ссылок или использовать оператор Fn::If в качестве значения вывода:

"Fn::If": [condition_name, value_if_true, value_if_false]

Или в вашем случае:

"Fn::If": ["CH", {"Fn::GetAtt": ["EMRCluster1", "MasterPublicDNS"]}, {"Fn::GetAtt": ["EMRCluster2", "MasterPublicDNS"]}]

Если вынужно более двух вариантов, вам нужно вложить ваши Fn::If заявления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...