データ接続と統合利用可能なコネクターGoogle Drive

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

Google Drive

Google Drive コネクターは、Google Drive 用の Palantir 提供のドライバーです。

新しい Google Drive ソースを作成するには、Palantir 提供のドライバーの標準セットアップフローに沿って進め、以下のセクションで Google Drive 固有の設定とネットワークを構成します。プロパティの完全なリファレンスについては、Google Drive ドライバーの公式ドキュメント ↗ を参照してください。

Google Drive の操作を選択する

必要な結果に基づいて、ソースと操作を選択します。

タスクFoundry での方法結果
ファイルレコードを探索または同期するFiles テーブルを含む Google Drive コネクターID、名前、MIME タイプ、サイズなどのファイルメタデータ。
バッチ同期で1個のファイルを抽出するGoogle Drive コネクターの DownloadFile ストアドプロシージャ出力データセット内の Base64 エンコードされたファイルコンテンツ。
オンデマンドで blob ファイルを読み取るOAuth を利用する別の REST API ソースを使用した Python または TypeScript v2 の FunctionGoogle Drive の alt=media を指定した files.get ↗ によるファイルコンテンツ。
オンデマンドで blob ファイルを作成または置換する同じ REST API ソースを使用した Python または TypeScript v2 の Function外部ファイルを変更する Drive API のアップロード ↗。

Files テーブルの FileData プロパティ ↗ は、ファイルコンテンツのダウンロードをデータセットの列に変換するものではありません。メタデータ同期を使用してファイルIDを見つけ、ID を DownloadFile またはオンデマンドの Function に渡します。Function の場合、呼び出し元のユーザーにはファイルへのアクセス権が必要であり、アウトバウンドアプリケーションに認可されたスコープでその操作が許可されている必要があります。Drive API のアクセス境界を参照してください。

サポートされている機能

機能ステータス
探索🟢 一般提供
バッチ同期🟢 一般提供
インクリメンタル(差分連携)🟢 一般提供
OAuth 2.0 認証🟢 一般提供
テーブルエクスポート🟢 一般提供

設定

以下のプロパティは必須または推奨です。

プロパティ必須説明デフォルト
AuthScheme ↗推奨Google Drive への接続時に使用する認証の種類。OAuthJWT
InitiateOAuth ↗推奨認証および認可されたユーザーの作業中にユーザーアクセスを維持する、OAuth アクセストークンの取得または更新プロセスを指定します。GETANDREFRESH
OAuthClientId ↗推奨カスタム OAuth アプリケーションの作成時に割り当てられたクライアントID(コンシューマー鍵とも呼ばれます)を指定します。この ID により、カスタムアプリケーションが OAuth 認可サーバーに登録されます。—
OAuthClientSecret ↗推奨カスタム OAuth アプリケーションの作成時に割り当てられたクライアントシークレット(コンシューマーシークレットとも呼ばれます)を指定します。このシークレットにより、カスタムアプリケーションが OAuth 認可サーバーに登録されます。—
OAuthJWTCert ↗推奨JWT 証明書ストア。—
OAuthJWTCertType ↗推奨JWT 証明書を含むキーストアの種類。GOOGLEJSONBLOB
OAuthJWTSubject ↗推奨アプリケーションが委任アクセスを要求する対象のユーザーサブジェクト。—

ネットワーク

次のテーブルは、ソースを実行するためにアクセスできる必要があるドメインを示しています。

ドメインごとに、対応するエグレスポリシーを追加します。ソースがオンプレミスでホストされており、Foundry から直接アクセスできない場合は、代わりに Agent プロキシエグレスポリシーを使用します。Agent ホスト自体も、記載されているドメインにアクセスできる必要があります。詳細については、Agent をプロキシとして使用するを参照してください。

ドメイン必須
accounts.google.com常に必須。OAuth に必要
www.googleapis.com常に必須

OAuth 2.0 認証

このコネクターは OAuth 2.0 認証をサポートしています。Palantir 提供のドライバーの OAuth 2.0 ガイダンスに沿って、接続を設定および認可します。

メタデータ同期にサービスアカウントを使用する

メタデータ同期にサービスアカウントを使用するには、次のソースプロパティを設定します。

プロパティ値
AuthSchemeOAuthJWT
InitiateOAuthGETANDREFRESH
OAuthJWTCertTypeGOOGLEJSONBLOB ↗。JSON ドキュメント自体を指定する必要があります。GOOGLEJSON にはファイルパスを指定する必要があります。
OAuthJWTCert暗号化された項目に入力する、サービスアカウントの JSON ドキュメント全体。
OAuthJWTSubjectドメイン全体の委任を設定している場合を除き、未設定のままにします。
Readonlyこのソースがメタデータの読み取りのみを行う場合は true に設定し、ドライバーを SELECT クエリのみに制限します。

JSON ドキュメントの二重引用符で囲まれたキーと、秘密鍵内のエスケープされた改行を保持してください。この資格情報をコードリポジトリに含めないでください。使用していない OAuthClientId と OAuthClientSecret の行をソースフォームから削除します。これらは、このサービスアカウントの設定には含まれません。

