sorta kinda...

主にAWS関連ですが、これに限らずいろいろ勉強したことや思ったことを書いていきます。

CloudFormation テンプレートのパラメータ値で作成するリソースを制御する

最近なんとなく JSON に慣れすぎて YAML が逆に見にくく感じてしまいます。那須です。

CloudFormation って指定したパラメータで AWS リソースを作成するだけだと思われがちですが、入力したパラメータ値によって作るリソースの設定を変えたり、そもそもリソースを作らないようにしたりすることもできます。 今回は EC2 インスタンスを作成する際の IP アドレスの指定を柔軟に変える方法をご紹介します。

 

やりたいこと

EC2 インスタンスを作成する時に、eth0 のネットワークインタフェースの IP アドレスを DHCP で自動割り当てにするか固定アドレスにするかをパラメータ値で制御したい

 

作ってみた

パラメータ IpAddress で IP アドレスを入力すると、その IP アドレスを持った NIC がついた EC2 インスタンスが作成されます。
条件 IsUseDhcp で、パラメータ IpAddress が空欄だったら true を返し、そうでなければ false を返すようにします。
リソースプロパティ PrivateIpAddress で、IsUseDhcp が true だったら PrivateIpAddress は作らない(プライベート IP アドレスは指定しない)、false だったらパラメータ IpAddress で PrivateIpAddress を作成します。 PrivateIpAddress を作らない場合は、IP アドレスは DHCP での自動割り当てになります。

{
    "Parameters": {
        "IpAddress": {
            "Type": "String"
        },(省略)
    },
    "Conditions": {
        "IsUseDhcp": {
            "Fn::Equals": [
                {
                    "Ref": "IpAddress"
                },
                ""
            ]
        }
    },
    "Resources": {
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "NetworkInterfaces": [
                    {
                        "DeviceIndex": "0",
                        "PrivateIpAddress": {
                            "Fn::If": [
                                "IsUseDhcp",
                                {
                                    "Ref": "AWS::NoValue"
                                },
                                {
                                    "Ref": "IpAddress"
                                }
                            ]
                        },(省略)
}

実行結果の比較をしたかったですが、お題が悪かったせいかどちらにしても IP アドレスがついてしまって比較にならないので、今回は確認は省きます… EC2 インスタンス 1 台作成するだけのテンプレートは簡単に作れますし、どこかにサンプルがあるような気がするので、ぜひ試してみてください。

 

AWS ドキュメントで見るサンプル

条件分岐のサンプルテンプレートは AWS ドキュメントが公開されていますので、参考になると思います。
docs.aws.amazon.com

NIC 作成の際のドキュメントはこちら
docs.aws.amazon.com

 

AWS 使いこなしたい人!

AWS を使ったプロジェクトに参加してみたい方! ご連絡いただけると嬉しいです! www.beex-inc.com