web-dev-qa-db-ja.com

AWS CloudFormationの条件付きプロパティ

EC2インスタンスを作成するためのAWS CloudFormationテンプレートがあります。しかし、それらのいくつかは特定のPrivateIpAddressを必要とし、私はそれをテンプレートに組み込む方法を理解するのに苦労しています。

とりあえず、テンプレートパラメータPrivateIPと条件の作成RequestedPrivateIPを用意しました。ここまでは順調ですね。しかし、それをAWS::EC2::Instanceリソース仕様に組み込む方法がわかりません。私はこれを試しました:

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

しかし、RequestedPrivateIPがfalseの場合は失敗します

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

オプションで静的プライベートIPを割り当て、指定がない場合はAWSに任せて動的IPを設定する方法はありますか?

10
MLu

構造を次のように変更します。

"PrivateIpAddress": {
    "Fn::If": [ "RequestedPrivateIP",
        { "Ref": "PrivateIP" },
        {"Ref" : "AWS::NoValue" }
    ]
}

aWS :: NoValueは、ifステートメントのelseオプションを提供するためにあります。 http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html

22
Graeme

PrivateIpAddressプロパティは値として空の文字列をサポートしていないようなので、AWS::EC2::Instanceの2つの個別のリソースを作成することをお勧めします。それらの1つはあなたの状態RequestedPrivateIPを持ちますが、もう1つは同じ状態を持つべきですが否定されます。 DidNotRequestPrivateIP

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

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