スタックリファクタリング
こんちには
業務でAWSのCloudformaionを使ったIaC開発を行っております。
つい最近、マネコン上のcloudformaionページに新しい「スタックリファクタリング」という便利な機能が追加されていたので紹介します。
スタックリファクタリングとは
スタックリファクタリングとはリソースに対し、リソースのプロパティやデータを維持したままスタック間の移動を可能にする機能です。リソースを複数のスタックに切り分けたり、複数のスタックを1つにまとめたりできます。
通常、変更セットなどで更新をかけるとリソースの置換が発生しまい、かなり面倒な手間がかかります。
更に、リソースのプロパティをExportしていてリソース間の依存関係が発生している場合は最悪です。
変更セットを実行しようとしてもリソースの置換が発生すると依存関係が崩れてしまうので、論理名を変更だけでも関連リソースを含め、リソースの作り直しが必要でした。
しかし、スタックリファクタリングを使うとリソースの置換なしに簡単に論理名の変更ができます。
やってみる
まず適当にEC2を作ります
論理名:EC2InstanceBefore
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to enable SSH access
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: Must be the name of an existing EC2 KeyPair
LatestAmiId:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
Description: Latest Amazon Linux 2023 AMI ID
Resources:
# セキュリティグループ
EC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable SSH access via port 22
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-SecurityGroup'
# EC2インスタンス
EC2InstanceBefore:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
ImageId: !Ref LatestAmiId
KeyName: !Ref KeyName
SecurityGroups:
- !Ref EC2SecurityGroup
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-Instance'
UserData:
Fn::Base64: !Sub |
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Hello from ${AWS::StackName}</h1>" > /var/www/html/index.html
Outputs:
InstanceId:
Description: Instance ID of the EC2 instance
Value: !Ref EC2InstanceBefore
Export:
Name: !Sub '${AWS::StackName}-InstanceId'
CloudFormationページ左のメニューからスタックリファクタリングを選択します。
変更するスタックを選択し、修正後のテンプレートをアップロードします。
差分↓
...
# EC2インスタンス
EC2InstanceAfter: # Here
...
Outputs:
InstanceId:
Description: Instance ID of the EC2 instance
Value: !Ref EC2InstanceAfter # Here
...
今回はスタックの更新なのでスタック2はスタックなしを選択します。
リソースマッピングで変更前と変更後が正しくマッピングされているか確認します。
論理IDの変更が表示される
変更できました!
今回の例では確認できませんが、論理名を変更するリソースから値を別スタックでImportしている場合も依存関係が壊れずに問題なく動作することは確認済みです。
※例えば下のInstanceIdを別のALBなどでImportしている場合
...
Outputs:
InstanceId:
Description: Instance ID of the EC2 instance
Value: !Ref EC2InstanceAfter # Here
...
ちなみに
変更セットだとリソースの置換が発生する。
依存関係があるとそれらを消してから作り直さないといけない(実行できない)。

まとめ
すごい便利な機能です。
まだまだ使い方ありそうなのでいろいろ検証してみてください。






