Verbindung zu Amazon S3 herstellen

Als BigQuery-Administrator können Sie eine Verbindung erstellen, damit Datenanalytiker auf Daten zugreifen können, die in Amazon S3-Buckets (Amazon Simple Storage Service) gespeichert sind.

BigQuery Omni greift auf Amazon S3-Daten über Verbindungen zu. Jede Verbindung hat einen eigenen eindeutigen IAM-Nutzer (Identity and Access Management, Identitäts- und Zugriffsverwaltung) für AWS (Amazon Web Services). Sie erteilen den Nutzern Berechtigungen über AWS IAM-Rollen. Die Richtlinien in den AWS IAM-Rollen bestimmen, auf welche Daten BigQuery bei einer Verbindung zugreifen kann.

Verbindungen sind erforderlich, um Amazon S3-Daten abzufragen und Abfrageergebnisse aus BigQuery in Ihren Amazon S3-Bucket zu exportieren.

Hinweis

Es müssen die folgenden Ressourcen erstellt und festgelegt werden:

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle BigQuery-Verbindungsadministrator (roles/bigquery.connectionAdmin) für das Projekt zu gewähren, um die Berechtigungen zum Erstellen einer Verbindung zu erhalten, damit Sie auf Amazon S3-Daten zugreifen können. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

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

AWS IAM-Richtlinie für BigQuery erstellen

Folgen Sie den Best Practices für Sicherheit für Amazon S3. Wir empfehlen Folgendes:

  • Richten Sie eine AWS-Richtlinie ein, die den Zugriff auf Ihren Amazon S3-Bucket über HTTP verhindert.
  • Richten Sie eine AWS-Richtlinie ein, die den öffentlichen Zugriff auf Ihren Amazon S3-Bucket verhindert.
  • Verwenden Sie die serverseitige Verschlüsselung von Amazon S3.
  • Beschränken Sie die für das Google-Konto gewährten Berechtigungen auf das erforderliche Minimum.
  • Richten Sie CloudTrails ein und aktivieren Sie Amazon S3-Datenereignisse.

Verwenden Sie zum Erstellen einer AWS-IAM-Richtlinie die AWS Console oder Terraform:

AWS Console

  1. Rufen Sie die AWS IAM-Konsole (Identity and Access Management, Identitäts- und Zugriffsverwaltung) auf. Achten Sie darauf, dass Sie sich in dem Konto befinden, zu dem der Amazon S3-Bucket gehört, auf den Sie zugreifen möchten.
  2. Wählen Sie Richtlinien > Richtlinie erstellen aus. Die Optionen werden in einem neuen Tab angezeigt.
  3. Klicken Sie auf JSON und fügen Sie Folgendes in den Editor ein:

    {
     "Version": "2012-10-17",
     "Statement": [
        {
         "Effect": "Allow",
         "Action": [
           "s3:ListBucket"
         ],
         "Resource": [
           "arn:aws:s3:::BUCKET_NAME"
          ]
        },
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject",
           EXPORT_PERM
         ],
         "Resource": [
           "arn:aws:s3:::BUCKET_NAME",
            "arn:aws:s3:::BUCKET_NAME/*"
          ]
        }
     ]
    }

    Dabei gilt:

    • BUCKET_NAME: Der Amazon S3-Bucket, auf den BigQuery zugreifen soll.
    • EXPORT_PERM (optional): zusätzliche Berechtigung, wenn Sie Daten in einen Amazon S3-Bucket exportieren möchten. Ersetzen Sie das durch "s3:PutObject".
      • Um die Zugriffssteuerung für den Export zu trennen, empfehlen wir, eine weitere Verbindung mit einer separaten AWS IAM-Rolle zu erstellen und der Rolle nur Schreibzugriff zu gewähren. Für eine detailliertere Zugriffssteuerung können Sie den Zugriff einer Rolle auch auf einen bestimmten Pfad des Buckets beschränken.
  4. Geben Sie im Feld Name einen Richtliniennamen ein, z. B. bq_omni_read_only.

  5. Klicken Sie auf Richtlinie erstellen.

Ihre Richtlinie wird mit einem Amazon Resource Name (ARN) im folgenden Format erstellt:

