התחברות ל-Cloud SQL

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

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

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

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

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

    להפעלת ה-API

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

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

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

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

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

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

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

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

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

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

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

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

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

      • אופציונלי: כדי לראות את הסיסמה, לוחצים על הצגת הסיסמה.
  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..

כדי להתחבר ל-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.

  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. בחלונית הימנית, לוחצים על 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");
    }
  }
}

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