התחברות ל-Blob Storage

אדמינים של BigQuery יכולים ליצור חיבור כדי לאפשר לנתוני ניתוח גישה לנתונים שמאוחסנים ב-Azure Blob Storage.

BigQuery Omni ניגש לנתונים ב-Blob Storage דרך חיבורים. ‫BigQuery Omni תומך באיחוד שירותי אימות הזהות של עומסי עבודה ב-Azure. התמיכה של BigQuery Omni באיחוד שירותי אימות הזהות של עומסי עבודה ב-Azure מאפשרת להעניק לאפליקציית Azure בדייר שלכם גישה לחשבון שירות של Google. אין סודות של לקוח האפליקציה שצריך לנהל בעצמך או ש-Google צריכה לנהל.

אחרי שיוצרים חיבור BigQuery ל-Azure, אפשר להריץ שאילתות על הנתונים ב-Blob Storage או לייצא את תוצאות השאילתות ל-Blob Storage.

לפני שמתחילים

התפקידים הנדרשים

מכסות

מידע נוסף על מכסות זמין במאמר בנושא BigQuery Connection API.

יצירת חיבור ל-Azure

כדי ליצור חיבור ל-Azure, מבצעים את השלבים הבאים:

  1. יוצרים אפליקציה בדייר (tenant) שלכם ב-Azure.
  2. יוצרים את החיבור ל-BigQuery Azure.
  3. הוספת פרטי כניסה מאוחדים
  4. הקצאת תפקיד לאפליקציות BigQuery Azure AD.

מידע נוסף על שימוש בפרטי כניסה של זהויות מאוחדות כדי לגשת לנתונים ב-Azure זמין במאמר איחוד שירותי אימות הזהות של עומסי עבודה.

יצירת אפליקציה בדייר Azure

כדי ליצור אפליקציה בדייר Azure, פועלים לפי השלבים הבאים:

Azure Portal

  1. בפורטל Azure, עוברים אל App registrations (רישום אפליקציות) ולוחצים על New registration (רישום חדש).

  2. בשדה Names, מזינים שם לאפליקציה.

  3. בקטע Supported account types (סוגי חשבונות נתמכים), בוחרים באפשרות Accounts in this organizational directory only (חשבונות רק בספרייה הארגונית הזו).

  4. כדי לרשום את האפליקציה החדשה, לוחצים על Register (רישום).

  5. רושמים את מזהה האפליקציה (אפליקציית הלקוח). צריך לספק את המזהה הזה כשיוצרים את הקישור.

    Azure portal ליצירת אפליקציות

Terraform

מוסיפים את השורות הבאות לקובץ התצורה של Terraform:

  data "azuread_client_config" "current" {}

  resource "azuread_application" "example" {
    display_name = "bigquery-omni-connector"
    owners       = [data.azuread_client_config.current.object_id]
  }

  resource "azuread_service_principal" "example" {
    client_id                    = azuread_application.example.client_id
    app_role_assignment_required = false
    owners                       = [data.azuread_client_config.current.object_id]
  }

מידע נוסף על רישום אפליקציה ב-Azure

יצירת חיבור

