Menghubungkan ke Amazon S3

Sebagai administrator BigQuery, Anda dapat membuat koneksi untuk memungkinkan analis data mengakses data yang tersimpan di bucket Amazon Simple Storage Service (Amazon S3).

BigQuery Omni mengakses data Amazon S3 melalui koneksi. Setiap koneksi memiliki pengguna Identity and Access Management Amazon Web Services (AWS) yang unik. Anda memberikan izin kepada pengguna melalui peran AWS IAM. Kebijakan dalam peran AWS IAM menentukan data yang dapat diakses BigQuery untuk setiap koneksi.

Koneksi diperlukan untuk membuat kueri data Amazon S3 dan mengekspor hasil kueri dari BigQuery ke bucket Amazon S3 Anda.

Sebelum memulai

Pastikan Anda sudah membuat resource berikut:

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan guna membuat koneksi untuk mengakses data Amazon S3, minta administrator untuk memberi Anda peran IAM BigQuery Connection Admin (roles/bigquery.connectionAdmin) pada project. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Membuat kebijakan AWS IAM untuk BigQuery

Pastikan Anda mengikuti praktik terbaik keamanan untuk Amazon S3. Sebaiknya Anda melakukan hal berikut:

  • Siapkan kebijakan AWS yang mencegah akses ke bucket Amazon S3 melalui HTTP.
  • Siapkan kebijakan AWS yang mencegah akses publik ke bucket Amazon S3 Anda.
  • Gunakan enkripsi sisi server Amazon S3.
  • Batasi izin yang diberikan ke Akun Google sesuai batas minimum yang diperlukan.
  • Siapkan CloudTrails dan aktifkan peristiwa data Amazon S3.

Untuk membuat kebijakan AWS IAM, gunakan Konsol AWS atau Terraform:

Konsol AWS

  1. Buka konsol AWS Identity and Access Management (IAM). Pastikan Anda menggunakan akun yang memiliki bucket Amazon S3 yang ingin diakses.
  2. Pilih Kebijakan > Buat kebijakan (terbuka di tab baru).
  3. Klik JSON dan tempelkan kode berikut ke editor:

    {
     "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/*"
          ]
        }
     ]
    }

    Ganti kode berikut:

    • BUCKET_NAME: bucket Amazon S3 yang ingin diakses oleh BigQuery.
    • EXPORT_PERM (opsional): izin tambahan jika Anda ingin mengekspor data ke bucket Amazon S3. Ganti dengan "s3:PutObject"
      • Untuk memisahkan kontrol akses ekspor, sebaiknya buat koneksi lain dengan peran AWS IAM terpisah dan berikan akses hanya tulis ke peran tersebut. Untuk kontrol akses yang lebih terperinci, Anda juga dapat membatasi akses peran ke jalur bucket tertentu.
  4. Di kolom Nama, masukkan nama kebijakan, seperti bq_omni_read_only.

  5. Klik Buat kebijakan.

Kebijakan Anda dibuat dengan Amazon Resource Name (ARN) dalam format berikut:

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

Ganti kode berikut:

  • AWS_ACCOUNT_ID: nomor ID pengguna AWS IAM koneksi.
  • POLICY_NAME: nama kebijakan yang Anda pilih.

Terraform

Tambahkan konfigurasi berikut ke konfigurasi Terraform untuk melampirkan kebijakan ke resource bucket Amazon S3:

  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
  }

Ganti kode berikut:

  • BUCKET_NAME: bucket Amazon S3 yang ingin diakses oleh BigQuery.
  • EXPORT_PERM (opsional): izin tambahan jika Anda ingin mengekspor data ke bucket Amazon S3. Ganti dengan "s3:PutObject"
    • Untuk memisahkan kontrol akses ekspor, sebaiknya buat koneksi lain dengan peran AWS IAM terpisah dan berikan akses hanya tulis ke peran tersebut. Untuk kontrol akses yang lebih terperinci, Anda juga dapat membatasi akses peran ke jalur bucket tertentu.

