Membuat koneksi ke Blob Storage

Sebagai administrator BigQuery, Anda dapat membuat koneksi untuk memungkinkan analis data mengakses data yang disimpan di Azure Blob Storage.

BigQuery Omni mengakses data Blob Storage melalui koneksi. BigQuery Omni mendukung penggabungan identitas workload Azure. Dukungan BigQuery Omni untuk penggabungan identitas workload Azure memungkinkan Anda memberikan akses untuk aplikasi Azure di tenant ke akun layanan Google. Tidak ada secret klien aplikasi yang akan dikelola oleh Anda atau Google.

Setelah membuat koneksi BigQuery Azure, Anda dapat membuat kueri data Blob Storage atau mengekspor hasil kueri ke Blob Storage.

Sebelum memulai

Peran yang diperlukan

  • Untuk mendapatkan izin yang diperlukan guna membuat koneksi untuk mengakses data Azure Blob Storage, 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.

  • Pastikan Anda memiliki izin Azure IAM berikut di tenant Anda:
    • Application.ReadWrite.All
    • AppRoleAssignment.ReadWrite.All

Kuota

Untuk informasi selengkapnya tentang kuota, lihat BigQuery Connection API.

Membuat koneksi Azure

Untuk membuat koneksi Azure, ikuti langkah-langkah berikut:

  1. Buat aplikasi di tenant Azure.
  2. Buat koneksi BigQuery Azure.
  3. Tambahkan kredensial gabungan.
  4. Tetapkan peran ke aplikasi Azure AD BigQuery.

Untuk informasi selengkapnya tentang penggunaan kredensial identitas gabungan untuk mengakses data di Azure, lihat Penggabungan identitas workload.

Membuat aplikasi di tenant Azure

Untuk membuat aplikasi di tenant Azure, ikuti langkah-langkah berikut:

Azure Portal

  1. Di portal Azure, buka App registrations, lalu klik New registration.

  2. Untuk Name, masukkan nama aplikasi Anda.

  3. Untuk Supported account types, pilih Accounts in this organizational directory only.

  4. Untuk mendaftarkan permohonan baru, klik Register.

  5. Catat Application (client) ID. Anda harus memberikan ID ini saat membuat koneksi.

    Portal Azure untuk membuat aplikasi

Terraform

Tambahkan kode berikut ke file konfigurasi Terraform Anda:

  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
  }

Untuk informasi selengkapnya, lihat cara mendaftarkan aplikasi di Azure.

Membuat koneksi

Konsol

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di menu Add data , pilih External data source.

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

    • Untuk Connection type, pilih BigLake on Azure (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 mudah digunakan dapat berupa nilai apa pun yang membantu Anda mengidentifikasi resource koneksi jika perlu mengubahnya nanti.
    • Opsional: Untuk Description, masukkan deskripsi untuk resource koneksi.
    • Untuk Azure tenant id, masukkan ID tenant Azure, yang juga disebut sebagai ID Direktori (tenant).
    • Aktifkan kotak centang Use federated identity, lalu masukkan ID aplikasi (klien) gabungan Azure.

      Untuk mempelajari cara mendapatkan ID Azure, lihat Membuat aplikasi di tenant Azure.

  4. Klik Create connection.

  5. Klik Go to connection.

  6. Di bagian Connection info, catat nilai BigQuery Google identity, yang merupakan ID akun layanan. ID ini ditujukan untuk akun layanan Google Cloud yang Anda beri otorisasi untuk mengakses aplikasi Anda.

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

Ganti TENANT_ID dengan ID tenant direktori Azure yang berisi akun Blob Storage.

bq

Gunakan perintah bq mk. Untuk mendapatkan output dalam format JSON, gunakan parameter --format=json.

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

Ganti yang berikut ini:

  • TENANT_ID: ID tenant direktori Azure yang berisi akun Azure Storage.
  • AZURE_LOCATION: region Azure tempat data Azure Storage Anda berada. BigQuery Omni mendukung region azure-eastus2.
  • APP_ID: ID Aplikasi (klien) Azure. Untuk mempelajari cara mendapatkan ID ini, lihat Membuat aplikasi di tenant Azure.
  • CONNECTION_ID: nama koneksi.

Output mirip dengan yang berikut ini:

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

Output ini mencakup nilai-nilai berikut:

  • APP_ID: ID aplikasi yang Anda buat.

  • SUBJECT_ID: ID akun layanan Google Cloud yang diizinkan pengguna untuk mengakses aplikasi mereka. Nilai ini diperlukan saat Anda membuat kredensial gabungan di Azure.

Perhatikan nilai APP_ID dan SUBJECT_ID untuk digunakan pada langkah berikutnya.

Selanjutnya, tambahkan kredensial gabungan untuk aplikasi Anda.

Menambahkan kredensial gabungan

Untuk membuat kredensial gabungan, ikuti langkah-langkah berikut:

Azure Portal

  1. Di portal Azure, buka App registrations, lalu klik aplikasi Anda.

  2. Pilih Certificates & secrets > Federated credentials > Add credentials. Kemudian, lakukan hal berikut:

    1. Dari daftar Federated credential scenario, pilih Other issuer.

    2. Untuk Issuer, masukkan https://accounts.google.com.

    3. Untuk Subject identifier, masukkan BigQuery Google identity dari akun layanan Google Cloud yang Anda dapatkan saat membuat koneksi.

    4. Untuk Name, masukkan nama untuk kredensial.

    5. Klik Add.

Terraform

Tambahkan kode berikut ke file konfigurasi Terraform Anda:

  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
  }

