こんにちはY.Oです。
先日、Classic Load Balancerを含むCloudFormationテンプレートの変更セットを作成する機会があり、
ユーザーガイドのAWS::ElasticLoadBalancing::LoadBalancerを確認していましたところ、LoadBalancerNameについて気になる説明を見つけました。
重要
名前を指定すると、このリソースの置換が必要な更新はできません。「中断」が不要であるか、一定の中断が必要な更新であれば、行うことができます。リソースを置き換える必要がある場合は、新しい名前を指定します。
初めて見たとき、上記の説明がよく分かりませんでした。
特に、リソース置換を伴う更新の辺りが。
恐らく次のようなことだろうなぁと理解しました。
「LoadBalancerNameでLBの名前を設定している場合、リソース置換を伴うプロパティを更新する為には、
LoadBalancerNameで設定した名前も併せて更新する必要がある。」
理解が間違っているといけないので、実際に簡単なCloudFormationテンプレートを作って、
次の内容を試してみることにしました。
- 設定したLoadBalancerNameを変更しないで、リソースの置換が必要なプロパティ更新を行う。
- 設定したLoadBalancerNameを変更して、リソースの置換が必要なプロパティ更新を行う。
まず、つぎのようなCloudFormationテンプレートでClassic Load Balancerを作ります。{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Test ELB Stack", "Resources": { "TestELB": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "LoadBalancerName" : "TestELB01", "Listeners": [ { "LoadBalancerPort" : "9000", "InstancePort" : "9000", "Protocol" : "TCP" } ], "Subnets" : [ "subnet-5688dd1f", "subnet-c7f9789c" ] } } } }
次に、リソースの置換が必要なプロパティの更新を行います。
ユーザーガイドによると、HealthCheckを指定していない状態から指定するように変更すると、置換が必要な変更となるようです。
まずはHealthCheckの初期値を確認しておきます。
以下のような結果でした。
Target : TCP:9000
Timeout : 5
Interval : 30
UnhealthyThreshold : 2
HealthyThreshold : 10
これを踏まえて、次のような更新用のテンプレートを作成しました。
Intervalを初期値より小さい20にしています。
LoadBalancerNameはまだ変更していません。{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Test ELB Stack", "Resources": { "TestELB": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "LoadBalancerName" : "TestELB01", "Listeners": [ { "LoadBalancerPort" : "9000", "InstancePort" : "9000", "Protocol" : "TCP" } ], "Subnets" : [ "subnet-5688dd1f", "subnet-c7f9789c" ], "HealthCheck" : { "Target" : "TCP:9000", "Timeout" : "5", "Interval" : "20", "UnhealthyThreshold" : "2", "HealthyThreshold" : "10" } } } } }
変更セットを適用してみます。
変更セットが失敗に終わり、ロールバックしてしまいました。
「状況の理由」欄にもちゃんと「Rename TestELB01 and update the stack again.」と表示されていますね。
次に、LoadBalancerNameを変えた変更セットを作ってみます。
TestELB01からTestELB02へ変更しています。{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Test ELB Stack", "Resources": { "TestELB": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "LoadBalancerName" : "TestELB02", "Listeners": [ { "LoadBalancerPort" : "9000", "InstancePort" : "9000", "Protocol" : "TCP" } ], "Subnets" : [ "subnet-5688dd1f", "subnet-c7f9789c" ], "HealthCheck" : { "Target" : "TCP:9000", "Timeout" : "5", "Interval" : "20", "UnhealthyThreshold" : "2", "HealthyThreshold" : "10" } } } } }
変更セットを適用してみます。
UPDATE_COMPLETEと表示されました。無事に置換が必要な適用が完了しました。
念のため、ロードバランサーのヘルスチェックも確認します。
こちらもちゃんと間隔が20秒に変更されました。
理解は間違っていなかったようです。よかった!