RDS: Ensure cross-region replica returns ARN (#5503)

This commit is contained in:
Bert Blommers 2022-09-28 22:07:29 +00:00 committed by GitHub
parent b176feb540
commit f082562b0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 4 deletions

View File

@ -644,7 +644,11 @@ class Database(CloudFormationModel):
)
def add_replica(self, replica):
self.replicas.append(replica.db_instance_identifier)
if self.region_name != replica.region_name:
# Cross Region replica
self.replicas.append(replica.db_instance_arn)
else:
self.replicas.append(replica.db_instance_identifier)
def remove_replica(self, replica):
self.replicas.remove(replica.db_instance_identifier)
@ -772,7 +776,7 @@ class Database(CloudFormationModel):
if source_db_identifier:
# Replica
db_kwargs["source_db_identifier"] = source_db_identifier
database = rds_backend.create_database_replica(db_kwargs)
database = rds_backend.create_db_instance_read_replica(db_kwargs)
else:
database = rds_backend.create_db_instance(db_kwargs)
return database
@ -1360,7 +1364,7 @@ class RDSBackend(BaseBackend):
return self.database_snapshots.pop(db_snapshot_identifier)
def create_database_replica(self, db_kwargs):
def create_db_instance_read_replica(self, db_kwargs):
database_id = db_kwargs["db_instance_identifier"]
source_database_id = db_kwargs["source_db_identifier"]
primary = self.find_db_from_id(source_database_id)
@ -1370,6 +1374,7 @@ class RDSBackend(BaseBackend):
# Shouldn't really copy here as the instance is duplicated. RDS replicas have different instances.
replica = copy.copy(primary)
replica.update(db_kwargs)
replica.region_name = self.region_name
replica.set_as_replica()
self.databases[database_id] = replica
primary.add_replica(replica)

View File

@ -176,7 +176,7 @@ class RDSResponse(BaseResponse):
def create_db_instance_read_replica(self):
db_kwargs = self._get_db_replica_kwargs()
database = self.backend.create_database_replica(db_kwargs)
database = self.backend.create_db_instance_read_replica(db_kwargs)
template = self.response_template(CREATE_DATABASE_REPLICA_TEMPLATE)
return template.render(database=database)

View File

@ -1713,6 +1713,10 @@ def test_create_database_replica():
master["DBInstances"][0]["ReadReplicaDBInstanceIdentifiers"].should.equal(
["db-replica-1"]
)
replica = conn.describe_db_instances(DBInstanceIdentifier="db-replica-1")[
"DBInstances"
][0]
replica["ReadReplicaSourceDBInstanceIdentifier"].should.equal("db-master-1")
conn.delete_db_instance(DBInstanceIdentifier="db-replica-1", SkipFinalSnapshot=True)
@ -1720,6 +1724,39 @@ def test_create_database_replica():
master["DBInstances"][0]["ReadReplicaDBInstanceIdentifiers"].should.equal([])
@mock_rds
def test_create_database_replica_cross_region():
us1 = boto3.client("rds", region_name="us-east-1")
us2 = boto3.client("rds", region_name="us-west-2")
source_id = "db-master-1"
source_arn = us1.create_db_instance(
DBInstanceIdentifier=source_id,
AllocatedStorage=10,
Engine="postgres",
DBInstanceClass="db.m1.small",
)["DBInstance"]["DBInstanceArn"]
target_id = "db-replica-1"
target_arn = us2.create_db_instance_read_replica(
DBInstanceIdentifier=target_id,
SourceDBInstanceIdentifier=source_arn,
DBInstanceClass="db.m1.small",
)["DBInstance"]["DBInstanceArn"]
source_db = us1.describe_db_instances(DBInstanceIdentifier=source_id)[
"DBInstances"
][0]
source_db.should.have.key("ReadReplicaDBInstanceIdentifiers").equals([target_arn])
target_db = us2.describe_db_instances(DBInstanceIdentifier=target_id)[
"DBInstances"
][0]
target_db.should.have.key("ReadReplicaSourceDBInstanceIdentifier").equals(
source_arn
)
@mock_rds
@mock_kms
def test_create_database_with_encrypted_storage():