Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Führen Sie Amazon Redshift SQL Redshift-Abfragen mithilfe von Terraform aus
Erstellt von Sylvia Qi (AWS) und Aditya Ambati () AWS
Code-Repository: terraform-execute-redshift-sql | Umgebung: PoC oder Pilotprojekt | Technologien: DevOps; Analytik; Große Datenmengen; Datenseen |
Arbeitslast: Open Source | AWSDienste: Amazon Redshift; AWS CLI |
Übersicht
Die Verwendung von Infrastructure as Code (IaC) für die Bereitstellung und Verwaltung von Amazon Redshift ist in diesem Bereich weit verbreitet. DevOps IaC erleichtert die Bereitstellung und Konfiguration verschiedener Amazon Redshift Redshift-Ressourcen wie Cluster, Snapshots und Parametergruppen. IaC erstreckt sich jedoch nicht auf die Verwaltung von Datenbankressourcen wie Tabellen, Schemas, Ansichten und gespeicherten Prozeduren. Diese Datenbankelemente werden über SQL Abfragen verwaltet und werden nicht direkt von IaC-Tools unterstützt. Obwohl es Lösungen und Tools für die Verwaltung dieser Ressourcen gibt, ziehen Sie es möglicherweise vor, keine zusätzlichen Tools in Ihren Technologie-Stack aufzunehmen.
Dieses Muster beschreibt eine Methode, die Terraform verwendet, um Amazon Redshift Redshift-Datenbankressourcen wie Tabellen, Schemas, Ansichten und gespeicherte Prozeduren bereitzustellen. Das Muster unterscheidet zwischen zwei Arten von Abfragen: SQL
Nicht wiederholbare Abfragen — Diese Abfragen werden einmal während der ersten Amazon Redshift Redshift-Bereitstellung ausgeführt, um die wesentlichen Datenbankkomponenten einzurichten.
Wiederholbare Abfragen — Diese Abfragen sind unveränderlich und können erneut ausgeführt werden, ohne die Datenbank zu beeinträchtigen. Die Lösung verwendet Terraform, um Änderungen an wiederholbaren Abfragen zu überwachen und sie entsprechend anzuwenden.
Voraussetzungen und Einschränkungen
Voraussetzungen
Sie müssen über ein aktives System verfügen AWS-Konto und Folgendes auf Ihrem Bereitstellungscomputer installieren:
AWS Command Line Interface (AWS CLI)
Ein mit Amazon Redshift Redshift-Lese-/Schreibberechtigungen konfiguriertes AWS CLI Profil
Einschränkungen
Diese Lösung unterstützt eine einzelne Amazon Redshift Redshift-Datenbank, da Terraform bei der Clustererstellung nur die Erstellung einer Datenbank ermöglicht.
Dieses Muster beinhaltet keine Tests zur Validierung von Änderungen an den wiederholbaren Abfragen, bevor sie angewendet werden. Wir empfehlen, solche Tests zu integrieren, um die Zuverlässigkeit zu erhöhen.
Zur Veranschaulichung der Lösung enthält dieses Muster eine
redshift.tf
Beispieldatei, die eine lokale Terraform-Statusdatei verwendet. Für Produktionsumgebungen empfehlen wir jedoch dringend, eine Remote-Statusdatei mit einem Sperrmechanismus zu verwenden, um die Stabilität und Zusammenarbeit zu verbessern.Einige AWS-Services sind nicht in allen verfügbar AWS-Regionen. Informationen zur Verfügbarkeit in den einzelnen Regionen finden Sie AWS-Services unter Nach Regionen
. Informationen zu bestimmten Endpunkten finden Sie unter Dienstendpunkte und Kontingente. Wählen Sie dort den Link für den Dienst aus.
Produktversionen
Diese Lösung wurde auf Amazon Redshift Patch 179 entwickelt und getestet.
Code-Repository
Der Code für dieses Muster ist im Repository GitHub amazon-redshift-sql-deploy-terraform
Architektur
Das folgende Diagramm zeigt, wie Terraform die Amazon Redshift Redshift-Datenbankressourcen verwaltet, indem es sowohl nicht wiederholbare als auch wiederholbare Abfragen verarbeitet. SQL
Das Diagramm zeigt die folgenden Schritte:
Terraform wendet während der ersten Bereitstellung des Amazon Redshift SQL Redshift-Clusters nicht wiederholbare Abfragen an.
Der Entwickler überträgt Änderungen an den wiederholbaren Abfragen. SQL
Terraform überwacht Änderungen an den wiederholbaren Abfragen. SQL
Terraform wendet wiederholbare SQL Abfragen auf die Amazon Redshift Redshift-Datenbank an.
Die durch dieses Muster bereitgestellte Lösung basiert auf dem Terraform-Modul für Amazonterraform_data
Ressourcen verwendet, die ein benutzerdefiniertes Python-Skript aufrufen, um SQL Abfragen mithilfe der Amazon Redshift Redshift-Operation ExecuteStatementAPIauszuführen. Infolgedessen kann das Modul Folgendes tun:
Stellen Sie eine beliebige Anzahl von Datenbankressourcen mithilfe von SQL Abfragen bereit, nachdem die Datenbank bereitgestellt wurde.
Überwachen Sie kontinuierlich die wiederholbaren SQL Abfragen auf Änderungen und wenden Sie diese Änderungen mithilfe von Terraform an.
Tools
AWS-Services
Amazon Redshift ist ein vollständig verwalteter Data-Warehouse-Service im Petabyte-Bereich in der. AWS Cloud
Andere Tools
Bewährte Methoden
Epen
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Klonen Sie das Repository. | Verwenden Sie den folgenden Befehl, um das Git-Repository zu klonen, das den Terraform-Code für die Bereitstellung eines Amazon Redshift Redshift-Clusters enthält.
| DevOps Ingenieur |
Aktualisieren Sie die Terraform-Variablen. | Um die Amazon Redshift Redshift-Cluster-Bereitstellung an Ihre spezifischen Anforderungen anzupassen, aktualisieren Sie die folgenden Parameter in der
| DevOps Ingenieur |
Stellen Sie die Ressourcen mit Terraform bereit. |
| DevOps Ingenieur |
(Optional) Führen Sie zusätzliche SQL Abfragen aus. | Das Beispiel-Repository bietet mehrere SQL Abfragen zu Demo-Zwecken. Um Ihre eigenen SQL Abfragen auszuführen, fügen Sie sie den folgenden Ordnern hinzu:
|
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Überwachen Sie die Bereitstellung von SQL Aussagen. | Sie können die Ergebnisse der SQL Ausführungen in einem Amazon Redshift Redshift-Cluster überwachen. Beispiele für Ausgaben, die eine fehlgeschlagene und eine erfolgreiche SQL Ausführung anzeigen, finden Sie unter SQLBeispielanweisungen unter Zusätzliche Informationen. | DBA, DevOps Ingenieur |
Ressourcen bereinigen. | Führen Sie den folgenden Befehl aus, um alle von Terraform bereitgestellten Ressourcen zu löschen.
| DevOps Ingenieur |
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Überprüfen Sie die Daten im Amazon Redshift Redshift-Cluster. |
| DBA, AWS DevOps |
Zugehörige Ressourcen
AWS Dokumentation
Sonstige Ressourcen
Befehl: apply
(Terraform-Dokumentation)
Zusätzliche Informationen
Exemplarische Vorgehensweise zur Lösung
Um die Lösung verwenden zu können, müssen Sie Ihre Amazon Redshift SQL Redshift-Abfragen auf eine bestimmte Weise organisieren. Alle SQL Abfragen müssen in Dateien mit einer .sql
Erweiterung gespeichert werden.
In dem mit diesem Muster bereitgestellten Codebeispiel sind die SQL Abfragen in der folgenden Ordnerstruktur organisiert. Sie können den Code (sql-queries.tf
undsql-queries.py
) so ändern, dass er mit jeder Struktur funktioniert, die Ihrem individuellen Anwendungsfall entspricht.
/bootstrap |- Any # of files |- Any # of sub-folders /nonrepeatable |- Any # of files |- Any # of sub-folders /repeatable /udf |- Any # of files |- Any # of sub-folders /table |- Any # of files |- Any # of sub-folders /view |- Any # of files |- Any # of sub-folders /stored-procedure |- Any # of files |- Any # of sub-folders /finalize |- Any # of files |- Any # of sub-folders
Angesichts der obigen Ordnerstruktur führt Terraform während der Bereitstellung von Amazon Redshift Redshift-Clustern die Abfragen in der folgenden Reihenfolge aus:
/bootstrap
/nonrepeatable
/repeatable
/finalize
Der /repeatable
Ordner enthält vier Unterordner:/udf
,, und. /table
/view
/stored-procedure
Diese Unterordner geben die Reihenfolge an, in der Terraform die Abfragen ausführt. SQL
Das Python-Skript, das die SQL Abfragen ausführt, istsql-queries.py
. Zunächst liest das Skript alle Dateien und Unterordner eines bestimmten Quellverzeichnisses, z. B. den sql_path_bootstrap
Parameter. Anschließend führt das Skript die Abfragen aus, indem es den Amazon Redshift ExecuteStatementAPIRedshift-Vorgang aufruft. Möglicherweise haben Sie eine oder mehrere SQL Abfragen in einer Datei. Der folgende Codeausschnitt zeigt die Python-Funktion, die in einer Datei gespeicherte SQL Anweisungen gegen einen Amazon Redshift Redshift-Cluster ausführt.
def execute_sql_statement(filename, cluster_id, db_name, secret_arn, aws_region): """Execute SQL statements in a file""" redshift_client = boto3.client( 'redshift-data', region_name=aws_region) contents = get_contents_from_file(filename), response = redshift_client.execute_statement( Sql=contents[0], ClusterIdentifier=cluster_id, Database=db_name, WithEvent=True, StatementName=filename, SecretArn=secret_arn ) ...
Das Terraform-Skript sql-queries.tf
erstellt die terraform_data-Ressourcen, die das Skript aufrufensql-queries.py
Für jeden der vier Ordner gibt es eine terraform_data
Ressource:,, und. /bootstrap
/nonrepeatable
/repeatable
/finalize
Der folgende Codeausschnitt zeigt die terraform_data
Ressource, die die SQL Abfragen im /bootstrap
Ordner ausführt.
locals { program = "${path.module}/sql-queries.py" redshift_cluster_name = try(aws_redshift_cluster.this[0].id, null) } resource "terraform_data" "run_bootstrap_queries" { count = var.create && var.run_nonrepeatable_queries && (var.sql_path_bootstrap != "") && (var.snapshot_identifier == null) ? 1 : 0 depends_on = [aws_redshift_cluster.this[0]] provisioner "local-exec" { command = "python3 ${local.program} ${var.sql_path_bootstrap} ${local.redshift_cluster_name} ${var.database_name} ${var.redshift_secret_arn} ${local.aws_region}" } }
Mithilfe der folgenden Variablen können Sie steuern, ob diese Abfragen ausgeführt werden sollen. Wenn Sie keine Abfragen insql_path_bootstrap
,, oder ausführen möchten sql_path_nonrepeatable
sql_path_repeatable
sql_path_finalize
, legen Sie deren Werte auf fest""
.
run_nonrepeatable_queries = true run_repeatable_queries = true sql_path_bootstrap = "src/redshift/bootstrap" sql_path_nonrepeatable = "src/redshift/nonrepeatable" sql_path_repeatable = "src/redshift/repeatable" sql_path_finalize = "src/redshift/finalize"
Bei der Ausführung berücksichtigt Terraform die terraform_data
Ressourceterraform apply
, die nach Abschluss des Skripts hinzugefügt wurde, unabhängig von den Ergebnissen des Skripts. Wenn einige SQL Abfragen fehlgeschlagen sind und Sie sie erneut ausführen möchten, können Sie die Ressource manuell aus dem Terraform-Status entfernen und erneut ausführen. terraform apply
Mit dem folgenden Befehl wird die run_bootstrap_queries
Ressource beispielsweise aus dem Terraform-Status entfernt.
terraform state rm module.redshift.terraform_data.run_bootstrap_queries[0]
Das folgende Codebeispiel zeigt, wie die run_repeatable_queries
Ressource Änderungen im repeatable
Ordner mithilfe des sha256-Hashsterraform apply
resource "terraform_data" "run_repeatable_queries" { count = var.create_redshift && var.run_repeatable_queries && (var.sql_path_repeatable != "") ? 1 : 0 depends_on = [terraform_data.run_nonrepeatable_queries] # Continuously monitor and apply changes in the repeatable folder triggers_replace = { dir_sha256 = sha256(join("", [for f in fileset("${var.sql_path_repeatable}", "**") : filesha256("${var.sql_path_repeatable}/${f}")])) } provisioner "local-exec" { command = "python3 ${local.sql_queries} ${var.sql_path_repeatable} ${local.redshift_cluster_name} ${var.database_name} ${var.redshift_secret_arn}" } }
Um den Code zu verfeinern, können Sie einen Mechanismus implementieren, mit dem Änderungen nur an den Dateien erkannt und angewendet werden, die innerhalb des repeatable
Ordners aktualisiert wurden, anstatt Änderungen wahllos auf alle Dateien anzuwenden.
Beispielanweisungen SQL
Die folgende Ausgabe zeigt eine fehlgeschlagene SQL Ausführung zusammen mit einer Fehlermeldung.
module.redshift.terraform_data.run_nonrepeatable_queries[0] (local-exec): Executing: ["/bin/sh" "-c" "python3 modules/redshift/sql-queries.py src/redshift/nonrepeatable testcluster-1 db1 arn:aws:secretsmanager:us-east-1:XXXXXXXXXXXX:secret:/redshift/master_user/password-8RapGH us-east-1"] module.redshift.terraform_data.run_nonrepeatable_queries[0] (local-exec): ------------------------------------------------------------------- module.redshift.terraform_data.run_nonrepeatable_queries[0] (local-exec): src/redshift/nonrepeatable/table/admin/admin.application_family.sql module.redshift.terraform_data.run_nonrepeatable_queries[0] (local-exec): ------------------------------------------------------------------- module.redshift.terraform_data.run_nonrepeatable_queries[0] (local-exec): Status: FAILED module.redshift.terraform_data.run_nonrepeatable_queries[0] (local-exec): SQL execution failed. module.redshift.terraform_data.run_nonrepeatable_queries[0] (local-exec): Error message: ERROR: syntax error at or near ")" module.redshift.terraform_data.run_nonrepeatable_queries[0] (local-exec): Position: 244 module.redshift.terraform_data.run_nonrepeatable_queries[0]: Creation complete after 3s [id=ee50ba6c-11ae-5b64-7e2f-86fd8caa8b76]
Die folgende Ausgabe zeigt eine erfolgreiche SQL Ausführung.
module.redshift.terraform_data.run_bootstrap_queries[0]: Provisioning with 'local-exec'... module.redshift.terraform_data.run_bootstrap_queries[0] (local-exec): Executing: ["/bin/sh" "-c" "python3 modules/redshift/sql-queries.py src/redshift/bootstrap testcluster-1 db1 arn:aws:secretsmanager:us-east-1:XXXXXXXXXXXX:secret:/redshift/master_user/password-8RapGH us-east-1"] module.redshift.terraform_data.run_bootstrap_queries[0] (local-exec): ------------------------------------------------------------------- module.redshift.terraform_data.run_bootstrap_queries[0] (local-exec): src/redshift/bootstrap/db.sql module.redshift.terraform_data.run_bootstrap_queries[0] (local-exec): ------------------------------------------------------------------- module.redshift.terraform_data.run_bootstrap_queries[0] (local-exec): Status: FINISHED module.redshift.terraform_data.run_bootstrap_queries[0] (local-exec): SQL execution successful. module.redshift.terraform_data.run_bootstrap_queries[0]: Creation complete after 2s [id=d565ef6d-be86-8afd-8e90-111e5ea4a1be]