CloudFormationを使ってAutoScalingGroupをALBにアタッチする時に困った話
CloudFormationを使ってALBにAutoScalingGroupを紐付けようとした時にドキュメントの解釈を間違えてかなり躓いてしまったので、メモしておきます。
AWSのCloudFormationのAWS::AutoScaling::AutoScalingGroupに関する日本語ドキュメントを読むとCloudFormationの定義は以下のようになっています。
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: String
AvailabilityZones:
- 文字列
Cooldown: String
DesiredCapacity: String
HealthCheckGracePeriod: Integer
HealthCheckType: String
InstanceId: String
LaunchConfigurationName: String
LaunchTemplate: LaunchTemplateSpecification
LifecycleHookSpecificationList:
- LifecycleHookSpecification
LoadBalancerNames:
- 文字列
MaxSize: String
MetricsCollection:
- MetricsCollection
MinSize: String
MixedInstancesPolicy:
MixedInstancesPolicy
NotificationConfigurations:
- NotificationConfiguration
PlacementGroup: String
ServiceLinkedRoleARN: String
Tags:
- TagProperty
TargetGroupARNs:
- 文字列
TerminationPolicies:
- 文字列
VPCZoneIdentifier:
- 文字列
注目する所としてはAutoScalingGroupの作成の際、どのELB(CLB/ALB/NLB)にリソースを紐付けるのか対応関係はAutoScalingGroup側に記述するために LoadBalancerNames という値を利用します。
この値の利用の仕方について解釈を間違ったため、めちゃくちゃハマりました。
LoadBalancerNames は以下のような記述で詳細が記されていました。
LoadBalancerNames
この Auto Scaling グループに関連付けられている クラシックロードバランサー のリスト。Application Load Balancer または Network Load Balancer を指定するには、代わりに TargetGroupARNs を使用します。Required: No
Type: List of String values
更新に伴う要件: 中断はありません。
ELBの場合ここに直接LBの名前を書いたりするわけですが、「ALBはTargetGroupのarnを書くのか…ふむふむ」と思い直接arnを書くとStackの更新が通らなくなってしまいました。
色々悩んだうちに、正解にはたどり着いたのですが、この記述を正しく解釈すると以下のようになります。
# 間違い
LoadBalancerNames:
- arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/aaaa
- arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/bbbb
# 正しい
TargetGroupARNs:
- arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/aaaa
- arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/bbbb
CloudFormationでは、設定できる値の種類はドキュメント冒頭にyamlかjsonで列挙されていると思っていたのですが、このように項目名が入れ替わるようなパラメーターも存在するみたいですね。