AWS CloudFormation中的条件属性


10

我们有一个用于创建一些EC2实例的AWS CloudFormation模板。但是其中一些需要具体说明PrivateIpAddress,我正在努力弄清楚如何将其合并到模板中。

现在,我有了一个模板参数PrivateIP和一个Condition条件RequestedPrivateIP。到现在为止还挺好。但是我不知道如何将其合并到AWS::EC2::Instance资源规范中。我尝试了这个:

    "PrivateIpAddress": {
        "Fn::If": [ "RequestedPrivateIP",
            { "Ref": "PrivateIP" },
            ""                            <-- This doesn't work
        ]
    },

但是,当失败RequestedPrivateIP是假的

CREATE_FAILED    AWS::EC2::Instance    NodeInstance    Invalid addresses: []

有什么想法可以选择分配静态私有IP,如果未指定,则将其留给AWS来设置动态私有IP?

Answers:



0

由于该PrivateIpAddress属性似乎不支持空字符串作为其值,因此建议您创建两个独立的资源AWS::EC2::Instance。其中一个将满足您的条件,RequestedPrivateIP而另一个应具有相同的条件但取反,例如DidNotRequestPrivateIP

"InstanceWithPrivateIp": {
    "Type": "AWS::EC2::Instance",
    "Condition": "RequestedPrivateIP",
    "Properties": {
        [...]
    }
},

"InstanceWithoutPrivateIp": {
    "Type": "AWS::EC2::Instance",
    "Condition": "DidNotRequestPrivateIP",
    "Properties": {
        [...]
    }
}

1
这确实是一个选择,但严重违反了我不愿做的DRY(不要重复自己)原则。除此之外-通常还会设置其他属性,例如,ELB是否基于是否设置了SSL证书来监听HTTPS。尝试通过稍作更改来重复所有声明来捕获所有这些小的变化,将很快导致大量无法维护的模板。但是还是谢谢你的建议。
MLu 2014年

1
我完全同意您的意见,@ MLu,重复从来都不是一件有趣的事。但是,根据我在CloudFormation方面的经验,您有时不得不重做。我看到的另一种解决方案是创建子堆栈,而不是将其包含在上面提到的条件中,然后在这些子堆栈中执行针对该条件的特定工作。
巴兹2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.