Untuk informasi selengkapnya, lihat Mengonfigurasi aplikasi agar memercayai penyedia identitas eksternal.

Menetapkan peran ke aplikasi Azure BigQuery

Untuk menetapkan peran pada aplikasi Azure BigQuery, gunakan Azure Portal, Azure PowerShell, atau Microsoft Management REST API:

Azure Portal

Anda dapat melakukan penetapan peran di Azure Portal dengan login sebagai pengguna menggunakan izin Microsoft.Authorization/roleAssignments/write. Penetapan peran memungkinkan koneksi BigQuery Azure mengakses data Azure Storage seperti yang ditentukan dalam kebijakan peran.

Untuk menambahkan penetapan peran menggunakan Azure Portal, ikuti langkah-langkah berikut:

  1. Dari akun Azure Storage, masukkan IAM di kotak penelusuran.

  2. Klik Access Control (IAM).

  3. Klik Add, lalu pilih Add role assignments.

  4. Untuk memberikan akses baca saja, pilih peran Storage Blob Data Reader. Untuk memberikan akses baca-tulis, pilih peran Storage Blob Data Contributor.

  5. Tetapkan Assign access to ke User, group, or service principal.

  6. Klik Select members.

  7. Di kolom Select, masukkan nama aplikasi Azure yang Anda berikan saat membuat aplikasi di tenant Azure.

  8. Klik Save.

Untuk informasi selengkapnya, lihat Menetapkan peran Azure menggunakan portal Azure.

Terraform

Tambahkan kode berikut ke file konfigurasi Terraform Anda:

  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

Untuk menambahkan penetapan peran untuk akun utama layanan di cakupan resource, Anda dapat menggunakan perintah New-AzRoleAssignment:

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

Ganti yang berikut ini:

  • APP_NAME: nama aplikasi.
  • ROLE_NAME: nama peran yang ingin Anda tetapkan.
  • RESOURCE_NAME: nama resource.
  • RESOURCE_TYPE: jenis resource.
  • PARENT_RESOURCE: resource induk.
  • RESOURCE_GROUP_NAME: nama grup resource.

Untuk informasi selengkapnya tentang cara menggunakan Azure PowerShell untuk menambahkan akun utama layanan baru, lihat Menetapkan peran Azure menggunakan Azure PowerShell.

Azure CLI

Untuk menambahkan penetapan peran bagi akun utama layanan di cakupan resource, Anda dapat menggunakan alat command line Azure. Anda harus memiliki izin Microsoft.Authorization/roleAssignments/write agar akun penyimpanan dapat memberikan peran.

Untuk menetapkan peran, seperti peran Storage Blob Data Reader, ke akun utama layanan, jalankan perintah az role assignment create:

  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

Ganti kode berikut:

  • SP_ID: ID akun utama layanan. Akun utama layanan ini ditujukan untuk aplikasi yang Anda buat. Guna mendapatkan akun utama layanan untuk koneksi gabungan, lihat Objek akun utama layanan.
  • STORAGE_ACCOUNT_NAME: nama akun penyimpanan.
  • RESOURCE_GROUP_NAME: nama grup resource.
  • SUBSCRIPTION_ID: ID langganan.

Untuk informasi selengkapnya, lihat Menetapkan peran Azure menggunakan Azure CLI.

Microsoft REST API

Untuk menambahkan penetapan peran untuk akun utama layanan, Anda dapat mengirimkan permintaan HTTP ke Microsoft Management.

Untuk memanggil Microsoft Graph REST API, ambil token OAuth untuk aplikasi. Untuk informasi selengkapnya, lihat Mendapatkan akses tanpa pengguna. Aplikasi yang memanggil Microsoft Graph REST API harus memiliki izin aplikasi Application.ReadWrite.All.

Untuk membuat token OAuth, jalankan perintah berikut:

  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')

Ganti yang berikut ini:

  • TENANT_ID: ID tenant yang cocok dengan ID direktori Azure yang berisi akun Azure Storage.
  • CLIENT_ID: client ID Azure.
  • CLIENT_SECRET: secret klien Azure.

Dapatkan ID peran bawaan Azure yang ingin Anda tetapkan ke akun utama layanan.

Berikut adalah beberapa peran umum:

Untuk menetapkan peran ke akun utama layanan, panggil Microsoft Graph REST API ke Azure Resource Management REST API:

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

Ganti yang berikut ini:

  • ROLE_ASSIGNMENT_ID: ID peran.
  • SP_ID: ID akun utama layanan. Akun utama layanan ini ditujukan untuk aplikasi yang Anda buat. Guna mendapatkan akun utama layanan untuk koneksi gabungan, lihat Objek akun utama layanan.
  • SUBSCRIPTION_ID: ID langganan.
  • RESOURCE_GROUP_NAME: nama grup resource.
  • STORAGE_ACCOUNT_NAME: nama akun penyimpanan.
  • SUBSCRIPTION_ID: ID langganan.

Koneksi kini siap digunakan. Namun, mungkin ada penundaan propagasi untuk penetapan peran di Azure. Jika Anda tidak dapat menggunakan koneksi karena masalah izin, coba lagi setelah beberapa saat.

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