arn:aws:iam::AWS_ACCOUNT_ID:policy/POLICY_NAME

Ersetzen Sie Folgendes:

  • AWS_ACCOUNT_ID ist die ID-Nummer des AWS IAM-Nutzers der Verbindung.
  • POLICY_NAME ist der Name der Richtlinie, die Sie ausgewählt haben.

Terraform

Fügen Sie der Terraform-Konfiguration Folgendes hinzu, um eine Richtlinie an eine Amazon S3-Bucket-Ressource anzuhängen:

  resource "aws_iam_policy" "bigquery-omni-connection-policy" {
    name = "bigquery-omni-connection-policy"

    policy = <<-EOF
            {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Sid": "BucketLevelAccess",
                      "Effect": "Allow",
                      "Action": ["s3:ListBucket"],
                      "Resource": ["arn:aws:s3:::BUCKET_NAME"]
                  },
                  {
                      "Sid": "ObjectLevelAccess",
                      "Effect": "Allow",
                      "Action": ["s3:GetObject",EXPORT_PERM],
                      "Resource": [
                          "arn:aws:s3:::BUCKET_NAME",
                          "arn:aws:s3:::BUCKET_NAME/*"
                          ]
                  }
              ]
            }
            EOF
  }

Ersetzen Sie Folgendes:

  • BUCKET_NAME: Der Amazon S3-Bucket, auf den BigQuery zugreifen soll.
  • EXPORT_PERM (optional): zusätzliche Berechtigung, wenn Sie Daten in einen Amazon S3-Bucket exportieren möchten. Ersetzen Sie das durch "s3:PutObject".
    • Um die Zugriffssteuerung für den Export zu trennen, empfehlen wir, eine weitere Verbindung mit einer separaten AWS IAM-Rolle zu erstellen und der Rolle nur Schreibzugriff zu gewähren. Für eine detailliertere Zugriffssteuerung können Sie den Zugriff einer Rolle auch auf einen bestimmten Pfad des Buckets beschränken.

AWS IAM-Rolle für BigQuery erstellen

Erstellen Sie als Nächstes eine Rolle, die den Zugriff auf den Amazon S3-Bucket in BigQuery ermöglicht. Diese Rolle verwendet die Richtlinie, die Sie im vorherigen Abschnitt erstellt haben.

Verwenden Sie zum Erstellen einer AWS-IAM-Rolle die AWS Console oder Terraform:

AWS Console

  1. Rufen Sie die AWS IAM-Konsole auf. Achten Sie darauf, dass Sie sich in dem Konto befinden, zu dem der Amazon S3-Bucket gehört, auf den Sie zugreifen möchten.
  2. Wählen Sie Rollen > Rolle erstellen aus.
  3. Wählen Sie unter Typ der vertrauenswürdigen Entität auswählen die Option Web Identity aus.
  4. Wählen Sie für Identity Provider die Option Google aus.
  5. Geben Sie für Zielgruppe 00000 als Platzhalterwert ein. Sie ersetzen den Wert später.
  6. Klicken Sie auf Next: Permissions.
  7. Um der Rolle Zugriff auf Ihre Amazon S3-Daten zu gewähren, hängen Sie eine IAM-Richtlinie an die Rolle an. Suchen Sie nach der Richtlinie, die Sie im vorherigen Abschnitt erstellt haben, und klicken Sie auf die Umschaltfläche.
  8. Klicken Sie auf Weiter: Tags.
  9. Klicken Sie auf Weiter: Überprüfen. Geben Sie einen Namen für die Rolle ein, z. B. BQ_Read_Only.
  10. Klicken Sie auf Rolle erstellen.

Terraform

Fügen Sie Ihre Terraform-Konfiguration unten hinzu, um eine IAM-Rolle zu erstellen und die Richtlinie der erstellten Rolle zuzuweisen:

  resource "aws_iam_role" "bigquery-omni-connection-role" {
    name                 = "bigquery-omni-connection"
    max_session_duration = 43200

    assume_role_policy = <<-EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "00000"
            }
          }
        }
      ]
    }
    EOF
  }

  resource "aws_iam_role_policy_attachment" "bigquery-omni-connection-role-attach" {
    role       = aws_iam_role.bigquery-omni-connection-role.name
    policy_arn = aws_iam_policy.bigquery-omni-connection-policy.arn
  }

  output "bigquery_omni_role" {
    value = aws_iam_role.bigquery-omni-connection-role.arn
  }

