התחברות ל-Cloud SQL

אדמינים ב-BigQuery יכולים ליצור חיבור כדי לגשת לנתוני Cloud SQL. החיבור הזה מאפשר לאנליסטים של נתונים לשאול שאילתות לגבי נתונים ב-Cloud SQL. כדי להתחבר ל-Cloud SQL, צריך לבצע את השלבים הבאים:

  1. יצירת חיבור ל-Cloud SQL
  2. הענקת גישה לסוכן שירות החיבור של BigQuery.

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

  1. בוחרים את הפרויקט שמכיל את מסד הנתונים של Cloud SQL.

    כניסה לדף לבחירת הפרויקט

  2. מפעילים את BigQuery Connection API.

    להפעלת ה-API

  3. מוודאים שלמופע Cloud SQL יש קישור דרך IP ציבורי או חיבור פרטי:
    • כדי לאבטח את המכונות של Cloud SQL, אתם יכולים להוסיף קישוריות של כתובות IP ציבוריות ללא כתובת מורשית. כך המכונה לא נגישה מהאינטרנט הציבורי, אבל נגישה לשאילתות מ-BigQuery.

    • כדי לאפשר ל-BigQuery לגשת לנתונים ב-Cloud SQL דרך חיבור פרטי, צריך להגדיר קישוריות של כתובות IP פרטיות עבור מכונת Cloud SQL חדשה או קיימת, ואז לסמן את תיבת הסימון הפעלת נתיב פרטי. השירות הזה משתמש בנתיב פנימי ישיר במקום בכתובת ה-IP הפרטית בתוך הענן הווירטואלי הפרטי.

  4. כדי לקבל את ההרשאות שנדרשות ליצירת חיבור Cloud SQL, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד אדמין חיבורים של BigQuery (roles/bigquery.connectionAdmin) בפרויקט. להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

יצירת חיבורים ל-Cloud SQL

מומלץ להשתמש בחיבורים כדי לטפל בפרטי הכניסה למסד הנתונים כשמתחברים ל-Cloud SQL. החיבורים מוצפנים ונשמרים בצורה מאובטחת בשירות החיבורים של BigQuery. אם פרטי הכניסה של המשתמש תקפים לנתונים אחרים במקור, אפשר להשתמש שוב בחיבור. לדוגמה, יכול להיות שתוכלו להשתמש בחיבור אחד כדי להריץ שאילתות על כמה מסדי נתונים שנמצאים באותה מכונה של Cloud SQL.

כדי ליצור חיבור Cloud SQL, בוחרים באחת מהאפשרויות הבאות:

המסוף

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

    כניסה ל-BigQuery

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

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

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

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

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

  5. לוחצים על כרטיס הפתרון CloudSQL (MySQL): BigQuery Federation.

  6. בתיבת הדו-שיח מקור נתונים חיצוני, מזינים את הפרטים הבאים:

    • בקטע סוג החיבור, בוחרים את סוג המקור, לדוגמה MySQL או PostgreSQL.
    • בשדה מזהה החיבור, מזינים מזהה למשאב החיבור. מותר להשתמש באותיות, במספרים ובקווים תחתונים. לדוגמה, bq_sql_connection.
    • בשדה מיקום הנתונים, בוחרים מיקום (או אזור) ב-BigQuery שתואם לאזור של מקור הנתונים החיצוני.
    • אופציונלי: בשדה Friendly name (שם ידידותי), מזינים שם ידידותי לחיבור, כמו My connection resource. השם הידידותי יכול להיות כל ערך שיעזור לכם לזהות את משאב הקישור אם תצטרכו לשנות אותו בהמשך.
    • אופציונלי: בשדה Description, מזינים תיאור למשאב החיבור הזה.
    • אופציונלי: הצפנה אם רוצים להשתמש במפתח הצפנה בניהול הלקוח (CMEK) כדי להצפין את פרטי הכניסה, בוחרים באפשרות מפתח הצפנה בניהול הלקוח (CMEK) ואז בוחרים מפתח בניהול הלקוח. אחרת, פרטי הכניסה שלכם מוגנים על ידי ברירת המחדל Google-owned and Google-managed encryption key.
    • אם בחרתם ב-Cloud SQL MySQL או ב-Postgres כסוג החיבור, בשדה שם החיבור של Cloud SQL, מזינים את השם המלא של מופע Cloud SQL, בדרך כלל בפורמט project-id:location-id:instance-id. מזהה המכונה מופיע בדף הפרטים של מכונת Cloud SQL שרוצים לשלוח אליה שאילתה.
    • בשדה שם מסד הנתונים, מזינים את השם של מסד הנתונים.
    • בשדה Database username (שם משתמש במסד הנתונים), מזינים את שם המשתמש במסד הנתונים.
    • בקטע סיסמת מסד הנתונים, מזינים את הסיסמה של מסד הנתונים.

      • אופציונלי: כדי לראות את הסיסמה, לוחצים על הצגת הסיסמה.
  7. לוחצים על יצירת קישור.

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

  9. בחלונית Connection info (פרטי התחברות), מעתיקים את מזהה חשבון השירות לשימוש בשלב הבא.

BQ

מזינים את הפקודה bq mk ומספקים את דגל החיבור: --connection. נדרשים גם הדגלים הבאים:

  • --connection_type
  • --properties
  • --connection_credential
  • --project_id
  • --location

