Mit Blob-Speicher verbinden

Als BigQuery-Administrator können Sie eine Verbindung erstellen, damit Datenanalysten auf Daten zugreifen können, die in Azure Blob Storage gespeichert sind.

BigQuery Omni greift über Verbindungen auf Blob Storage-Daten zu. BigQuery Omni unterstützt die Azure-Workload Identity-Föderation. Da BigQuery Omni die Azure-Workload Identity-Föderation unterstützt, können Sie einem Google-Dienstkonto Zugriff auf eine Azure-Anwendung in Ihrem Mandanten gewähren. Es gibt keine Clientschlüssel für Anwendungen, die von Ihnen oder Google verwaltet werden müssen.

Nachdem Sie eine BigQuery-Verbindung erstellt haben, können Sie entweder die Azure Blob Storage-Daten abfragen oder Abfrageergebnisse in Blob Storage exportieren.

Hinweis

Erforderliche Rollen

Kontingente

Weitere Informationen zu Kontingenten finden Sie unter BigQuery Connection API.

Azure-Verbindung erstellen

So erstellen Sie eine Azure-Verbindung:

  1. Anwendung in Ihrem Azure-Mandanten erstellen
  2. BigQuery-Azure-Verbindung erstellen
  3. Föderierte Anmeldedaten hinzufügen
  4. BigQuery Azure AD-Anwendungen eine Rolle zuweisen

Weitere Informationen zum Verwenden von Anmeldedaten für föderierte Identitäten für den Zugriff auf Daten in Azure finden Sie unter Workload Identity-Föderation.

Anwendung in Ihrem Azure-Mandanten erstellen

So erstellen Sie eine Anwendung in Ihrem Azure-Mandanten:

Azure Portal

  1. Gehen Sie im Azure-Portal zu App-Registrierungen und klicken Sie dann auf Neue Registrierung.

  2. Geben Sie unter Namen einen Namen für die Anwendung ein.

  3. Wählen Sie für Unterstützte Kontotypen die Option Nur Konten in diesem Organisationsverzeichnis aus.

  4. Klicken Sie auf Registrieren, um die neue Anwendung zu registrieren.

  5. Notieren Sie sich die Anwendungs-ID (Client). Sie müssen diese ID angeben, wenn Sie die Verbindung erstellen.

    Screenshot: Azure-Portal zum Erstellen von Anwendungen

Terraform

Fügen Sie Ihrer Terraform-Konfigurationsdatei Folgendes hinzu:

  resource "azuread_application" "example" {
    display_name = "bigquery-omni-connector"
  }

  resource "azuread_service_principal" "example" {
    application_id               = azuread_application.example.application_id
    app_role_assignment_required = false
  }

Weitere Informationen zum Registrieren einer Anwendung in Azure

Verbindung herstellen

Console

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Wählen Sie im Menü Daten hinzufügen die Option Externe Datenquelle aus.

  3. Geben Sie im Bereich Externe Datenquelle die folgenden Informationen ein:

    • Wählen Sie als Verbindungstyp die Option BigLake in Azure (über BigQuery Omni) aus.
    • Geben Sie unter Verbindungs-ID eine Kennung für die Verbindungsressource ein. Sie können Buchstaben, Ziffern, Bindestriche und Unterstriche verwenden.
    • Wählen Sie den Standort aus, an dem Sie die Verbindung herstellen möchten.
    • 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 sich die Verbindungsressource ermitteln lässt, wenn Sie sie später ändern müssen.
    • Optional: Sie können unter Beschreibung eine Beschreibung für die Verbindungsressource eingeben.
    • Geben Sie unter Azure-Mandanten-ID die Azure-Mandanten-ID ein, die auch als Verzeichnis-ID (Mandanten) bezeichnet wird.
    • Klicken Sie auf das Kästchen Föderierte Identität verwenden und geben Sie dann die ID der föderierten Azure-Anwendung (Client) ein.

      Informationen zum Abrufen von Azure-IDs finden Sie unter Anwendung in Ihrem Azure-Mandanten erstellen.

  4. Klicken Sie auf Verbindung erstellen.

  5. Klicken Sie auf Zur Verbindung.

  6. Notieren Sie sich im Abschnitt Verbindungsinformationen den Wert von BigQuery-Google-Identität, die die Dienstkonto-ID ist. Diese ID gilt für das Google Cloud-Dienstkonto, das Sie für den Zugriff auf Ihre Anwendung autorisieren.

