この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
前提
・東京リージョンと大阪リージョンのVPCが作成済みであること
・東京リージョンと大阪リージョンのRDS用のセキュリティグループが作成済みであること
・CloudFormationのテンプレートをyaml形式とする。
・AWSの管理者ユーザで検証しています。
・AWSコンソール上でスタックを作成します(作成手順を割愛します)。
・Aurora PostgreSQL リージョン別クラスターを構築済みであること
※リージョン別クラスターの構築を下記の記事を参照
CloudFormationでRDS(Aurora PostgreSQL リージョン別クラスター)を構築する
構築手順
1.リージョン別クラスターの確認
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