概要
Cloudformationにはカスタム名を指定可能なリソースが存在しますが、仕様上カスタム名を指定したリソースを置換更新しようとするとエラーになります。
エラーになるケース、コンソールで分かりやすく表示させる代替手段を記載します。
Cloudformationリソースのカスタム名
Nameタイプ
Cloudformationリソースには、一意の物理IDが自動付与されますが、この物理IDを手動で指定可能なNameタイプフィールドがあります。
Nameタイプのフィールド名はリソースによって異なります。
例えば、AWS::EC2::SecurityGroup であれば、"GroupName"が、該当します。
また、AWS::AutoScaling::LaunchConfigurationであれば、”LaunchConfigurationName”が該当しますが、これはドキュメントに明記されていません。(2020年3月8日時点)
カスタム名指定時の制約
リソースにカスタム名が指定されていると、Cloudformationでスタックを更新する際「リソースの置換更新」ができません。
置換更新等の更新動作については以下に記述があります。
どうにか置換更新したい場合は、一度カスタム名を変えて反映して、また元に戻すなど、方法はあるにはあるとは思います。
カスタム名を指定する動機
思いつく動機は以下です。
- AWSコンソールで見やすくしたい
- スタック外部からカスタム名で参照したい(S3バケット名など)
後者についてはカスタム名を指定するのが良さそうです。
勿論、スタックでバケット名をOutputし、それを参照する方がいいのですが、とはいえサクッとバケット名で参照したいことも多いと思います。
前者について、置換更新時の制約をどの程度受け入れられるかによりますが、「ちょっと変更したいんだけど置換更新になってしまう」というのは良くあると思います。
先日、AutoScaling groupの起動設定のリソースである AWS::AutoScaling::LaunchConfiguration で InstanceType を変更する際に、これに遭遇しました。
カスタム名指定時と未指定時の更新の様子
最初の例として、AWS::AutoScaling::LaunchConfiguration を使用します。
カスタム名を指定した LunchConfigration の更新
以下のテンプレートでスタックを作成します。
スタック名: lunchconfig-named
AWSTemplateFormatVersion: '2010-09-09'
Description: Named LaunchConfiguration
Parameters:
InstanceType:
Type: String
Resources:
LaunchConfiguration:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
LaunchConfigurationName: my-launch-configration
ImageId: ami-0af1df87db7b650f4
InstanceType: !Ref InstanceType
パラメータのInstanceTypeは"t3.nano"で作成
作成された起動設定では「名前」に指定したものが表示されていて、非常に見やすいです。
InstanceTypeを"t3.nano" → "t3.micro"に変えてスタックを更新しようとしてみます。
カスタム名を指定したリソースの置換更新はできないよと怒られます。
CloudFormation cannot update a stack when a custom-named resource requires replacing.
Rename my-launch-configration and update the stack again.
AWS::AutoScaling::LaunchConfiguration のドキュメントで、InstanceTypeは置換更新が必要であると記載があるので、この挙動になるということが分かります。
せっかく分かりやすい表示なのですが、こういった更新時にエラーとなるのは不便です。
カスタム名を指定しない LunchConfigration の更新
今度は、以下のテンプレートでスタックを作成します。
LaunchConfigurationName が削除されています。
スタック名: lunchconfig-unnamed
AWSTemplateFormatVersion: '2010-09-09'
Description: AutoScaling::LaunchConfiguration
Parameters:
InstanceType:
Type: String
Resources:
LaunchConfiguration:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
ImageId: ami-0af1df87db7b650f4
InstanceType: !Ref InstanceType
作成された起動設定では、自動生成された名前が表示されます。
以下の命名規則となるようです。
リソース論理IDは、上記テンプレートでの "Resources" 直下にある "LaunchConfiguration" を指します。
<スタック名>-<リソース論理ID>-<ランダム文字列>
(まあそこまで見づらいというほどでもないかも)
こちらも先ほどと同様に、InstanceTypeを"t3.nano" → "t3.micro"の更新をしようとすると、無事成功します。
タグ名を指定してコンソール上わかりやすく表示する
コンソール上の表示改善の代替案として、Nameタグを指定する方法があります。
タグを指定可能で、AWSコンソールからタグを表示できるリソースについては、Nameタグ指定を行うことで、指定した名称をコンソールに表示できます。
以下、セキュリティグループのテンプレート例です。
AWSTemplateFormatVersion: '2010-09-09'
Description: SecurityGroup
Resources:
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: my security group
Tags:
- Key: Name
Value: my-security-group
AWS::EC2::SecurityGroupのカスタム名はGroupNameですが、これを指定せず、Tagsに Name: <表示したい名称> を指定します。
Name欄に指定した名称が表示されます。
この対応は、コンソールでタグが表示できるものについてのみ可能です。
Nameタグが表示されていない場合は、右上の歯車アイコンから、列の表示を設定してください。
まとめ
カスタム名を指定したCloudformationリソースが更新時にエラーになるケースと、Nameタグを使用したAWSコンソールで見やすい表示名設定の代替案を記載しました。
作成済みスタックの置換更新時エラーは、忘れた頃に遭遇することも多いので、初期構築時にこの辺の挙動の意識しておいた方が良さそうです。