CloudFormationでRDS構築(Aurora PostgreSQL グローバル)を構築する


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

前提

・東京リージョンと大阪リージョンのVPCが作成済みであること
・東京リージョンと大阪リージョンのRDS用のセキュリティグループが作成済みであること
・CloudFormationのテンプレートをyaml形式とする。
・AWSの管理者ユーザで検証しています。
・AWSコンソール上でスタックを作成します(作成手順を割愛します)。
・Aurora PostgreSQL リージョン別クラスターを構築済みであること
※リージョン別クラスターの構築を下記の記事を参照
CloudFormationでRDS(Aurora PostgreSQL リージョン別クラスター)を構築する

構築手順

1.リージョン別クラスターの確認

file

2.既存リージョン(東京リージョン)別クラスターをグローバル化します。

2-1 テンプレート

RDS-Aurora-PostgreSQL-Global-From-ExistingClusters.yaml

AWSTemplateFormatVersion: 2010-09-09
Description: This CloudFormation template to Globalize existing clusters.
Parameters:
  GlobalClusterIdentifier:
    Type: String
    Description: Identifier used for global database cluster
    AllowedPattern: '^[a-zA-Z]{1}(?:-?[a-zA-Z0-9]){0,62}$'
  ExistingRDSCluster:
    Type: String
    Description: Identifier used for DB cluster
    AllowedPattern: '^[a-zA-Z]{1}(?:-?[a-zA-Z0-9]){0,62}$'
Resources:
  GlobalCluster:
    Type: 'AWS::RDS::GlobalCluster'
    Properties:
      GlobalClusterIdentifier: !Ref GlobalClusterIdentifier
      SourceDBClusterIdentifier: !Ref ExistingRDSCluster

2-2 作成時のパラメータ

2-3 作成後の確認

3.グローバルデータベースクラスターへの DB クラスターの追加(大阪リージョン追加)

大阪リージョンで CloudFormation を実行して、セカンダリークラスターを追加します。

3-1 テンプレート

RDS-Aurora-PostgreSQL-Global-AddRegion.yaml
コピペで利用できます。下記のパラメータを自分の環境に合わせて変更してご利用ください。
DBSubnet3a: { ID: subnet-xxxxxxxxxxxxxxxxx }
DBSubnet3c: { ID: subnet-xxxxxxxxxxxxxxxxx }
RdsSecurityGroup: { ID: sg-xxxxxxxxxxxxxxxxx }

AWSTemplateFormatVersion: 2010-09-09
Description: This CloudFormation template to Adding a DB cluster to a Global Database cluster.

Mappings:
  dev:
    DBSubnet3a: { ID: subnet-xxxxxxxxxxxxxxxxx }
    DBSubnet3c: { ID: subnet-xxxxxxxxxxxxxxxxx }
    RdsSecurityGroup: { ID: sg-xxxxxxxxxxxxxxxxx }
    DBInstance:
      Engine: aurora-postgresql
      EngineVersion: 13.7
      RDS1AvailabilityZone: ap-northeast-3a
      RDS2AvailabilityZone: ap-northeast-3c
      BackupRetentionPeriod: 7
      PreferredBackupWindow: 13:00-13:30
      ClusterPreferredMaintenanceWindow: tue:14:00-tue:14:30
      InstancePreferredMaintenanceWindow: wed:14:00-wed:14:30
      AutoMinorVersionUpgrade: true
      DBInstanceClass: db.r5.large
    DBParameterGroup:
      DBEngineFamily: aurora-postgresql13

Parameters:
  Environment:
    Description: Type of this environment.
    Type: String
    Default: dev
    AllowedValues:
    - dev

  SystemName:
    Description: Name of this system.
    Type: String
    Default: test-rds

  GlobalClusterIdentifier:
    Type: String
    Description: Identifier used for global database cluster
    AllowedPattern: '^[a-zA-Z]{1}(?:-?[a-zA-Z0-9]){0,62}$'
  RDSClusterIdentifier:
    Type: String
    Description: Identifier used for DB cluster
    AllowedPattern: '^[a-zA-Z]{1}(?:-?[a-zA-Z0-9]){0,62}$'

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: Environment Configuration
          Parameters:
            - SystemName
            - Environment
      - 
        Label:
          default: RDS DB instace Configuration
          Parameters:
            - Username
            - Password