Terraform

  resource "google_bigquery_connection" "connection" {
    connection_id = "omni-azure-connection"
    location      = "azure-eastus2"
    description   = "created by terraform"

    azure {
      customer_tenant_id              = "TENANT_ID"
      federated_application_client_id = azuread_application.example.application_id
    }
  }

Ersetzen Sie TENANT_ID durch die Mandanten-ID des Azure-Verzeichnisses, das das Blob-Speicherkonto enthält.

bq

Führen Sie den Befehl bq mk aus. Verwenden Sie den Parameter --format=json, um die Ausgabe im JSON-Format abzurufen.

bq mk --connection --connection_type='Azure' \
  --tenant_id=TENANT_ID \
  --location=AZURE_LOCATION \
  --federated_azure=true \
  --federated_app_client_id=APP_ID \
  CONNECTION_ID

Dabei gilt:

  • TENANT_ID: die Mandanten-ID des Azure-Verzeichnisses, das das Azure Storage-Konto enthält.
  • AZURE_LOCATION: die Azure-Region, in der sich Ihre Azure Storage-Daten befinden. BigQuery Omni unterstützt die Region azure-eastus2.
  • APP_ID: die ID der Azure-Anwendung (Client) Informationen zum Abrufen dieser ID finden Sie unter Anwendung im Azure-Mandanten erstellen.
  • CONNECTION_ID: der Name der Verbindung.

Die Ausgabe sieht etwa so aus:

Connection CONNECTION_ID successfully created
Please add the following identity to your Azure application APP_ID
Identity: SUBJECT_ID

Diese Ausgabe enthält die folgenden Werte:

  • APP_ID: die ID der von Ihnen erstellten Anwendung.

  • SUBJECT_ID: die ID des Google Cloud-Dienstkontos, das der Nutzer für den Zugriff auf seine Anwendung autorisiert. Sie benötigen diesen Wert, wenn Sie föderierte Anmeldedaten in Azure erstellen.

Notieren Sie sich die Werte APP_ID und SUBJECT_ID für die nächsten Schritte.

Fügen Sie als Nächstes föderierte Anmeldedaten für Ihre Anwendung hinzu.

Föderierte Anmeldedaten hinzufügen

So erstellen Sie föderierte Anmeldedaten:

Azure Portal

  1. Gehen Sie im Azure-Portal zu App-Registrierungen und klicken Sie dann auf Ihre Anwendung.

  2. Wählen Sie Zertifikate & Secrets > Föderierte Anmeldedaten > Anmeldedaten hinzufügen aus. Gehen Sie anschließend so vor:

    1. Wählen Sie in der Liste Szenario der föderierten Anmeldedaten die Option Anderer Aussteller aus.

    2. Geben Sie als Aussteller https://accounts.google.com ein.

    3. Geben Sie als Themenkennung die BigQuery-Google-Identität des Google Cloud-Dienstkontos ein, das Sie beim Erstellen der BigQuery-Azure-Verbindung erhalten haben.

    4. Geben Sie unter Name einen Namen für die Anmeldedaten ein.

    5. Klicken Sie auf Hinzufügen.

Terraform

Fügen Sie Ihrer Terraform-Konfigurationsdatei Folgendes hinzu:

  resource "azuread_application" "example" {
    display_name = "bigquery-omni-connector"
  }

  resource "azuread_service_principal" "example" {
    application_id               = azuread_application.example.application_id
    app_role_assignment_required = false
  }

  resource "azuread_application_federated_identity_credential" "example" {
    application_object_id = azuread_application.example.object_id
    display_name          = "omni-federated-credential"
    description           = "BigQuery Omni federated credential"
    audiences             = ["api://AzureADTokenExchange"]
    issuer                = "https://accounts.google.com"
    subject               = google_bigquery_connection.connection.azure[0].identity
  }

