Amazon RDS (Relational Database Service) ist ein leistungsstarker und skalierbarer Datenbankdienst, der von AWS angeboten wird. Manchmal müssen Sie jedoch aus Compliance- oder Sicherheitsgründen eine vorhandene unverschlüsselte Datenbankinstanz verschlüsseln. In diesem Artikel gehen wir durch ein Python-Skript, das den Prozess der Migration einer unverschlüsselten Amazon RDS-Instanz zu einer verschlüsselten Instanz automatisiert.
Die Verschlüsselung von RDS-Instanzen stellt sicher, dass ruhende Daten sicher sind und verschiedene Compliance-Anforderungen wie PCI DSS, HIPAA und mehr erfüllen. Durch die Verschlüsselung wird sichergestellt, dass Backups, Snapshots und der zugrunde liegende Speicher Ihrer RDS-Datenbank automatisch verschlüsselt werden.
Allerdings können Sie die Verschlüsselung nicht direkt auf einer vorhandenen unverschlüsselten RDS-Instanz aktivieren. Stattdessen müssen Sie einen Snapshot erstellen, diesen Snapshot mit aktivierter Verschlüsselung kopieren und dann eine neue RDS-Instanz aus dem verschlüsselten Snapshot wiederherstellen.
Das werden wir in diesem Tutorial automatisieren.
Um diesem Leitfaden folgen zu können, benötigen Sie:
pip install boto3
Sie benötigen außerdem die folgenden AWS-Anmeldeinformationen:
Dieses Python-Skript automatisiert die folgenden Schritte:
import boto3 import time from botocore.exceptions import WaiterError class RDSEncryptionMigrator: def __init__(self, source_db_identifier, target_db_identifier, kms_key_alias, region='us-east-1'): self.source_db_identifier = source_db_identifier self.target_db_identifier = target_db_identifier self.kms_key_alias = kms_key_alias if kms_key_alias.startswith('alias/') else f'alias/{kms_key_alias}' self.region = region self.rds_client = boto3.client('rds', region_name=region) self.kms_client = boto3.client('kms', region_name=region) def get_kms_key_id(self): """Get the KMS key ID from the alias""" try: response = self.kms_client.describe_key( KeyId=self.kms_key_alias ) return response['KeyMetadata']['Arn'] except Exception as e: print(f"Error getting KMS key ID from alias: {e}") raise def create_snapshot(self, snapshot_identifier): print(f"Creating snapshot of source database: {self.source_db_identifier}") response = self.rds_client.create_db_snapshot( DBSnapshotIdentifier=snapshot_identifier, DBInstanceIdentifier=self.source_db_identifier ) # Wait for snapshot to be available waiter = self.rds_client.get_waiter('db_snapshot_available') try: waiter.wait( DBSnapshotIdentifier=snapshot_identifier, WaiterConfig={'Delay': 30, 'MaxAttempts': 60} ) except WaiterError as e: print(f"Error waiting for snapshot: {e}") raise return response['DBSnapshot']['DBSnapshotArn'] def create_encrypted_snapshot_copy(self, source_snapshot_id, encrypted_snapshot_id): print("Creating encrypted copy of snapshot") kms_key_id = self.get_kms_key_id() response = self.rds_client.copy_db_snapshot( SourceDBSnapshotIdentifier=source_snapshot_id, TargetDBSnapshotIdentifier=encrypted_snapshot_id, KmsKeyId=kms_key_id, CopyTags=True, SourceRegion=self.region ) # Wait for encrypted snapshot to be available waiter = self.rds_client.get_waiter('db_snapshot_available') try: waiter.wait( DBSnapshotIdentifier=encrypted_snapshot_id, WaiterConfig={'Delay': 30, 'MaxAttempts': 60} ) except WaiterError as e: print(f"Error waiting for encrypted snapshot: {e}") raise return response['DBSnapshot']['DBSnapshotArn'] def restore_from_snapshot(self, snapshot_identifier): print(f"Restoring new encrypted database from snapshot") # Get source DB instance details source_db = self.rds_client.describe_db_instances( DBInstanceIdentifier=self.source_db_identifier )['DBInstances'][0] # Restore the encrypted instance response = self.rds_client.restore_db_instance_from_db_snapshot( DBInstanceIdentifier=self.target_db_identifier, DBSnapshotIdentifier=snapshot_identifier, DBInstanceClass=source_db['DBInstanceClass'], VpcSecurityGroupIds=self._get_security_group_ids(source_db), DBSubnetGroupName=source_db['DBSubnetGroup']['DBSubnetGroupName'], PubliclyAccessible=source_db['PubliclyAccessible'], MultiAZ=source_db['MultiAZ'] ) # Wait for the new instance to be available waiter = self.rds_client.get_waiter('db_instance_available') try: waiter.wait( DBInstanceIdentifier=self.target_db_identifier, WaiterConfig={'Delay': 30, 'MaxAttempts': 60} ) except WaiterError as e: print(f"Error waiting for database restoration: {e}") raise return response['DBInstance']['DBInstanceArn'] def _get_security_group_ids(self, db_instance): return [sg['VpcSecurityGroupId'] for sg in db_instance['VpcSecurityGroups']] def perform_encryption(self): try: # Create timestamp for unique identifiers timestamp = int(time.time()) # Step 1: Create initial snapshot snapshot_id = f"{self.source_db_identifier}-snapshot-{timestamp}" self.create_snapshot(snapshot_id) # Step 2: Create encrypted copy of the snapshot encrypted_snapshot_id = f"{self.source_db_identifier}-encrypted-snapshot-{timestamp}" self.create_encrypted_snapshot_copy(snapshot_id, encrypted_snapshot_id) # Step 3: Restore from encrypted snapshot self.restore_from_snapshot(encrypted_snapshot_id) print(f""" Encryption process completed successfully! New encrypted database instance: {self.target_db_identifier} Next steps: 1. Verify the new encrypted instance 2. Update your application connection strings 3. Once verified, you can delete the old unencrypted instance """) except Exception as e: print(f"Error during encryption process: {e}") raise def main(): # These values should ideally come from environment variables or command line arguments source_db_identifier = 'database-2' target_db_identifier = 'database-2-enc' kms_key_alias = 'aws/rds' region = 'us-east-1' migrator = RDSEncryptionMigrator( source_db_identifier=source_db_identifier, target_db_identifier=target_db_identifier, kms_key_alias=kms_key_alias, region=region ) migrator.perform_encryption() if __name__ == '__main__': main()
Das Skript definiert eine Klasse RDSEncryptionMigrator, die Folgendes behandelt:
Durch die Verwendung des bereitgestellten Skripts können Sie den Verschlüsselungsprozess für Ihre RDS-Datenbanken automatisieren und sicherstellen, dass Ihre Daten sicher sind. Dieser Ansatz macht manuelle Eingriffe überflüssig und verringert das Risiko menschlicher Fehler im Migrationsprozess. Stellen Sie sicher, dass Sie die neue verschlüsselte Instanz überprüfen, die Verbindungszeichenfolgen Ihrer Anwendung aktualisieren und die alte unverschlüsselte Instanz entfernen, sobald Sie bereit sind.
Wenn Sie dies weiter skalieren möchten, können Sie dieses Skript in AWS Lambda oder AWS Step Functions integrieren, um den Prozess innerhalb Ihrer CI/CD-Pipeline weiter zu automatisieren.
Das obige ist der detaillierte Inhalt vonSo automatisieren Sie die Verschlüsselung einer Amazon RDS-Instanz mit Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!