Verbindung mit Cloud SQL herstellen

Als BigQuery-Administrator können Sie eine Verbindung erstellen, um auf Cloud SQL-Daten zuzugreifen. Über diese Verbindung können Datenanalysten Daten in Cloud SQL abfragen. So stellen Sie eine Verbindung zu Cloud SQL her:

  1. Cloud SQL-Verbindung erstellen
  2. Zugriff auf den BigQuery Connection Service-Agent gewähren.

Hinweis

  1. Wählen Sie das Projekt aus, in dem sich die Cloud SQL-Datenbank befindet.

    Zur Projektauswahl

  2. Aktivieren Sie die BigQuery Connection API.

    API aktivieren

  3. Achten Sie darauf, dass die Cloud SQL-Instanz eine öffentliche IP-Verbindung oder eine private Verbindung hat:
    • Zum Schutz Ihrer Cloud SQL-Instanzen können Sie öffentliche IP-Verbindungen ohne autorisierte Adresse hinzufügen. Dadurch wird die Instanz über das öffentliche Internet unerreichbar, aber für Abfragen von BigQuery zugänglich.

    • Damit BigQuery über eine private Verbindung auf Cloud SQL-Daten zugreifen kann, konfigurieren Sie eine private IP-Verbindung für eine neue oder vorhandene Cloud SQL-Instanz und klicken Sie dann auf das Kästchen Privater Pfad für Google Cloud-Dienste. Dieser Dienst verwendet einen internen direkten Pfad anstelle der privaten IP-Adresse innerhalb der Virtual Private Cloud.

  4. Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle „BigQuery-Verbindungsadministrator“ (roles/bigquery.connectionAdmin) für das Projekt zuzuweisen, um die Berechtigungen abzurufen, die Sie zum Erstellen einer Cloud SQL-Verbindung benötigen. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff verwalten.

    Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Cloud SQL-Verbindungen erstellen

Als Best Practice sollten Sie Verbindungen zur Verarbeitung von Datenbankanmeldedaten verwenden, wenn Sie eine Verbindung zu Cloud SQL herstellen. Verbindungen werden verschlüsselt und sicher im BigQuery-Verbindungsdienst gespeichert. Wenn die Nutzeranmeldedaten für andere Daten in der Quelle gültig sind, können Sie die Verbindung wiederverwenden. So können Sie beispielsweise eine Verbindung zum Abfragen mehrerer Datenbanken verwenden, die sich in derselben Cloud SQL-Instanz befinden.

Wählen Sie eine der folgenden Optionen aus, um eine Cloud SQL-Verbindung zu erstellen:

Console

  1. Rufen Sie die Seite BigQuery auf.

    BigQuery aufrufen

  2. Klicken Sie im Bereich Explorer auf Daten hinzufügen.

  3. Klicken Sie im Dialogfeld Daten hinzufügen auf Verbindungen zu externen Datenquellen:

  4. Geben Sie im Dialogfeld Externe Datenquelle die folgenden Informationen ein:

    • Wählen Sie als Verbindungstyp den Typ der Quelle aus, z. B. MySQL oder Postgres.
    • Geben Sie unter Verbindungs-ID eine Kennung für die Verbindungsressource ein. Buchstaben, Ziffern und Unterstriche sind zulässig. Beispiel: bq_sql_connection
    • Wählen Sie unter Datenstandort einen BigQuery-Standort (oder eine Region) aus, der mit Ihrer externen Region für die Datenquellen kompatibel ist.
    • Optional: Sie können unter Anzeigename einen nutzerfreundlichen Namen für die Verbindung eingeben, z. B. My connection resource. Der Anzeigename kann ein beliebiger Wert sein, mit dem Sie die Verbindungsressource identifizieren können, wenn Sie sie später ändern müssen.
    • Optional: Sie können unter Beschreibung eine Beschreibung für diese Verbindungsressource eingeben.
    • Optional: Verschlüsselung: Wenn Sie einen vom Kunden verwalteten Verschlüsselungsschlüssel (Customer-Managed Encryption Key, CMEK) zum Verschlüsseln Ihrer Anmeldedaten verwenden möchten, wählen Sie Vom Kunden verwalteter Verschlüsselungsschlüssel (CMEK) und dann einen vom Kunden verwalteten Schlüssel aus. Andernfalls werden Ihre Anmeldedaten durch den von Google verwalteten Standardverschlüsselungsschlüssel geschützt.
    • Wenn Sie Cloud SQL MySQL oder Postgres als Verbindungstyp ausgewählt haben, geben Sie unter Name der Cloud SQL-Verbindung den vollständigen Namen der Cloud SQL-Instanz ein, normalerweise im Format project-id:location-id:instance-id. Sie finden die Instanz-ID auf der Detailseite der Cloud SQL-Instanz, die Sie abfragen möchten.
    • Geben Sie unter Datenbankname den Namen der Datenbank ein.
    • Geben Sie unter Datenbanknutzername den Nutzernamen für die Datenbank ein.
    • Geben Sie unter Datenbankpasswort das Passwort für die Datenbank ein.

      • Optional: Klicken Sie auf Passwort anzeigen, um das Passwort anzuzeigen.
  5. Klicken Sie auf Verbindung erstellen.

  6. Klicken Sie auf Zur Verbindung.

  7. Kopieren Sie im Bereich Verbindungsinformationen die Dienstkonto-ID zur Verwendung in einem folgenden Schritt.