Resources:
  # IAM Role for enhanced monitoring
  RDSMonitoringRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${SystemName}-${Environment}-rds-monitoring-role-osa
      Path: /
      AssumeRolePolicyDocument: !Sub |
        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": "monitoring.rds.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        }
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole

  RDSCluster:
    Type: AWS::RDS::DBCluster
    Properties:
      GlobalClusterIdentifier: !Ref GlobalClusterIdentifier
      DBClusterIdentifier: !Ref RDSClusterIdentifier
      Port: 5432
      Engine: !FindInMap [ !Ref Environment, DBInstance, Engine ]
      DBSubnetGroupName: !Ref DBSubnetGroup
      DBClusterParameterGroupName: !Ref RDSDBClusterParameterGroup
      KmsKeyId: alias/aws/rds
      VpcSecurityGroupIds:
        - !FindInMap [ !Ref Environment, RdsSecurityGroup, ID ]
      BackupRetentionPeriod: !FindInMap [ !Ref Environment, DBInstance, BackupRetentionPeriod ]
      PreferredBackupWindow: !FindInMap [ !Ref Environment, DBInstance, PreferredBackupWindow ]
      DeletionProtection: false
      EngineMode: provisioned
      EngineVersion: !FindInMap [ !Ref Environment, DBInstance, EngineVersion ]
      PreferredMaintenanceWindow: !FindInMap [ !Ref Environment, DBInstance, ClusterPreferredMaintenanceWindow ]
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${Environment}-aurora-posgre-cluster-osa

  RDSDBInstance1:
    Type: AWS::RDS::DBInstance
    Properties:
      DBSubnetGroupName: !Ref DBSubnetGroup
      DBParameterGroupName: !Ref RDSDBParameterGroup
      Engine: !FindInMap [ !Ref Environment, DBInstance, Engine ]
      EngineVersion: !FindInMap [ !Ref Environment, DBInstance, EngineVersion ]
      DBClusterIdentifier: !Ref RDSCluster
      AvailabilityZone: !FindInMap [ !Ref Environment, DBInstance, RDS1AvailabilityZone ]
      DBInstanceClass: !FindInMap [ !Ref Environment, DBInstance, DBInstanceClass ]
      AutoMinorVersionUpgrade: !FindInMap [ !Ref Environment, DBInstance, AutoMinorVersionUpgrade ]
      CopyTagsToSnapshot: true
      DBInstanceIdentifier: !Sub ${SystemName}-${Environment}-aurora-posgre-1
      EnablePerformanceInsights: true
      PreferredMaintenanceWindow: !FindInMap [ !Ref Environment, DBInstance, InstancePreferredMaintenanceWindow ]
      # DeletionProtection: true
      MonitoringInterval: 60
      MonitoringRoleArn: !GetAtt RDSMonitoringRole.Arn
      PubliclyAccessible: false
      PromotionTier: 1
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${Environment}-aurora-posgre-osa

  # DB subnet group
  DBSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupName: !Sub ${SystemName}-${Environment}-db-subnet-group
      DBSubnetGroupDescription: !Sub ${SystemName}-${Environment}-db-subnet-group
      SubnetIds:
        - !FindInMap [ !Ref Environment, DBSubnet3a, ID ]
        - !FindInMap [ !Ref Environment, DBSubnet3c, ID ]
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${Environment}-db-subnet-group

  # DB Cluster Parameter Group
  RDSDBClusterParameterGroup:
    Type: AWS::RDS::DBClusterParameterGroup
    Properties:
      Description: !Sub ${SystemName}-${Environment}-db-cluster-param-group
      Family: !FindInMap [ !Ref Environment, DBParameterGroup, DBEngineFamily ]
      Parameters:
        client_encoding: UTF8
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${Environment}-db-cluster-param-group

  # DB parameter group
  RDSDBParameterGroup:
    Type: AWS::RDS::DBParameterGroup
    Properties:
      Description: !Sub ${SystemName}-${Environment}-db-param-group
      Family: !FindInMap [ !Ref Environment, DBParameterGroup, DBEngineFamily ]
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${Environment}-db-param-group

3-2 作成時のパラメータ

3-3 作成後の確認

注意点1(暗号化)

Aurora PostgreSQL グローバルの作成元であるAurora PostgreSQL リージョン別クラスターが暗号化された場合、Aurora PostgreSQL グローバルのリージョン追加に暗号化キーの指定が必要です。
対象リソースタイプ:AWS::RDS::DBCluster
指定方法:KmsKeyId: alias/aws/rds

指定しない場合、下記のエラーメッセージがでます。

エラー:For encrypted cross-region replica, kmsKeyId should be explicitly specified

※暗号化されているかどうかの確認

注意点2(クロスリージョンレプリケーション)

Aurora PostgreSQLリージョン別クラスターの場合、クロスリージョンレプリケーションがサポートされていないため、複数のリージョンにAurora PostgreSQLを作成したい場合、Aurora PostgreSQL グローバルを構築することになります。

以下AWS公式より抜粋
Aurora PostgreSQL DB クラスターでは、異なる AWS リージョンの Aurora レプリカがサポートされていないので、クロスリージョンレプリケーションには Aurora レプリカを使用できません。

まとめ

今回、既存リージョン(東京リージョン)別クラスターをグローバル化してから、DB クラスターの追加(大阪リージョン追加)という流れでAurora PostgreSQL グローバルを構築しました。

暗号化のところでハマりましたが、無事に解決できて、嬉しいです!

参考

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Replication.html

Last modified: 2022-09-17

Author