Weitere Informationen finden Sie unter Anwendung für die Vertrauensstellung eines externen Identitätsanbieters konfigurieren.

Azure-Anwendungen eine Rolle in BigQuery zuweisen

Um der Azure-Anwendung von BigQuery eine Rolle zuzuweisen, verwenden Sie das Azure-Portal, Azure PowerShell oder die Microsoft Management REST API:

Azure Portal

Sie können Rollenzuweisungen im Azure-Portal ausführen. Melden Sie sich als Nutzer mit der Berechtigung Microsoft.Authorization/roleAssignments/write an. Mit der Rollenzuweisung kann die BigQuery-Azure-Verbindung auf die Azure Storage-Daten zugreifen, wie in der Rollenrichtlinie angegeben.

So fügen Sie Rollenzuweisungen mithilfe des Azure-Portals hinzu:

  1. Geben Sie in Ihrem Azure Storage-Konto IAM in die Suchleiste ein.

  2. Klicken Sie auf Zugriffssteuerung (IAM).

  3. Klicken Sie auf Hinzufügen und wählen Sie Rollenzuweisungen hinzufügen aus.

  4. Wählen Sie die Rolle Storage Blob Data-Leser aus, um schreibgeschützten Zugriff zu gewähren. Wählen Sie für die Bereitstellung des Lese-/Schreibzugriffs die Rolle Storage Blob-Daten-Mitwirkender aus.

  5. Setzen Sie Zugriff gewähren auf auf Nutzer, Gruppe oder Diensthauptkonto.

  6. Klicken Sie auf Mitglieder auswählen.

  7. Geben Sie im Feld Auswählen den Namen der Azure-Anwendung ein, den Sie beim Erstellen der Anwendung im Azure-Mandanten angegeben haben.

  8. Klicken Sie auf Speichern.

Weitere Informationen finden Sie unter Azure-Rollen mit dem Azure-Portal zuweisen.

Terraform

Fügen Sie Ihrer Terraform-Konfigurationsdatei Folgendes hinzu:

  resource "azurerm_role_assignment" "data-role" {
    scope                = data.azurerm_storage_account.example.id
    # Read permission for Omni on the storage account
    role_definition_name = "Storage Blob Data Reader"
    principal_id         = azuread_service_principal.example.id
  }

Azure PowerShell

Eine Rollenzuweisung für ein Diensthauptkonto auf Ressourcenebene können Sie mit dem Befehl New-AzRoleAssignment hinzufügen:

  New-AzRoleAssignment`
   -SignInName APP_NAME`
   -RoleDefinitionName ROLE_NAME`
   -ResourceName RESOURCE_NAME`
   -ResourceType RESOURCE_TYPE`
   -ParentResource PARENT_RESOURCE`
   -ResourceGroupName RESOURCE_GROUP_NAME

Dabei gilt:

  • APP_NAME: der Name der Anwendung.
  • ROLE_NAME: der Rollenname, den Sie zuweisen möchten.
  • RESOURCE_NAME: der Ressourcenname.
  • RESOURCE_TYPE: der Ressourcentyp.
  • PARENT_RESOURCE: die übergeordnete Ressource.
  • RESOURCE_GROUP_NAME: der Name der Ressourcengruppe.

Weitere Informationen zum Hinzufügen eines neuen Diensthauptkontos mit Azure PowerShell finden Sie unter Azure-Rollen mit Azure PowerShell zuweisen.

Azure-Befehlszeile

Um eine Rollenzuweisung für ein Diensthauptkonto auf Ressourcenebene hinzuzufügen, können Sie das Azure-Befehlszeilentool verwenden. Sie benötigen die Berechtigung Microsoft.Authorization/roleAssignments/write für das Speicherkonto, um Rollen zuweisen zu können.

Führen Sie den Befehl az role assignment create aus, um dem Diensthauptkonto eine Rolle zuzuweisen, z. B. die Rolle Storage Blob Data Reader:

  az role assignment create --role "Storage Blob Data Reader" \
    --assignee-object-id ${SP_ID} \
    --assignee-principal-type ServicePrincipal \
    --scope   subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME

Ersetzen Sie Folgendes:

  • SP_ID: die Diensthauptkonto-ID. Dieses Diensthauptkonto bezieht sich auf die von Ihnen erstellte Anwendung. Informationen zum Diensthauptkonto für eine föderierte Verbindung finden Sie unter Diensthauptkontoobjekt.
  • STORAGE_ACCOUNT_NAME: der Name des Speicherkontos
  • RESOURCE_GROUP_NAME: der Name der Ressourcengruppe.
  • SUBSCRIPTION_ID: die Abo-ID

Weitere Informationen finden Sie unter Azure-Rollen mithilfe der Azure-Befehlszeile zuweisen.

Microsoft REST API

Zum Hinzufügen von Rollenzuweisungen für ein Diensthauptkonto können Sie eine HTTP-Anfrage an Microsoft Management senden.

Zum Aufrufen der Microsoft Graph REST API rufen Sie ein OAuth-Token für eine Anwendung ab. Weitere Informationen finden Sie unter Zugriff ohne Nutzer erhalten. Die Anwendung, die die Microsoft Graph REST API aufgerufen hat, muss die Anwendungsberechtigung Application.ReadWrite.All haben.

Führen Sie den folgenden Befehl aus, um ein OAuth-Token zu generieren:

  export TOKEN=$(curl -X POST \
    https://login.microsoftonline.com/TENANT_ID/oauth2/token \
    -H 'cache-control: no-cache' \
    -H 'content-type: application/x-www-form-urlencoded' \
    --data-urlencode "grant_type=client_credentials" \
    --data-urlencode "resource=https://graph.microsoft.com/" \
    --data-urlencode "client_id=CLIENT_ID" \
    --data-urlencode "client_secret=CLIENT_SECRET" \
  | jq --raw-output '.access_token')

Dabei gilt:

  • TENANT_ID: die Mandanten-ID, die der ID des Azure-Verzeichnisses entspricht, das das Azure Storage-Konto enthält.
  • CLIENT_ID: die Azure-Client-ID.
  • CLIENT_SECRET: der Azure-Clientschlüssel.

Rufen Sie die ID der integrierten Azure-Rollen ab, die Sie dem Diensthauptkonto zuweisen möchten.

Hier einige gängige Rollen:

Rufen Sie die Microsoft Graph REST API bei der Azure Resource Management REST API auf, um dem Dienstprinzip eine Rolle zuzuweisen:

  export ROLE_ASSIGNMENT_ID=$(uuidgen)
  curl -X PUT \
'https://management.azure.com/subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME/providers/Microsoft.Authorization/roleAssignments/ROLE_ASSIGNMENT_ID?api-version=2018-01-01-preview' \
    -H "authorization: Bearer ${TOKEN?}" \
    -H 'cache-control: no-cache' \
    -H 'content-type: application/json' \
    -d '{
        "properties": {
            "roleDefinitionId": "subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME/providers/Microsoft.Authorization/roleDefinitions/ROLE_ID",
            "principalId": "SP_ID"
        }
    }'

Dabei gilt:

  • ROLE_ASSIGNMENT_ID: die Rollen-ID.
  • SP_ID: die Diensthauptkonto-ID. Dieses Diensthauptkonto bezieht sich auf die von Ihnen erstellte Anwendung. Informationen zum Diensthauptkonto für eine föderierte Verbindung finden Sie unter Diensthauptkontoobjekt.
  • SUBSCRIPTION_ID: die Abo-ID
  • RESOURCE_GROUP_NAME: der Name der Ressourcengruppe.
  • STORAGE_ACCOUNT_NAME: der Name des Speicherkontos
  • SUBSCRIPTION_ID: die Abo-ID

Der Debugger ist jetzt einsatzbereit. Bei einer Rollenzuweisung in Azure kann es jedoch zu einer Übertragungsverzögerung kommen. Wenn Sie die Verbindung aufgrund von Berechtigungsproblemen nicht verwenden können, versuchen Sie es nach einiger Zeit noch einmal.

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