bq

Geben Sie den Befehl bq mk ein und geben Sie das Verbindungs-Flag --connection an. Die folgenden Flags sind ebenfalls erforderlich:

  • --connection_type
  • --properties
  • --connection_credential
  • --project_id
  • --location

Die folgenden Flags sind optional:

  • --display_name: Der Anzeigename für die Verbindung.
  • --description: Eine Beschreibung der Verbindung.

Die connection_id ist ein optionaler Parameter, der als letztes Argument des Befehls hinzugefügt werden kann, der intern für die Speicherung verwendet wird. Wenn keine Verbindungs-ID angegeben wird, wird automatisch eine eindeutige ID generiert. Die connection_id kann Buchstaben, Ziffern und Unterstriche enthalten.

    bq mk --connection --display_name='friendly name' --connection_type=TYPE \
      --properties=PROPERTIES --connection_credential=CREDENTIALS \
      --project_id=PROJECT_ID --location=LOCATION \
      CONNECTION_ID

Dabei gilt:

  • TYPE: der Typ der externen Datenquelle.
  • PROPERTIES: die Parameter für die erstellte Verbindung im JSON-Format Beispiel: --properties='{"param":"param_value"}'. Zum Erstellen einer Verbindungsressource müssen Sie die Parameter instanceID, database und type angeben.
  • CREDENTIALS: die Parameter username und password
  • PROJECT_ID: Ihre Projekt-ID.
  • LOCATION: die Region, in der sich Ihre Cloud SQL-Instanz befindet
  • CONNECTION_ID: die Verbindungs-ID.

Mit dem folgenden Befehl wird beispielsweise eine neue Verbindungsressource mit dem Namen „my_new_connection“ (Anzeigename: „My new connection“) in einem Projekt mit der ID federation-test erstellt.

bq mk --connection --display_name='friendly name' --connection_type='CLOUD_SQL' \
  --properties='{"instanceId":"federation-test:us-central1:mytestsql","database":"mydatabase","type":"MYSQL"}' \
  --connection_credential='{"username":"myusername", "password":"mypassword"}' \
  --project_id=federation-test --location=us my_connection_id

API

Innerhalb der BigQuery Connection API können Sie CreateConnection innerhalb von ConnectionService aufrufen, um eine Verbindung zu instanziieren. Weitere Informationen finden Sie auf der Seite der Clientbibliotheken.

Java

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Java in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Java API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

import com.google.cloud.bigquery.connection.v1.CloudSqlCredential;
import com.google.cloud.bigquery.connection.v1.CloudSqlProperties;
import com.google.cloud.bigquery.connection.v1.Connection;
import com.google.cloud.bigquery.connection.v1.CreateConnectionRequest;
import com.google.cloud.bigquery.connection.v1.LocationName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import java.io.IOException;

// Sample to create a connection with cloud MySql database
public class CreateConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    String database = "MY_DATABASE";
    String instance = "MY_INSTANCE";
    String instanceLocation = "MY_INSTANCE_LOCATION";
    String username = "MY_USERNAME";
    String password = "MY_PASSWORD";
    String instanceId = String.format("%s:%s:%s", projectId, instanceLocation, instance);
    CloudSqlCredential cloudSqlCredential =
        CloudSqlCredential.newBuilder().setUsername(username).setPassword(password).build();
    CloudSqlProperties cloudSqlProperties =
        CloudSqlProperties.newBuilder()
            .setType(CloudSqlProperties.DatabaseType.MYSQL)
            .setDatabase(database)
            .setInstanceId(instanceId)
            .setCredential(cloudSqlCredential)
            .build();
    Connection connection = Connection.newBuilder().setCloudSql(cloudSqlProperties).build();
    createConnection(projectId, location, connectionId, connection);
  }

  static void createConnection(
      String projectId, String location, String connectionId, Connection connection)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      LocationName parent = LocationName.of(projectId, location);
      CreateConnectionRequest request =
          CreateConnectionRequest.newBuilder()
              .setParent(parent.toString())
              .setConnection(connection)
              .setConnectionId(connectionId)
              .build();
      Connection response = client.createConnection(request);
      System.out.println("Connection created successfully :" + response.getName());
    }
  }
}

