diff --git a/moto/rds/models.py b/moto/rds/models.py index 744b35a11..871e0b926 100644 --- a/moto/rds/models.py +++ b/moto/rds/models.py @@ -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) diff --git a/moto/rds/responses.py b/moto/rds/responses.py index badb0dea9..2c9423716 100644 --- a/moto/rds/responses.py +++ b/moto/rds/responses.py @@ -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) diff --git a/tests/test_rds/test_rds.py b/tests/test_rds/test_rds.py index 851828762..4749405bf 100644 --- a/tests/test_rds/test_rds.py +++ b/tests/test_rds/test_rds.py @@ -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():