התחברות ל-Blob Storage

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

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

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

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

מכסות

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

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

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

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

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

יצירת אפליקציה בדייר (tenant) ב-Azure

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

Azure Portal

  1. בפורטל Azure, עוברים אל App registrations ולוחצים על New registration.

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

  3. בקטע סוגי חשבונות נתמכים, בוחרים באפשרות חשבונות בספרייה הארגונית הזו בלבד.

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

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

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

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. נכנסים לדף BigQuery במסוף Google Cloud .

    כניסה ל-BigQuery

  2. בחלונית נתונים, לוחצים על הוספת נתונים.

    תיבת הדו-שיח Add data נפתחת.

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

    אפשר גם להזין Azure בשדה Search for data sources.

  4. בקטע Featured data sources, לוחצים על Azure Blob Storage.

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

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

  7. בחלונית External data source, מזינים את הפרטים הבאים:

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

      כדי ללמוד איך לקבל מזהי Azure, קראו את המאמר יצירת אפליקציה בדייר ב-Azure.

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

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

  10. בקטע Connection info, שימו לב לערך של BigQuery Google identity, שהוא המזהה של חשבון השירות. המזהה הזה מיועד לחשבון השירות של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. במאמר יצירת אפליקציה בדייר (tenant) ב-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. בוחרים באפשרות Certificates & secrets > Federated credentials > Add credentials. לאחר מכן, מבצעים את הפעולות הבאות:

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

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

    3. בשדה Subject identifier, מזינים את מזהה 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 REST API:

Azure Portal

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

כדי להוסיף הקצאות תפקידים באמצעות Azure Portal:

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

  2. לוחצים על בקרת גישה (IAM).

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

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

  5. מגדירים את Assign access to לערך User, group, or service principal.

  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

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

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

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

‫API של מיקרוסופט בארכיטקטורת REST

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

כדי לשלוח קריאה ל-Microsoft Graph REST API, צריך לאחזר אסימון OAuth לאפליקציה. מידע נוסף זמין במאמר קבלת גישה בלי משתמש. לאפליקציה ששלחה קריאה ל-Microsoft Graph REST API צריכה להיות הרשאת האפליקציה 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 שרוצים להקצות לחשבון השירות.

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

כדי להקצות תפקיד ל-service principal, שולחים קריאה ל-Microsoft Graph REST API או ל-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"
        }
    }'

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

  • ‫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. בחלונית הימנית, לוחצים על Explorer:

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

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

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

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

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

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

BQ

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

API

משתמשים בשיטה projects.locations.connections.setIAM בקטע של מאמרי העזרה של BigQuery Connections 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");
    }
  }
}

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