BigQuery-AWS-Verbindung erstellen

BigQuery Omnium 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.

Vorbereitung

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

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

So erstellen Sie eine AWS IAM-Rolle:

  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 S3-Bucket gehört, auf den Sie zugreifen möchten.
  2. Wählen Sie Rollen > Rolle erstellen aus.
  3. Wählen Sie unter Art der vertrauenswürdigen Entität auswählen die Option Ein weiteres AWS-Konto aus.
  4. Geben Sie unter Konto-ID die numerische ID Ihres AWS-Kontos ein. Später ersetzen Sie diesen Wert durch die ID-Nummer des AWS IAM-Nutzers der Verbindung.
  5. Wählen Sie Externe ID anfordern aus und geben Sie 00000 als Platzhalterwert ein. Später ersetzen Sie diesen Wert durch die externe ID der Verbindung.
  6. Klicken Sie auf Weiter: Berechtigungen.
  7. Um der Rolle Zugriff auf Ihre AWS-Daten zu gewähren, erstellen Sie eine IAM-Richtlinie und hängen diese an die Rolle an. Beispielsweise können Sie eine IAM-Richtlinie erstellen, die schreibgeschützten Zugriff auf Ihren Bucket ermöglicht.

    1. Wählen Sie Richtlinien > Richtlinie erstellen aus. Die Optionen werden in einem neuen Tab angezeigt.
    2. 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"
        ],
        "Resource": ["arn:aws:s3:::BUCKET_NAME/*"]
      }
    ]
    }
    

    Dabei gilt:

    • BUCKET_NAME ist der S3-Bucket, auf den BigQuery zugreifen soll.
  8. Geben Sie im Feld Name einen Richtliniennamen ein.

  9. Klicken Sie zum Erstellen der S3-Zugriffsrichtlinie auf Richtlinie erstellen.

  10. Wählen Sie auf dem Tab Rolle erstellen die Richtlinie aus, um sie an die Rolle anzuhängen.

  11. Geben Sie im Feld Name einen Rollennamen ein.

  12. Klicken Sie auf Rolle erstellen.

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

  arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME
  

Dabei gilt:

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

Wenn Sie Daten in einen Amazon S3-Bucket exportieren müssen, benötigen Sie außerdem die Berechtigung s3:PutObject. Um die Zugriffssteuerung getrennt festzulegen, 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.

BigQuery-AWS-Verbindung erstellen

Zum Erstellen einer BigQuery-AWS-Verbindung können Sie die Cloud Console, das bq-Befehlszeilentool oder die Clientbibliothek verwenden.

Console

  1. Rufen Sie zum Erstellen einer Verbindungsressource die BigQuery-Seite in der Cloud Console auf.

    Zur Seite „BigQuery“

  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 unter Verbindungstyp die Option AWS 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 unter Verbindungsstandort den Wert aws-us-east-1 aus.
    • 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. Die Befehlszeile zeigt die folgende Ausgabe an:

        IAM user: USER_ID
        External Id: EXTERNAL_ID
      

    Die Ausgabe enthält Folgendes:

    • USER_ID ist der AWS-Nutzer, der von Google Cloud für jede Verbindung verwaltet wird.
    • EXTERNAL_ID ist ein eindeutiger String, der jeder Verbindung zugewiesen wird.

      Notieren Sie sich die Werte für USER_ID und EXTERNAL_ID.

bq

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

Dabei gilt:

  • AWS_ACCOUNT_ID ist die ID-Nummer des AWS IAM-Nutzers der Verbindung.
  • ROLE_NAME ist der Name der Rollenrichtlinie, die Sie auswählen.
  • AWS_LOCATION ist der AWS-Standort in Google Cloud. Für dieses Feld muss aws-us-east-1 festgelegt werden.
  • CONNECTION_NAME ist der Name, den Sie dieser Verbindungsressource zuweisen.

Die Befehlszeile zeigt die folgende Ausgabe an:

  IAM user: USER_ID
  External Id: EXTERNAL_ID

Die Ausgabe enthält Folgendes:

  • USER_ID ist der AWS-Nutzer, der von Google Cloud für jede Verbindung verwaltet wird.
  • EXTERNAL_ID ist ein eindeutiger String, der jeder Verbindung zugewiesen wird.

Notieren Sie sich die Werte für USER_ID und EXTERNAL_ID.

Java

import com.google.cloud.bigquery.connection.v1.AwsCrossAccountRole;
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";
    // Note: As of now location only supports 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";
    AwsCrossAccountRole role = AwsCrossAccountRole.newBuilder().setIamRoleId(iamRoleId).build();
    AwsProperties awsProperties = AwsProperties.newBuilder().setCrossAccountRole(role).build();
    Connection connection = Connection.newBuilder().setAws(awsProperties).build();
    createAwsConnection(projectId, location, connectionId, connection);
  }

  public 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);
      AwsCrossAccountRole role = response.getAws().getCrossAccountRole();
      System.out.println(
          "Aws connection created successfully : Aws userId :"
              + role.getIamUserId()
              + " Aws externalId :"
              + role.getExternalId());
    }
  }
}

Vertrauensstellung zur AWS-Rolle hinzufügen

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

So fügen Sie eine Vertrauensstellung hinzu:

  1. Rufen Sie die AWS IAM-Konsole auf. Achten Sie darauf, dass Sie sich in dem Konto befinden, zu dem der 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. Legen Sie für Maximale Sitzungsdauer für Befehlszeile/API den Wert 12 Stunden fest.
  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": {
          "AWS": "GOOGLE_AWS_USER"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
          "StringEquals": {
            "sts:ExternalId": "EXTERNAL_ID"
          }
        }
    }]
    }
    
  6. Klicken Sie auf Vertrauensrichtlinie aktualisieren.

Der Debugger ist jetzt einsatzbereit.

Weitere Informationen