テーブルエクスポート

このコネクターはテーブルエクスポートをサポートしています。テーブルエクスポートを設定する方法を参照してください。

バッチ同期でファイルを抽出する

1個のファイルを抽出するには、同期定義内で Google Drive の DownloadFile ストアドプロシージャ ↗ を実行します。

Copied!
1 EXECUTE DownloadFile Id = '<FILE_ID>', LocalFile = ''

LocalFile が空の場合、出力データセットの FileData にファイルコンテンツが含まれ、デフォルトでは Base64 でエンコードされます。下流のデータ変換でバイナリにデコードします。Readonly が未設定、または false に設定されたソースを使用してください。Readonly=true はストアドプロシージャを拒否します ↗。

Drive API で blob ファイルを読み書きする

必要に応じてファイル内容を操作するには、OAuth 2.0 アウトバウンドアプリケーションに基づく別の REST API ソースを設定します。エクスポートとソースのインポートを有効にして、そのソースを Python または TypeScript v2 の Functions リポジトリにインポートします。各例の <SOURCE_RID> を、インポートした REST API ソースの RID に置き換えます。アプリケーションを認可したユーザーの代理として関数を実行します。このソースは、呼び出し元ユーザーの委任されたアクセス権を使用し、メタデータソースのサービスアカウント JSON は再利用しません。実行時と認可の要件については、Functions での OAuth 2.0を参照してください。

REST ソースの接続先は、API ホスト www.googleapis.com:443 と OAuth ホスト accounts.google.com:443 および oauth2.googleapis.com:443 のみに制限してください。

各操作で必要なファイルに応じて、Google Drive のスコープ ↗ を選択します。

操作スコープアクセス範囲
アプリケーションがアクセスできるファイルを読み取るhttps://www.googleapis.com/auth/drive.fileアプリケーションで作成または開いたファイル、またはユーザーが Google Picker を通じてアプリケーション用に選択したファイル。
ユーザーがアクセスできる任意のファイルを読み取るhttps://www.googleapis.com/auth/drive.readonlyユーザーがアクセスできるすべての Drive ファイル。このスコープは制限付きです。
対象となるファイルを作成または置換するhttps://www.googleapis.com/auth/drive.file新しいファイルおよび対象となる既存のファイル。ファイルIDだけでは編集アクセス権は付与されません。

drive.readonly を要求する公開アプリケーションは、Google の制限付きスコープの検証要件 ↗ を満たす必要があります。

Workshop で関数を直接呼び出しても、対話的な認可は開始できません。Workshop で初回の認可を提供するには、別の関数ベースのアクションを使用します。それ以外の場合は、これらの関数を呼び出す前に、ユーザーが同じアウトバウンドアプリケーションを認可する必要があります。ユーザーの OAuth 資格情報を更新できるように、サーバーレスモードを使用します。

1個の blob ファイルを読み取る

blob のバイト列を読み取るには、Google Drive の alt=media を指定した files.get ↗ を使用します。任意のファイルIDに対して使用する前に、ファイルのメタデータとダウンロード可否を確認してください。Google Workspace ネイティブ形式のドキュメントには、サポートされている形式を指定した files.export ↗ が必要です。これらの例は、blob のバイト列を base64 文字列として返します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import base64 import requests from functions.api import function from functions.sources import get_source SOURCE_RID = "<SOURCE_RID>" @function(sources=[SOURCE_RID]) def read_google_drive_blob(file_id: str) -> str: source = get_source(rid=SOURCE_RID) session = requests.Session() proxy = source.get_https_proxy_uri() if proxy: session.proxies.update({"http": proxy, "https": proxy}) session.headers["Authorization"] = ( f"Bearer {source.get_session_credentials().get().access_token}" ) response = session.get( f"https://www.googleapis.com/drive/v3/files/{file_id}", params={"alt": "media", "supportsAllDrives": "true"}, allow_redirects=False, ) if not 200 <= response.status_code < 300: raise RuntimeError(f"Google Drive returned {response.status_code}") return base64.b64encode(response.content).decode("ascii")
Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import { getFetch, getSource } from "@palantir/functions-sources"; const SOURCE_RID = "<SOURCE_RID>"; export const config = { sources: [SOURCE_RID] }; export default async function readGoogleDriveBlob(fileId: string): Promise<string> { const source = await getSource({ rid: SOURCE_RID }); const credentials = await source.sessionCredentials?.get(); if (credentials?.type !== "oauth") throw new Error("Authorize the source first"); const sourceFetch = await getFetch(source); const response = await sourceFetch( `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media&supportsAllDrives=true`, { headers: { Authorization: `Bearer ${credentials.accessToken}` }, redirect: "error", }, ); if (!response.ok) throw new Error(`Google Drive returned ${response.status}`); return Buffer.from(await response.arrayBuffer()).toString("base64"); }

blob ファイルを作成する

書き込みの例では、5 MB までのコンテンツに対してシンプルメディアアップロード ↗ を使用します。これらの例では、中断されたアップロードの再試行や、最終的なバイト列の再読み取りは行いません。簡単に復元できないファイルを書き込む前に、これらの制御を追加してください。