Membuat peran AWS IAM untuk BigQuery

Selanjutnya, buat peran yang mengizinkan akses ke bucket Amazon S3 dari dalam BigQuery. Peran ini menggunakan kebijakan yang Anda buat di bagian sebelumnya.

Untuk membuat peran AWS IAM, gunakan Konsol AWS atau Terraform:

Konsol AWS

  1. Buka konsol AWS IAM. Pastikan Anda menggunakan akun yang memiliki bucket Amazon S3 yang ingin diakses.
  2. Pilih Peran > Buat peran.
  3. Pada bagian Pilih jenis entitas tepercaya, pilih Identitas Web.
  4. Untuk Penyedia Identitas, pilih Google.
  5. Untuk Audiens, masukkan 00000 sebagai nilai placeholder. Anda akan mengganti nilai ini nanti.
  6. Klik Berikutnya: Izin.
  7. Untuk memberikan akses peran ke data Amazon S3, lampirkan kebijakan IAM ke peran tersebut. Telusuri kebijakan yang Anda buat di bagian sebelumnya, lalu klik tombolnya.
  8. Klik Berikutnya: Tanda.
  9. Klik Berikutnya: Tinjau. Masukkan nama untuk peran, seperti BQ_Read_Only.
  10. Klik Buat peran.

Terraform

Tambahkan kode di bawah ke konfigurasi Terraform Anda untuk membuat peran IAM dan menetapkan kebijakan ke peran yang dibuat:

  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
  }

Membuat koneksi

Untuk terhubung ke bucket Amazon S3, gunakan konsol Google Cloud, alat command line bq, atau library klien:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di menu Add, pilih External data source.

  3. Di panel External data source, masukkan informasi berikut:

    • Untuk Connection type, pilih BigLake on AWS (via BigQuery Omni).
    • Untuk Connection ID, masukkan ID untuk resource koneksi. Anda dapat menggunakan huruf, angka, tanda hubung, dan garis bawah.
    • Pilih lokasi tempat Anda ingin membuat koneksi.
    • Opsional: Untuk Friendly name, masukkan nama yang mudah digunakan untuk koneksi, seperti My connection resource. Nama yang cocok dapat berupa nilai apa pun yang membantu Anda mengidentifikasi resource koneksi jika perlu mengubahnya nanti.
    • Opsional: Untuk Description, masukkan deskripsi untuk resource koneksi ini.
    • Untuk AWS role id, masukkan ID peran IAM lengkap yang Anda buat dalam format ini: arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME.
  4. Klik Create connection.

  5. Klik Go to connection.

  6. Di panel Connection info, salin identitas Google BigQuery. Ini adalah akun utama Google yang spesifik untuk setiap koneksi. Contoh:

      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"
      }
    }
  }

Ganti kode berikut:

bq

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

Ganti kode berikut:

  • AWS_ACCOUNT_ID: nomor ID pengguna AWS IAM koneksi
  • ROLE_NAME: nama kebijakan peran yang Anda pilih
  • AWS_LOCATION: Lokasi Amazon S3 di Google Cloud
  • CONNECTION_ID: ID yang Anda berikan untuk resource koneksi ini.

Command line menampilkan output berikut:

  Identity: IDENTITY_ID

Outputnya berisi hal berikut:

  • IDENTITY_ID: akun utama Google yang dikontrol Google Cloud dan bersifat khusus untuk setiap koneksi.

Catat nilai IDENTITY_ID.

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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());
    }
  }
}

Menambahkan hubungan kepercayaan ke peran AWS

BigQuery Omni menyediakan dua metode untuk mengakses data dengan aman dari Amazon S3. Anda dapat memberikan akses ke peran AWS kepada akun layanan Google Cloud. Atau, jika akun AWS Anda memiliki penyedia identitas kustom untuk accounts.google.com, Anda harus menambahkan akun layanan Google Cloud sebagai audiens ke penyedia tersebut:

Menambahkan kebijakan kepercayaan ke peran AWS

Hubungan kepercayaan memungkinkan koneksi tersebut mengambil peran dan mengakses data Amazon S3 seperti yang ditentukan dalam kebijakan peran.

Untuk menambahkan hubungan kepercayaan, gunakan Konsol AWS atau Terraform:

Konsol AWS

  1. Buka konsol AWS IAM. Pastikan Anda menggunakan akun yang memiliki bucket Amazon S3 yang ingin diakses.
  2. Pilih Peran.
  3. Pilih ROLE_NAME yang telah Anda buat.
  4. Klik Edit, lalu lakukan tindakan berikut:

    1. Setel Durasi sesi maksimum ke 12 jam. Karena setiap kueri dapat berjalan hingga enam jam, durasi ini memungkinkan satu percobaan ulang tambahan. Peningkatan durasi sesi lebih dari 12 jam tidak akan memungkinkan percobaan ulang tambahan. Untuk informasi selengkapnya, lihat batas waktu eksekusi kueri/kueri multi-pernyataan.

      Tombol Edit di AWS untuk menyetel durasi sesi.

    2. Klik Simpan perubahan.

  5. Pilih Hubungan Kepercayaan lalu klik Edit hubungan kepercayaan. Ganti konten kebijakan dengan konten berikut:

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

    Ganti IDENTITY_ID dengan nilai identitas Google BigQuery, yang dapat Anda temukan di halaman konsol AWS untuk koneksi yang Anda buat.

  6. Klik Perbarui Kebijakan Kepercayaan.

Terraform

Update resource aws_iam_role di konfigurasi Terraform untuk menambahkan hubungan kepercayaan:

    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
    }

Koneksi kini siap digunakan.

Mengonfigurasi penyedia identitas AWS kustom

Jika akun AWS Anda memiliki penyedia identitas kustom untuk accounts.google.com, Anda harus menambahkan IDENTITY_ID sebagai audiens kepada penyedia. Anda dapat melakukannya dengan:

  1. Di konsol AWS, buka halaman IAM.

    Buka AWS IAM

  2. Buka IAM > Penyedia Identitas.

  3. Pilih penyedia identitas untuk accounts.google.com.

  4. Klik Tambahkan Audiens dan tambahkan IDENTITY_ID sebagai audiens.

Koneksi kini siap digunakan.

Berbagi koneksi dengan pengguna

Anda dapat memberikan peran berikut untuk mengizinkan pengguna membuat kueri data dan mengelola koneksi:

  • roles/bigquery.connectionUser: memungkinkan pengguna menggunakan koneksi untuk terhubung dengan sumber data eksternal dan menjalankan kueri pada sumber data tersebut.

  • roles/bigquery.connectionAdmin: memungkinkan pengguna mengelola koneksi.

Untuk informasi selengkapnya tentang peran dan izin IAM di BigQuery, baca Peran dan izin bawaan.

Pilih salah satu opsi berikut:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

    Koneksi dicantumkan dalam project Anda, dalam grup yang disebut Koneksi eksternal.

  2. Di panel Penjelajah, klik nama project Anda > Koneksi eksternal > koneksi.

  3. Di panel Detail, klik Bagikan untuk membagikan koneksi. Kemudian, lakukan hal berikut:

    1. Dalam dialog Izin koneksi, bagikan koneksi dengan akun utama lain dengan menambahkan atau mengedit akun utama.

    2. Klik Simpan.

bq

Anda tidak dapat berbagi koneksi dengan alat command line bq. Untuk berbagi koneksi, gunakan konsol Google Cloud atau metode BigQuery Connections API untuk melakukannya.

API

Gunakan metode projects.locations.connections.setIAM di bagian referensi REST API Koneksi BigQuery, dan berikan instance resource policy.

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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");
    }
  }
}

Langkah selanjutnya