Introducción a las integraciones sin ETL de Amazon RDS con Amazon Redshift
Antes de crear una integración sin ETL con Amazon Redshift, configure su base de datos de RDS y el almacenamiento de datos de Amazon Redshift con los parámetros y permisos necesarios. Durante la configuración, realizará los siguientes pasos:
Una vez que haya completado estos pasos, continúe con la Creación de integraciones sin ETL de Amazon RDS con Amazon Redshift.
sugerencia
Puede dejar que RDS complete estos pasos de configuración automáticamente mientras crea la integración, en lugar de hacerlos de forma manual. Para empezar inmediatamente a crear una integración, consulte Creación de integraciones sin ETL de Amazon RDS con Amazon Redshift.
Crear un grupo de parámetros de de base de datos personalizado
Las integraciones sin ETL de Amazon RDS con Amazon Redshift requieren valores específicos para los parámetros de base de datos que controlan el registro binario (binlog). Para configurar el registro binario, primero debe crear un grupo de parámetros personalizado de base de datos y, a continuación, asociarlo a la base de datos de origen.
Cree un grupo de parámetros de de base de datos personalizado con los siguientes ajustes. Para obtener instrucciones sobre cómo crear un grupo de parámetros, consulte Grupos de parámetros de base de datos para instancias de Amazon RDS.
-
binlog_format=ROW
-
binlog_row_image=full
Compruebe también que el parámetro binlog_row_value_options
no esté establecido en PARTIAL_JSON
.
Paso 2: seleccionar o crear una base de datos de origen
Tras crear un grupo de parámetros de de base de datos personalizado, seleccione o cree una base de datos de RDS para MySQL. Esta base de datos será el origen de la réplica de datos en Amazon Redshift. Para obtener instrucciones sobre cómo crear una instancia de base de datos multi-AZ o single-AZ, consulte Creación de una instancia de base de datos de Amazon RDS.
La base de datos debe ejecutar una versión de motor de base de datos compatible. Para obtener una lista de las versiones compatibles, consulte Regiones y motores de base de datos admitidos para las integraciones sin ETL de Amazon RDS con Amazon Redshift..
Para obtener instrucciones sobre cómo crear una instancia de base de datos multi-AZ o single-AZ, consulte Creación de una instancia de base de datos de Amazon RDS. Para obtener instrucciones sobre cómo crear un clúster de base de datos multi-AZ, consulte Creación de un clúster de base de datos multi-AZ para Amazon RDS.
Al crear la base de datos, en Configuración adicional, cambie el grupo de parámetros de de base de datos predeterminado por el grupo de parámetros personalizado que ha creado en el paso anterior.
nota
si asocia el grupo de parámetros a la base de datos después de haber creado la base de datos, debe reiniciar la base de datos a fin de aplicar los cambios antes de poder crear una integración sin ETL. Para obtener instrucciones, consulte Reinicio de una instancia de base de datos o Reinicio de un clúster de base de datos multi-AZ e instancias de base de datos de lector para Amazon RDS.
Además, asegúrese de que las copias de seguridad automáticas están activadas en la base de datos. Para obtener más información, consulte Habilitar las copias de seguridad automatizadas.
Paso 3: Creación de un almacén de datos de destino en Amazon Redshift
Tras crear la base de datos de origen, debe crear y configurar un almacenamiento de datos de destino en Amazon Redshift. El almacenamiento de datos debe cumplir los siguientes requisitos:
-
Uso de un tipo de nodo RA3 con al menos dos nodos o Redshift sin servidor.
-
Cifrado (si se utiliza un clúster aprovisionado). Para obtener más información, consulte Cifrado de base de datos de Amazon Redshift.
Para obtener instrucciones sobre cómo crear un almacenamiento de datos, consulte la sección Creación de un clúster para clústeres aprovisionados o Creación de un grupo de trabajo con un espacio de nombres para Redshift Serverless.
Activar la distinción entre mayúsculas y minúsculas en el almacén de datos
Para que la integración funcione, el parámetro de distinción entre mayúsculas y minúsculas (enable_case_sensitive_identifier
) debe estar habilitado en el almacenamiento de datos. De forma predeterminada, la distinción entre mayúsculas y minúsculas está desactivada en todos los clústeres y grupos de trabajo sin servidor de Redshift suministrados.
Para activar la distinción entre mayúsculas y minúsculas, realice los siguientes pasos en función del tipo de almacén de datos:
-
Clúster aprovisionado: para habilitar la distinción entre mayúsculas y minúsculas en un clúster aprovisionado, cree un grupo de parámetros personalizado con el parámetro
enable_case_sensitive_identifier
habilitado. A continuación, asocie el grupo de parámetros al clúster. Para obtener instrucciones, consulte la sección Administración de grupos de parámetros mediante la consola o Configuración de los valores de parámetros mediante la AWS CLI.nota
Recuerde reiniciar el clúster después de asociarlo el grupo de parámetros personalizado.
-
Grupo de trabajo sin servidor: para habilitar la distinción entre mayúsculas y minúsculas en un grupo de trabajo sin servidor de Redshift, debe usar AWS CLI. Actualmente, la consola de Amazon Redshift no permite modificar los valores de los parámetros de Redshift sin servidor. Envíe la siguiente solicitud de update-workgroup:
aws redshift-serverless update-workgroup \ --workgroup-name
target-workgroup
\ --config-parameters parameterKey=enable_case_sensitive_identifier,parameterValue=trueNo es necesario reiniciar un grupo de trabajo después de modificar los valores de los parámetros.
Configure la autorización para el almacenamiento de datos
Tras crear un almacenamiento de datos, debe configurar la base de datos de RDS de origen como origen de integración autorizado. Para obtener instrucciones, consulte Configuración de la autorización para el almacenamiento de datos de Amazon Redshift.
Configuración de una integración mediante los AWS SDK
En lugar de configurar cada recurso manualmente, puede ejecutar el siguiente script de Python para configurar automáticamente los recursos necesarios. El ejemplo de código utiliza AWS SDK for Python (Boto3)
Ejecute los siguientes comandos para asegurarse de que dispone de todas las dependencias necesarias:
pip install boto3 pip install time
En el script, si lo desea, modifique los nombres de los grupos de origen, destino y parámetros. La función final crea una integración denominada my-integration
después de configurar los recursos.
import boto3 import time # Build the client using the default credential configuration. # You can use the CLI and run 'aws configure' to set access key, secret # key, and default Region. rds = boto3.client('rds') redshift = boto3.client('redshift') sts = boto3.client('sts') source_db_name = 'my-source-db' # A name for the source database source_param_group_name = 'my-source-param-group' # A name for the source parameter group target_cluster_name = 'my-target-cluster' # A name for the target cluster target_param_group_name = 'my-target-param-group' # A name for the target parameter group def create_source_db(*args): """Creates a source RDS for MySQL DB instance""" response = rds.create_db_parameter_group( DBParameterGroupName=source_param_group_name, DBParameterGroupFamily='mysql8.0', Description='RDS for MySQL zero-ETL integrations' ) print('Created source parameter group: ' + response['DBParameterGroup']['DBParameterGroupName']) response = rds.modify_db_parameter_group( DBParameterGroupName=source_param_group_name, Parameters=[ { 'ParameterName': 'binlog_format', 'ParameterValue': 'ROW', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_row_image', 'ParameterValue': 'full', 'ApplyMethod': 'pending-reboot' } ] ) print('Modified source parameter group: ' + response['DBParameterGroupName']) response = rds.create_db_instance( DBInstanceIdentifier=source_db_name, DBParameterGroupName=source_param_group_name, Engine='mysql', EngineVersion='8.0.32', DBName='mydb', DBInstanceClass='db.m5.large', AllocatedStorage=15, MasterUsername=
'username'
, MasterUserPassword='Password01**
' ) print('Creating source database: ' + response['DBInstance']['DBInstanceIdentifier']) source_arn = (response['DBInstance']['DBInstanceArn']) create_target_cluster(target_cluster_name, source_arn, target_param_group_name) return(response) def create_target_cluster(target_cluster_name, source_arn, target_param_group_name): """Creates a target Redshift cluster""" response = redshift.create_cluster_parameter_group( ParameterGroupName=target_param_group_name, ParameterGroupFamily='redshift-1.0', Description='RDS for MySQL zero-ETL integrations' ) print('Created target parameter group: ' + response['ClusterParameterGroup']['ParameterGroupName']) response = redshift.modify_cluster_parameter_group( ParameterGroupName=target_param_group_name, Parameters=[ { 'ParameterName': 'enable_case_sensitive_identifier', 'ParameterValue': 'true' } ] ) print('Modified target parameter group: ' + response['ParameterGroupName']) response = redshift.create_cluster( ClusterIdentifier=target_cluster_name, NodeType='ra3.4xlarge', NumberOfNodes=2, Encrypted=True, MasterUsername='username', MasterUserPassword='Password01**', ClusterParameterGroupName=target_param_group_name ) print('Creating target cluster: ' + response['Cluster']['ClusterIdentifier']) # Retrieve the target cluster ARN response = redshift.describe_clusters( ClusterIdentifier=target_cluster_name ) target_arn = response['Clusters'][0]['ClusterNamespaceArn'] # Retrieve the current user's account ID response = sts.get_caller_identity() account_id = response['Account'] # Create a resource policy granting access to source database and account ID response = redshift.put_resource_policy( ResourceArn=target_arn, Policy=''' { \"Version\":\"2012-10-17\", \"Statement\":[ {\"Effect\":\"Allow\", \"Principal\":{ \"Service\":\"redshift.amazonaws.com\" }, \"Action\":[\"redshift:AuthorizeInboundIntegration\"], \"Condition\":{ \"StringEquals\":{ \"aws:SourceArn\":\"%s\"} } }, {\"Effect\":\"Allow\", \"Principal\":{ \"AWS\":\"arn:aws:iam::%s:root\"}, \"Action\":\"redshift:CreateInboundIntegration\"} ] } ''' % (source_arn, account_id) ) return(response) def wait_for_db_availability(*args): """Waits for both databases to be available""" print('Waiting for source and target to be available...') response = rds.describe_db_instances( DBInstanceIdentifier=source_db_name ) source_status = response['DBInstances'][0]['DBInstanceStatus'] source_arn = response['DBInstances'][0]['DBInstanceArn'] response = redshift.describe_clusters( ClusterIdentifier=target_cluster_name ) target_status = response['Clusters'][0]['ClusterStatus'] target_arn = response['Clusters'][0]['ClusterNamespaceArn'] # Every 60 seconds, check whether the databases are available if source_status != 'available' or target_status != 'available': time.sleep(60) response = wait_for_db_availability( source_db_name, target_cluster_name) else: print('Databases available. Ready to create zero-ETL integration.') create_integration(source_arn, target_arn) return def create_integration(source_arn, target_arn): """Creates a zero-ETL integration using the source and target databases""" response = rds.create_integration( SourceArn=source_arn, TargetArn=target_arn, IntegrationName='my-integration
' ) print('Creating integration: ' + response['IntegrationName']) def main(): """main function""" create_source_db(source_db_name, source_param_group_name) wait_for_db_availability(source_db_name, target_cluster_name) if __name__ == "__main__": main()
Siguientes pasos
Ahora que tiene una base de datos de RDS de origen y un almacenamiento de datos de destino de Amazon Redshift, puede crear una integración sin ETL y empezar a replicar los datos. Para obtener instrucciones, consulte Creación de integraciones sin ETL de Amazon RDS con Amazon Redshift.