この例では、選択したフォルダーにメタデータを作成してから、バイト列をアップロードします。アップロードに失敗すると、新しいファイルが空のまま残る場合があります。新しいファイルIDのみを返します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 import base64 import requests from functions.api import function from functions.sources import get_source SOURCE_RID = "<SOURCE_RID>" @function(sources=[SOURCE_RID]) def create_google_drive_blob( parent_folder_id: str, file_name: str, mime_type: str, content_base64: str ) -> str: source = get_source(rid=SOURCE_RID) session = requests.Session() proxy = source.get_https_proxy_uri() if proxy: session.proxies.update({"http": proxy, "https": proxy}) session.headers["Authorization"] = ( f"Bearer {source.get_session_credentials().get().access_token}" ) created = session.post( "https://www.googleapis.com/drive/v3/files", json={"name": file_name, "mimeType": mime_type, "parents": [parent_folder_id]}, params={"fields": "id", "supportsAllDrives": "true"}, allow_redirects=False, ) if not 200 <= created.status_code < 300: raise RuntimeError(f"Google Drive returned {created.status_code}") file_id = created.json()["id"] uploaded = session.patch( f"https://www.googleapis.com/upload/drive/v3/files/{file_id}", params={"uploadType": "media", "supportsAllDrives": "true"}, data=base64.b64decode(content_base64), headers={"Content-Type": mime_type}, allow_redirects=False, ) if not 200 <= uploaded.status_code < 300: raise RuntimeError(f"Google Drive returned {uploaded.status_code}") return file_id
Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import { getFetch, getSource } from "@palantir/functions-sources"; const SOURCE_RID = "<SOURCE_RID>"; export const config = { sources: [SOURCE_RID] }; export default async function createGoogleDriveBlob( parentFolderId: string, fileName: string, mimeType: string, contentBase64: string, ): Promise<string> { const source = await getSource({ rid: SOURCE_RID }); const credentials = await source.sessionCredentials?.get(); if (credentials?.type !== "oauth") throw new Error("Authorize the source first"); const sourceFetch = await getFetch(source); const created = await sourceFetch( "https://www.googleapis.com/drive/v3/files?fields=id&supportsAllDrives=true", { method: "POST", headers: { Authorization: `Bearer ${credentials.accessToken}`, "Content-Type": "application/json" }, body: JSON.stringify({ name: fileName, mimeType, parents: [parentFolderId] }), redirect: "error", }, ); if (!created.ok) throw new Error(`Google Drive returned ${created.status}`); const { id } = (await created.json()) as { id: string }; const uploaded = await sourceFetch( `https://www.googleapis.com/upload/drive/v3/files/${id}?uploadType=media&supportsAllDrives=true`, { method: "PATCH", headers: { Authorization: `Bearer ${credentials.accessToken}`, "Content-Type": mimeType }, body: Buffer.from(contentBase64, "base64"), redirect: "error", }, ); if (!uploaded.ok) throw new Error(`Google Drive returned ${uploaded.status}`); return id; }

編集可能な blob ファイルを置換する

この例では、アプリケーションが編集できる場合、指定したファイルIDのファイルを上書きします。置換する意図のあるファイルのみを指定してください。確認、競合チェック、再読み取りは行われません。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import base64 import requests from functions.api import function from functions.sources import get_source SOURCE_RID = "<SOURCE_RID>" @function(sources=[SOURCE_RID]) def replace_google_drive_blob( file_id: str, mime_type: str, content_base64: str ) -> str: source = get_source(rid=SOURCE_RID) session = requests.Session() proxy = source.get_https_proxy_uri() if proxy: session.proxies.update({"http": proxy, "https": proxy}) session.headers["Authorization"] = ( f"Bearer {source.get_session_credentials().get().access_token}" ) response = session.patch( f"https://www.googleapis.com/upload/drive/v3/files/{file_id}", params={"uploadType": "media", "supportsAllDrives": "true"}, data=base64.b64decode(content_base64), headers={"Content-Type": mime_type}, allow_redirects=False, ) if not 200 <= response.status_code < 300: raise RuntimeError(f"Google Drive returned {response.status_code}") return file_id
Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import { getFetch, getSource } from "@palantir/functions-sources"; const SOURCE_RID = "<SOURCE_RID>"; export const config = { sources: [SOURCE_RID] }; export default async function replaceGoogleDriveBlob( fileId: string, mimeType: string, contentBase64: string, ): Promise<string> { const source = await getSource({ rid: SOURCE_RID }); const credentials = await source.sessionCredentials?.get(); if (credentials?.type !== "oauth") throw new Error("Authorize the source first"); const sourceFetch = await getFetch(source); const response = await sourceFetch( `https://www.googleapis.com/upload/drive/v3/files/${fileId}?uploadType=media&supportsAllDrives=true`, { method: "PATCH", headers: { Authorization: `Bearer ${credentials.accessToken}`, "Content-Type": mimeType, }, body: Buffer.from(contentBase64, "base64"), redirect: "error", }, ); if (!response.ok) throw new Error(`Google Drive returned ${response.status}`); return fileId; }