המסוף

  1. במסוף Google Cloud , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית Explorer, לוחצים על Add data.

    תיבת הדו-שיח הוספת נתונים נפתחת.

  3. בחלונית Filter By, בקטע Data Source Type, בוחרים באפשרות Databases.

    אפשרות אחרת היא להזין Azure בשדה חיפוש מקורות נתונים.

  4. בקטע מקורות נתונים מומלצים, לוחצים על Azure Blob Storage.

  5. לוחצים על כרטיס הפתרון Azure Blob Storage Omni: BigQuery Federation.

  6. בתיבת הדו-שיח Create table, בשדה Connection ID, בוחרים באפשרות Create a new ABS connection.

  7. בחלונית מקור נתונים חיצוני, מזינים את הפרטים הבאים:

    • בקטע סוג החיבור, בוחרים באפשרות BigLake ב-Azure (דרך BigQuery Omni).
    • בשדה מזהה החיבור, מזינים מזהה למשאב החיבור. אפשר להשתמש באותיות, במספרים, במקפים ובקווים תחתונים.
    • בוחרים את המיקום שבו רוצים ליצור את הקישור.
    • אופציונלי: בשדה Friendly name (שם ידידותי), מזינים שם ידידותי לחיבור, כמו My connection resource. השם הידידותי יכול להיות כל ערך שיעזור לכם לזהות את משאב החיבור אם תצטרכו לשנות אותו בהמשך.
    • אופציונלי: בשדה Description, מזינים תיאור של משאב החיבור.
    • בשדה Azure tenant id (מזהה הדייר ב-Azure), מזינים את מזהה הדייר ב-Azure, שנקרא גם מזהה הארגון שלי (הדייר).
    • מסמנים את התיבה Use federated identity (שימוש בזהות מאוחדת) ומזינים את מזהה הלקוח של האפליקציה המאוחדת ב-Azure.

      במאמר יצירת אפליקציה בדייר Azure מוסבר איך מקבלים מזהים של Azure.

  8. לוחצים על יצירת קישור.

  9. לוחצים על מעבר לחיבור.

  10. בקטע Connection info (פרטי החיבור), רושמים את הערך של BigQuery Google identity (זהות Google ב-BigQuery), שהוא מזהה חשבון השירות. המזהה הזה הוא של חשבון השירותGoogle Cloud שאתם נותנים לו הרשאה לגשת לאפליקציה שלכם.

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

מחליפים את TENANT_ID במזהה הדייר של ספריית Azure שמכילה את חשבון Blob Storage.

BQ

משתמשים בפקודה bq mk. כדי לקבל את הפלט בפורמט JSON, משתמשים בפרמטר --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

מחליפים את מה שכתוב בשדות הבאים:

  • TENANT_ID: מזהה הדייר בספריית Azure שמכילה את חשבון Azure Storage.
  • AZURE_LOCATION: האזור ב-Azure שבו נמצאים הנתונים שלכם ב-Azure Storage. ‫BigQuery Omni תומך באזור azure-eastus2.
  • APP_ID: מזהה האפליקציה (הלקוח) ב-Azure. במאמר יצירת אפליקציה בדייר Azure מוסבר איך מקבלים את המזהה הזה.
  • CONNECTION_ID: השם של החיבור.

הפלט אמור להיראות כך:

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

הפלט הזה כולל את הערכים הבאים:

  • APP_ID: המזהה של האפליקציה שיצרתם.

  • SUBJECT_ID: המזהה של Google Cloud חשבון השירות שהמשתמש מאשר לו גישה לאפליקציה שלו. הערך הזה נדרש כשיוצרים פרטי כניסה מאוחדים ב-Azure.

חשוב לשים לב לערכים APP_ID ו-SUBJECT_ID כדי להשתמש בהם בשלבים הבאים.

.

בשלב הבא, מוסיפים פרטי כניסה מאוחדים לאפליקציה.

הוספת פרטי כניסה מאוחדים

כדי ליצור פרטי כניסה מאוחדים, פועלים לפי השלבים הבאים:

Azure Portal

  1. בפורטל Azure, עוברים אל App registrations (רישום אפליקציות) ולוחצים על האפליקציה.

  2. בוחרים באפשרות אישורים וסודות > פרטי כניסה מאוחדים > הוספת פרטי כניסה. לאחר מכן, מבצעים את הפעולות הבאות:

    1. ברשימה Federated credential scenario בוחרים באפשרות Other issuer.

    2. בשדה Issuer (מונפק על ידי), מזינים https://accounts.google.com.

    3. בשדה מזהה הנושא, מזינים את הזהות ב-Google BigQuery של חשבון השירות שקיבלתם כשיצרתם את החיבור. Google Cloud

    4. בשדה Name, מזינים שם לפרטי הכניסה.

    5. לוחצים על הוספה.