Zugriff auf das Dienstkonto gewähren

Ein Dienstkonto wird automatisch erstellt, wenn Sie die erste Verbindung zu Cloud SQL innerhalb des Projekts erstellen. Der Name des Dienstkontos lautet BigQuery Connection Service Agent. Rufen Sie Ihre Verbindungsdetails auf, um die Dienstkonto-ID abzurufen. Die Dienstkonto-ID hat das folgende Format:

service-PROJECT_NUMBER@gcp-sa-bigqueryconnection.iam.gserviceaccount.com

Um eine Verbindung zu Cloud Storage herzustellen, müssen Sie der neuen Verbindung Lesezugriff auf Cloud SQLgewähren, damit BigQuery im Namen von Nutzern auf Dateien zugreifen kann. Das Dienstkonto muss die folgenden Berechtigungen haben:

  • cloudsql.instances.connect
  • cloudsql.instances.get

Sie können dem mit der Verbindung verknüpften Dienstkonto die IAM-Rolle "Cloud SQL-Client" (roles/cloudsql.client) zuweisen, die über diese zugeteilten Berechtigungen verfügt. Sie können diesen Schritt überspringen, wenn das Dienstkonto bereits die erforderlichen Berechtigungen hat.

Console

  1. Zur Seite IAM & Verwaltung.

    IAM & Verwaltung aufrufen

  2. Klicken Sie auf Zugriff gewähren.

    Das Dialogfeld Principals hinzufügen wird geöffnet.

  3. Geben Sie in das Feld Neue Hauptkonten den Dienstkontonamen BigQuery Connection Service Agent oder die Dienstkonto-ID aus den Verbindungsinformationen ein.

  4. Wählen Sie in dem Feld Rolle auswählen die Option Cloud SQL und dann Cloud SQL-Client aus.

  5. Klicken Sie auf Speichern.

gcloud

Führen Sie den Befehl gcloud projects add-iam-policy-binding aus:

gcloud projects add-iam-policy-binding PROJECT_ID --member=serviceAccount:SERVICE_ACCOUNT_ID --role=roles/cloudsql.client

Geben Sie folgende Werte an:

Verbindungen für Nutzer freigeben

Sie können die folgenden Rollen zuweisen, damit Nutzer Daten abfragen und Verbindungen verwalten können:

  • roles/bigquery.connectionUser: Nutzer können Verbindungen nutzen, um sich mit externen Datenquellen zu verbinden und diese abzufragen.

  • roles/bigquery.connectionAdmin: Nutzer können Verbindungen verwalten.

Weitere Informationen zu IAM-Rollen und Berechtigungen in BigQuery finden Sie unter Vordefinierte Rollen und Berechtigungen.

Wählen Sie eine der folgenden Optionen aus:

Console

  1. Rufen Sie die Seite BigQuery auf.

    BigQuery aufrufen

    Verbindungen werden in Ihrem Projekt in einer Gruppe namens Externe Verbindungen aufgeführt.

  2. Klicken Sie im Bereich Explorer auf Ihren Projektnamen > Externe Verbindungen > Verbindung.

  3. Klicken Sie im Bereich Details auf Freigeben, um eine Verbindung freizugeben. Führen Sie anschließend folgende Schritte aus:

    1. Geben Sie im Dialogfeld Verbindungsberechtigungen die Verbindung für andere Hauptkonten frei, indem Sie Hauptkonten hinzufügen oder bearbeiten.

    2. Klicken Sie auf Speichern.

bq

Sie können keine Verbindung mit dem bq-Befehlszeilentool freigeben. Verwenden Sie zum Freigeben einer Verbindung die Google Cloud Console oder die Methode der BigQuery Connections API.

API

Verwenden Sie die Methode projects.locations.connections.setIAM in dem Referenzabschnitt zur BigQuery Connections REST API und geben Sie eine Instanz der Ressource policy an.

Java

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Java in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Java API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

import com.google.api.resourcenames.ResourceName;
import com.google.cloud.bigquery.connection.v1.ConnectionName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

// Sample to share connections
public class ShareConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    shareConnection(projectId, location, connectionId);
  }

  static void shareConnection(String projectId, String location, String connectionId)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      ResourceName resource = ConnectionName.of(projectId, location, connectionId);
      Binding binding =
          Binding.newBuilder()
              .addMembers("group:example-analyst-group@google.com")
              .setRole("roles/bigquery.connectionUser")
              .build();
      Policy policy = Policy.newBuilder().addBindings(binding).build();
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(resource.toString())
              .setPolicy(policy)
              .build();
      client.setIamPolicy(request);
      System.out.println("Connection shared successfully");
    }
  }
}

Nächste Schritte