1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloudformationで論理名(ロジカルID)を変更する

1
Posted at

スタックリファクタリング

こんちには
業務でAWSのCloudformaionを使ったIaC開発を行っております。

つい最近、マネコン上のcloudformaionページに新しい「スタックリファクタリング」という便利な機能が追加されていたので紹介します。

image.png

スタックリファクタリングとは

スタックリファクタリングとはリソースに対し、リソースのプロパティやデータを維持したままスタック間の移動を可能にする機能です。リソースを複数のスタックに切り分けたり、複数のスタックを1つにまとめたりできます。

通常、変更セットなどで更新をかけるとリソースの置換が発生しまい、かなり面倒な手間がかかります。

更に、リソースのプロパティをExportしていてリソース間の依存関係が発生している場合は最悪です。
変更セットを実行しようとしてもリソースの置換が発生すると依存関係が崩れてしまうので、論理名を変更だけでも関連リソースを含め、リソースの作り直しが必要でした。

しかし、スタックリファクタリングを使うとリソースの置換なしに簡単に論理名の変更ができます。

やってみる

まず適当にEC2を作ります
論理名:EC2InstanceBefore

.yaml
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ページ左のメニューからスタックリファクタリングを選択します。

image.png

変更するスタックを選択し、修正後のテンプレートをアップロードします。
差分↓

.yaml
...
  # EC2インスタンス
  EC2InstanceAfter: # Here
...
Outputs:
  InstanceId:
    Description: Instance ID of the EC2 instance
    Value: !Ref EC2InstanceAfter # Here
...

今回はスタックの更新なのでスタック2はスタックなしを選択します。

image.png

リソースマッピングで変更前と変更後が正しくマッピングされているか確認します。

image.png

論理IDの変更が表示される

image.png

変更できました!

image.png
image.png

今回の例では確認できませんが、論理名を変更するリソースから値を別スタックでImportしている場合も依存関係が壊れずに問題なく動作することは確認済みです。

※例えば下のInstanceIdを別のALBなどでImportしている場合

.yaml
...
Outputs:
  InstanceId:
    Description: Instance ID of the EC2 instance
    Value: !Ref EC2InstanceAfter # Here
...

ちなみに

変更セットだとリソースの置換が発生する。
依存関係があるとそれらを消してから作り直さないといけない(実行できない)。
image.png

まとめ

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?