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