Terraform

מוסיפים את השורות הבאות לקובץ התצורה של Terraform:

  resource "azuread_application_federated_identity_credential" "example" {
    application_id = azuread_application.example.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
  }

מידע נוסף זמין במאמר הגדרת אפליקציה כך שתיתן אמון בספק זהויות חיצוני.

הקצאת תפקיד לאפליקציות של BigQuery ב-Azure

כדי להקצות תפקיד לאפליקציית Azure של BigQuery, משתמשים ב-Azure Portal, ב-Azure PowerShell או ב-Microsoft Management API בארכיטקטורת REST:

Azure Portal

כדי להקצות תפקידים בפורטל Azure, צריך להתחבר כמשתמש עם הרשאה Microsoft.Authorization/roleAssignments/write. הקצאת התפקיד מאפשרת לחיבור BigQuery Azure לגשת לנתוני Azure Storage בהתאם למדיניות התפקידים.

כדי להוסיף הקצאות תפקידים באמצעות פורטל Azure, פועלים לפי השלבים הבאים:

  1. בחשבון Azure Storage, מזינים IAM בסרגל החיפוש.

  2. לוחצים על Access Control (IAM).

  3. לוחצים על הוספה ובוחרים באפשרות הוספת הקצאות תפקידים.

  4. כדי לספק גישה לקריאה בלבד, בוחרים בתפקיד Storage Blob Data Reader. כדי לספק גישת קריאה וכתיבה, בוחרים בתפקיד Storage Blob Data Contributor.

  5. מגדירים את האפשרות הקצאת גישה אל למשתמש, קבוצה או חשבון ראשי של שירות.

  6. לוחצים על בחירת חברים.

  7. בשדה Select (בחירה), מזינים את שם האפליקציה ב-Azure שנתתם כשיצרתם את האפליקציה בדייר Azure.

  8. לוחצים על Save.

מידע נוסף זמין במאמר בנושא הקצאת תפקידים ב-Azure באמצעות פורטל Azure.

Terraform

מוסיפים את השורות הבאות לקובץ התצורה של Terraform:

  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

כדי להוסיף הקצאת תפקיד לחשבון שירות בהיקף משאב, אפשר להשתמש בפקודה New-AzRoleAssignment:

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

מחליפים את מה שכתוב בשדות הבאים:

  • APP_NAME: שם האפליקציה.
  • ROLE_NAME: שם התפקיד שרוצים להקצות.
  • RESOURCE_NAME: שם המשאב.
  • RESOURCE_TYPE: סוג המשאב.
  • PARENT_RESOURCE: משאב האב.
  • RESOURCE_GROUP_NAME: שם קבוצת המשאבים.

מידע נוסף על שימוש ב-Azure PowerShell כדי להוסיף מנהל שירות חדש זמין במאמר הקצאת תפקידי Azure באמצעות Azure PowerShell.

Azure CLI

כדי להוסיף הקצאת תפקיד למשתמש שירות בהיקף משאב, אפשר להשתמש בכלי שורת הפקודה של Azure. כדי להקצות תפקידים, צריכה להיות לכם הרשאה Microsoft.Authorization/roleAssignments/write בחשבון האחסון.

כדי להקצות תפקיד, כמו התפקיד Storage Blob Data Reader, לחשבון הראשי של השירות, מריצים את הפקודה 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

מחליפים את מה שכתוב בשדות הבאים:

מידע נוסף מופיע במאמר הקצאת תפקידים ב-Azure באמצעות Azure CLI.

Microsoft REST API

כדי להוסיף הקצאות תפקידים לחשבון שירות, אפשר לשלוח בקשת HTTP לניהול של מיקרוסופט.