הדגלים הבאים הם אופציונליים:

  • --display_name: השם הידידותי של החיבור.
  • --description: תיאור של החיבור.
  • --kms_key_name: מפתח הצפנה בניהול הלקוח. אם לא מציינים את ההגדרה הזו, פרטי הכניסה מוגנים באמצעות ברירת המחדל Google-owned and Google-managed encryption key.

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

    bq mk --connection --display_name='friendly name' --connection_type=TYPE \
      --properties=PROPERTIES --connection_credential=CREDENTIALS \
      --project_id=PROJECT_ID --location=LOCATION \
      CONNECTION_ID

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

  • TYPE: סוג מקור הנתונים החיצוני.
  • PROPERTIES: הפרמטרים של החיבור שנוצר בפורמט JSON. לדוגמה: --properties='{"param":"param_value"}'. כדי ליצור משאב חיבור, צריך לספק את הפרמטרים instanceID, database ו-type.
  • CREDENTIALS: הפרמטרים username ו-password.
  • PROJECT_ID: מזהה הפרויקט.
  • LOCATION: האזור שבו ממוקם מופע Cloud SQL, או האזור במספר אזורים התואם.
  • CONNECTION_ID: מזהה החיבור.

לדוגמה, הפקודה הבאה יוצרת משאב חיבור חדש בשם my_new_connection (שם ידידותי: My new connection) בפרויקט עם המזהה federation-test.

bq mk --connection --display_name='friendly name' --connection_type='CLOUD_SQL' \
  --properties='{"instanceId":"federation-test:us-central1:mytestsql","database":"mydatabase","type":"MYSQL"}' \
  --connection_credential='{"username":"myusername", "password":"mypassword"}' \
  --project_id=federation-test --location=us my_connection_id

API

ב-BigQuery Connection API, אפשר להפעיל את CreateConnection בתוך ConnectionService כדי ליצור מופע של חיבור. פרטים נוספים זמינים בדף של ספריית הלקוח.

Java

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

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

import com.google.cloud.bigquery.connection.v1.CloudSqlCredential;
import com.google.cloud.bigquery.connection.v1.CloudSqlProperties;
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 a connection with cloud MySql database
public class CreateConnection {

  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";
    String database = "MY_DATABASE";
    String instance = "MY_INSTANCE";
    String instanceLocation = "MY_INSTANCE_LOCATION";
    String username = "MY_USERNAME";
    String password = "MY_PASSWORD";
    String instanceId = String.format("%s:%s:%s", projectId, instanceLocation, instance);
    CloudSqlCredential cloudSqlCredential =
        CloudSqlCredential.newBuilder().setUsername(username).setPassword(password).build();
    CloudSqlProperties cloudSqlProperties =
        CloudSqlProperties.newBuilder()
            .setType(CloudSqlProperties.DatabaseType.MYSQL)
            .setDatabase(database)
            .setInstanceId(instanceId)
            .setCredential(cloudSqlCredential)
            .build();
    Connection connection = Connection.newBuilder().setCloudSql(cloudSqlProperties).build();
    createConnection(projectId, location, connectionId, connection);
  }

  static void createConnection(
      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);
      System.out.println("Connection created successfully :" + response.getName());
    }
  }
}

הענקת גישה לסוכן השירות

סוכן שירות נוצר באופן אוטומטי כשיוצרים את החיבור הראשון ל-Cloud SQL בפרויקט. שם סוכן השירות הוא BigQuery Connection Service Agent. כדי לקבל את מזהה סוכן השירות, צריך לצפות בפרטי החיבור. מזהה סוכן השירות הוא בפורמט הבא:

service-PROJECT_NUMBER@gcp-sa-bigqueryconnection.iam.gserviceaccount.com.

כדי להתחבר ל-Cloud SQL, צריך לתת לחיבור החדש גישת קריאה בלבד ל-Cloud SQL, כדי ש-BigQuery יוכל לגשת לקבצים בשם המשתמשים. לסוכן השירות צריכות להיות ההרשאות הבאות:

  • cloudsql.instances.connect
  • cloudsql.instances.get

אפשר להעניק לסוכן השירות שמשויך לחיבור את תפקיד ה-IAM של לקוח Cloud SQL (roles/cloudsql.client), שמוקצות לו ההרשאות האלה. אם לסוכן השירות כבר יש את ההרשאות הנדרשות, אפשר לדלג על השלבים הבאים.

המסוף

  1. עוברים לדף IAM & Admin.

    כניסה לדף IAM & Admin

  2. לוחצים על Grant Access.

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

  3. בשדה New principals, מזינים את שם סוכן השירות BigQuery Connection Service Agent או את מזהה סוכן השירות שמופיע בפרטי החיבור.

  4. בשדה Select a role (בחירת תפקיד), בוחרים באפשרות Cloud SQL ואז בוחרים באפשרות Cloud SQL Client (לקוח Cloud SQL).

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

gcloud

משתמשים בפקודה gcloud projects add-iam-policy-binding:

gcloud projects add-iam-policy-binding PROJECT_ID --member=serviceAccount:SERVICE_AGENT_ID --role=roles/cloudsql.client

מספקים את הערכים הבאים:

  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • SERVICE_AGENT_ID: המזהה של סוכן השירות שנלקח מפרטי החיבור.

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

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

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

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