CloudFormationのForEach組み込み関数を使ってAuroraのインスタンスを動的に変化させて作成してみた

2023.09.25

こんにちは、AWS事業本部の木村です。

Auroraのテンプレートを作成している際、汎用的に使えるようにインスタンスの数を動的に変化させたかったのですが、Conditons句を使って条件分けしてテンプレートを作成すると冗長で分かりにくいテンプレートになってしまいました。

そこで先日アップデートで登場したForEach組み込み関数を使って実装してみました。

ForEach組み込み関数について

ForEach組み込み関数に関する説明は以下の記事をご参照ください。

テンプレート

では実際に試していきたいと思います。今回は以下のテンプレートを利用します。

DBInstance部分でForEach組み込み関数を利用しています。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::LanguageExtensions

  # 
  # Parameters
  # 
Parameters:
  DBInstanceClass:
    Description: The compute and memory capacity of the DB instance
    Default: "db.t4g.medium"
    Type: String
    MinLength: 1
  InstanceName:
    Type: List<String>
    Default: 1,2

  # 
  # Resources
  # 
Resources:
  PostgreSQLDBCluster:
    Type: AWS::RDS::DBCluster
    Properties:
      DBSubnetGroupName: aurora-test //事前に作成したサブネットグループの名前を入力してください
      Engine: aurora-postgresql
      MasterUsername: AdminUser
      MasterUserPassword: Passw0rd!
      VpcSecurityGroupIds: 
        - sg-XXXXXXX //事前に作成したセキュリティグループのIDを入力してください
  # 
  # PostgreSQL Instance
  # 
  'Fn::ForEach::PostgreSQLDBInstance':
    - Instance
    - !Ref InstanceName
    - 'Instance${Instance}':
        Type: "AWS::RDS::DBInstance"
        Properties:
          DBInstanceClass: !Ref DBInstanceClass
          DBInstanceIdentifier: !Sub aurora-test-postgresql-instance-${Instance} //${Instance}に配列の値が入ります
          DBClusterIdentifier: !Ref PostgreSQLDBCluster
          Engine: aurora-postgresql

やってみる

では実際にテンプレートを使って構築してみます。

まずは2つのインスタンスを作成する例から試してみます。

カンマ区切りでListの数が認識されますので、InstanceNameの入力をa,bと指定します。

そのまま、スタックを作成していきます。

無事、リソースを作成することができました。

実際に動作したテンプレートは以下でした(繰り返し部分のみ抜粋)

    "Instancea": {
      "Type": "AWS::RDS::DBInstance",
      "Properties": {
        "DBInstanceClass": "db.t4g.medium",
        "DBInstanceIdentifier": "aurora-test-postgresql-instance-a",
        "DBClusterIdentifier": {
          "Ref": "PostgreSQLDBCluster"
        },
        "Engine": "aurora-postgresql"
      }
    },
    "Instanceb": {
      "Type": "AWS::RDS::DBInstance",
      "Properties": {
        "DBInstanceClass": "db.t4g.medium",
        "DBInstanceIdentifier": "aurora-test-postgresql-instance-b",
        "DBClusterIdentifier": {
          "Ref": "PostgreSQLDBCluster"
        },
        "Engine": "aurora-postgresql"
      }
    }

次にテスト用や開発環境用に一つのインスタンスでも作成できるか試してみます。

InstanceNameの入力を1を指定します。これでループが1回となるのですが、問題なく動作するか確認します。

結果問題なく作成することができました。無事汎用的に使えそうです!

実際に動作したテンプレートは以下でした(繰り返し部分のみ抜粋)

    "Instance1": {
      "Type": "AWS::RDS::DBInstance",
      "Properties": {
        "DBInstanceClass": "db.t4g.medium",
        "DBInstanceIdentifier": "aurora-test-postgresql-instance-1",
        "DBClusterIdentifier": {
          "Ref": "PostgreSQLDBCluster"
        },
        "Engine": "aurora-postgresql"
      }
    }

まとめ

今回はAuroraのインスタンスでForEach組み込み関数を試してみましたが、繰り返しで作成することによって柔軟にテンプレートを作成できる例が増えるのではないかと思いました。

この記事がどなたかの参考になれば幸いです。