כדי לשלוח קריאה ל-Microsoft Graph API בארכיטקטורת REST, צריך לאחזר אסימון OAuth לאפליקציה. מידע נוסף זמין במאמר בנושא קבלת גישה ללא משתמש. לאפליקציה שקראה ל-Microsoft Graph API בארכיטקטורת REST צריכה להיות הרשאת האפליקציה Application.ReadWrite.All.

כדי ליצור טוקן OAuth, מריצים את הפקודה הבאה:

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

מחליפים את מה שכתוב בשדות הבאים:

  • TENANT_ID: מזהה הדייר שתואם למזהה של ספריית Azure שמכילה את חשבון Azure Storage.
  • CLIENT_ID: מזהה הלקוח ב-Azure.
  • CLIENT_SECRET: סוד הלקוח ב-Azure.

מקבלים את המזהה של התפקידים המובנים של Azure שרוצים להקצות למנהל השירות.

אלה כמה תפקידים נפוצים:

כדי להקצות תפקיד לישות המורשית של השירות, קוראים ל-API של Microsoft Graph בארכיטקטורת REST ל-API של Azure Resource Management בארכיטקטורת REST:

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

מחליפים את מה שכתוב בשדות הבאים:

  • ROLE_ASSIGNMENT_ID: מזהה התפקיד.
  • SP_ID: מזהה הגורם המוסמך של השירות. זהו חשבון שירות של האפליקציה שיצרתם. מידע על חשבון השירות של חיבור מאוחד מופיע במאמר אובייקט חשבון שירות.
  • SUBSCRIPTION_ID: מזהה המינוי.
  • RESOURCE_GROUP_NAME: שם קבוצת המשאבים.
  • STORAGE_ACCOUNT_NAME: השם של חשבון האחסון.
  • SUBSCRIPTION_ID: מזהה המינוי.

החיבור מוכן לשימוש. עם זאת, יכול להיות עיכוב בהפצה של הקצאת תפקיד ב-Azure. אם אין לכם אפשרות להשתמש בחיבור בגלל בעיות הרשאה, נסו שוב אחרי זמן מה.

שיתוף חיבורים עם משתמשים

אתם יכולים להקצות את התפקידים הבאים כדי לאפשר למשתמשים לשלוח שאילתות לנתונים ולנהל חיבורים:

  • roles/bigquery.connectionUser: מאפשר למשתמשים להשתמש בחיבורים כדי להתחבר למקורות נתונים חיצוניים ולהריץ עליהם שאילתות.

  • roles/bigquery.connectionAdmin: מאפשר למשתמשים לנהל את החיבורים.

במאמר תפקידים והרשאות מוגדרים מראש יש מידע נוסף על תפקידים והרשאות ב-IAM ב-BigQuery.

בוחרים באחת מהאפשרויות הבאות:

המסוף

  1. עוברים לדף BigQuery.

    כניסה ל-BigQuery

    החיבורים מופיעים בפרויקט בקבוצה שנקראת Connections (חיבורים).

  2. בחלונית הימנית, לוחצים על כלי הניתוחים:

    כפתור מודגש לחלונית הסייר.

    אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.

  3. לוחצים על הפרויקט, לוחצים על Connections (חיבורים) ובוחרים חיבור.

  4. בחלונית פרטים, לוחצים על שיתוף כדי לשתף חיבור. לאחר מכן מבצעים את הפעולות הבאות:

    1. בתיבת הדו-שיח Connection permissions, מוסיפים או עורכים חשבונות משתמשים כדי לשתף את החיבור עם חשבונות משתמשים אחרים.

    2. לוחצים על Save.

BQ

אי אפשר לשתף חיבור עם כלי שורת הפקודה של BigQuery. כדי לשתף חיבור, משתמשים במסוף Google Cloud או בשיטה BigQuery Connections API.

API

משתמשים בשיטה projects.locations.connections.setIAM בקטע BigQuery Connections API בארכיטקטורת REST הפניית API ומספקים מופע של משאב policy.

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

המאמרים הבאים