Verbindungen erstellen

Verwenden Sie die Google Cloud Console, das bq-Befehlszeilentool oder die Clientbibliothek, um eine Verbindung zu Ihrem Amazon S3-Bucket herzustellen:

Console

  1. Rufen Sie die Seite BigQuery auf.

    BigQuery aufrufen

  2. Wählen Sie im Menü 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 diese Verbindungsressource eingeben.
    • Geben Sie unter AWS-Rollen-ID die vollständige ID der IAM-Rolle ein, die Sie im folgenden Format erstellt haben: arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME.
  4. Klicken Sie auf Verbindung erstellen.

  5. Klicken Sie auf Zur Verbindung.

  6. Kopieren Sie im Bereich Verbindungsinformationen die Google-Identität in BigQuery. Dies ist ein Google-Hauptkonto, das für jede Verbindung spezifisch ist. Beispiel:

      BigQuery Google identity: 000000000000000000000
      

Terraform

  resource "google_bigquery_connection" "connection" {
    connection_id = "bigquery-omni-aws-connection"
    friendly_name = "bigquery-omni-aws-connection"
    description   = "Created by Terraform"

    location      = "AWS_LOCATION"
    aws {
      access_role {
        # This must be constructed as a string instead of referencing the AWS resources
        # directly to avoid a resource dependency cycle in Terraform.
        iam_role_id = "arn:aws:iam::AWS_ACCOUNT:role/IAM_ROLE_NAME"
      }
    }
  }

Ersetzen Sie Folgendes:

  • AWS_LOCATION: ein Amazon S3-Standort in Google Cloud
  • AWS_ACCOUNT: Ihre AWS-Konto-ID.
  • IAM_ROLE_NAME: Die Rolle, die den Zugriff auf den Amazon S3-Bucket aus BigQuery ermöglicht. Verwenden Sie den Wert des name-Arguments aus der aws_iam_role-Ressource in AWS-IAM-Rolle für BigQuery erstellen.

bq

bq mk --connection --connection_type='AWS' \
--iam_role_id=arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME \
--location=AWS_LOCATION \
CONNECTION_ID

Ersetzen Sie Folgendes:

  • AWS_ACCOUNT_ID: die ID-Nummer des AWS IAM-Nutzers der Verbindung.
  • ROLE_NAME: der Name der Rollenrichtlinie, die Sie auswählen.
  • AWS_LOCATION: ein Amazon S3-Standort in Google Cloud
  • CONNECTION_ID: die ID, die Sie dieser Verbindungsressource zuweisen.

Die Befehlszeile zeigt die folgende Ausgabe an:

  Identity: IDENTITY_ID

Die Ausgabe enthält Folgendes:

  • IDENTITY_ID: Ein Google-Hauptkonto, das von Google Cloud gesteuert wird und für jede Verbindung spezifisch ist.

Notieren Sie sich den Wert von IDENTITY_ID.

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.AwsAccessRole;
import com.google.cloud.bigquery.connection.v1.AwsProperties;
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 aws connection
public class CreateAwsConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    // Example of location: aws-us-east-1
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    // Example of role id: arn:aws:iam::accountId:role/myrole
    String iamRoleId = "MY_AWS_ROLE_ID";
    AwsAccessRole role = AwsAccessRole.newBuilder().setIamRoleId(iamRoleId).build();
    AwsProperties awsProperties = AwsProperties.newBuilder().setAccessRole(role).build();
    Connection connection = Connection.newBuilder().setAws(awsProperties).build();
    createAwsConnection(projectId, location, connectionId, connection);
  }

  static void createAwsConnection(
      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);
      AwsAccessRole role = response.getAws().getAccessRole();
      System.out.println(
          "Aws connection created successfully : Aws userId :"
              + role.getIamRoleId()
              + " Aws externalId :"
              + role.getIdentity());
    }
  }
}

Vertrauensstellung zur AWS-Rolle hinzufügen

BigQuery Omni bietet zwei Methoden für den sicheren Zugriff auf Daten aus Amazon S3. Sie können entweder dem Google Cloud-Dienstkonto Zugriff auf Ihre AWS-Rolle gewähren oder Sie müssen dem Anbieter das Google Cloud-Dienstkonto als Zielgruppe hinzufügen, wenn Ihr AWS-Konto über einen Benutzerdefinierten Identitätsanbieter für accounts.google.com verfügt:

Vertrauensrichtlinie zur AWS-Rolle hinzufügen

Die Vertrauensstellung ermöglicht es der Verbindung, die Rolle zu übernehmen und auf die Amazon S3-Daten zuzugreifen, wie in der Rollenrichtlinie angegeben.

Verwenden Sie die AWS Console oder Terraform, um eine Vertrauensstellung hinzuzufügen:

AWS Console

  1. Rufen Sie die AWS IAM-Konsole auf. Achten Sie darauf, dass Sie sich in dem Konto befinden, zu dem der Amazon S3-Bucket gehört, auf den Sie zugreifen möchten.
  2. Wählen Sie Rollen aus.
  3. Wählen Sie den von Ihnen erstellten ROLE_NAME aus.
  4. Klicken Sie auf Bearbeiten und gehen Sie dann so vor:

    1. Legen Sie Maximale Sitzungsdauer auf 12 Stunden fest. Da jede Abfrage bis zu sechs Stunden ausgeführt werden kann, ist diese Dauer ein weiterer Versuch möglich. Wenn Sie die Sitzungsdauer auf mehr als 12 Stunden erhöhen, können keine weiteren Wiederholungen ausgeführt werden. Weitere Informationen finden Sie unter Zeitlimit für die Ausführung von Abfragen/Multi-Anweisungen.

      Schaltfläche &quot;Edit&quot; (Bearbeiten) in AWS zum Festlegen der Sitzungsdauer.

    2. Klicken Sie auf Änderungen speichern.

  5. Wählen Sie Vertrauensstellungen aus und klicken Sie auf Vertrauensstellung bearbeiten. Ersetzen Sie den Richtlinieninhalt durch Folgendes:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "IDENTITY_ID"
            }
          }
        }
      ]
    }

    Ersetzen Sie IDENTITY_ID durch den BigQuery-Google-Identitätswert, den Sie auf der AWS-Konsolenseite für die erstellte Verbindung finden.

  6. Klicken Sie auf Vertrauensrichtlinie aktualisieren.

Terraform

Aktualisieren Sie die aws_iam_role-Ressource in der Terraform-Konfiguration, um eine Vertrauensstellung hinzuzufügen:

    resource "aws_iam_role" "bigquery-omni-connection-role" {
      name                 = "bigquery-omni-connection"
      max_session_duration = 43200

      assume_role_policy = <<-EOF
          {
            "Version": "2012-10-17",
            "Statement": [
              {
                "Effect": "Allow",
                "Principal": {
                  "Federated": "accounts.google.com"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                  "StringEquals": {
                    "accounts.google.com:sub": "${google_bigquery_connection.connection.aws[0].access_role[0].identity}"
                  }
                }
              }
            ]
          }
          EOF
    }

Der Debugger ist jetzt einsatzbereit.

Benutzerdefinierten AWS-Identitätsanbieter konfigurieren

Wenn Ihr AWS-Konto über einen benutzerdefinierten Identitätsanbieter für accounts.google.com verfügt, müssen Sie die folgende IDENTITY_ID als Zielgruppe für den Anbieter hinzufügen. Dazu können Sie so vorgehen:

  1. Rufen Sie in der AWS Console die Seite IAM auf.

    AWS IAM aufrufen

  2. Rufen Sie IAM > Identitätsanbieter auf.

  3. Wählen Sie den Identitätsanbieter für accounts.google.com aus.

  4. Klicken Sie auf Zielgruppe hinzufügen und fügen Sie IDENTITY_ID als Zielgruppe hinzu.

Der Debugger ist jetzt einsatzbereit.

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