Tech-Tech

株式会社エヌデーデー 技術情報発信ブログ『テックテック』

  • トップ
  • このサイトについて
  • プライバシーポリシー
  • お問い合わせ
  • 社員募集
  • 
  • 

    メニュー

  • 

    サイドバー

  • 

    前へ

  • 

    次へ

  • 

    検索

  •   RSS 
  •   Feedly 
  1. ホーム>
  2. 製品・サービス・ソリューション>
  3. Google Cloud

サービス アカウント キーを作らずに Google ドライブ にアクセスする

2025-07-31

  • Tweet
  • このエントリーをはてなブックマークに追加

エヌデーデー関口です。

Google Cloud のサービスから Google Workspace(GWS) の Google ドライブにファイルを作りたい場合、サービス アカウントを利用するというパターンがあります。

また、サービス アカウントを利用する場合にも、サービスカウントに対してファイル作成先フォルダを直接共有する方法と、ドメイン全体の委任を利用してアクセスさせる方法が考えられます。

しかし、前者は GWS 組織が外部共有を許可していない場合には利用ができません。そこで、今回は後者の方法で Python プログラムから操作する方法をご紹介します。Webを検索して良くでてくる例ではサービス アカウントのキーファイルを作成してアクセスする方法が紹介されていますが、今回の方法ではキーファイルは作成しないので、キーファイル漏洩のリスクを軽減することができます。

Contents
  • 1. Google Cloud で IAM と API を設定する
    • 1.1. IAM 設定
    • 1.2. Google Drive API の有効化
  • 2. GWS にドメイン全体の委任を設定する
  • 3. プログラム解説と実行方法
    • 3.1. サンプル プログラム
    • 3.2. 実行してみる
  • 4. まとめ

Google Cloud で IAM と API を設定する

IAM 設定

  1. Google Cloud でサービス アカウントを作成し、サービス アカウントの OAuth 2 クライアント ID を控えておきます。クライアント ID はすべて数字で構成されたものです(下図)
  2. Google Cloud のプロジェクトで、今回作成するプログラムを実行するユーザー(または上記のものとのは別のサービス アカウント)に「サービス アカウント トークン作成者(roles/iam.serviceAccountTokenCreator)」ロールを付与します
  3. (オプション) Cloud Shell やローカルから、ログインユーザーとしてプログラムを実行する場合は「Service Usage ユーザー(roles/serviceusage.serviceUsageConsumer)」ロールを付与してください

Google Drive API の有効化

Google Cloud 管理コンソールの検索から Google Drive API を探して有効化してください。

GWS にドメイン全体の委任を設定する

GWS でサービス アカウントに対してドメイン全体の委任を設定していきます。

  1. GWS の Google 管理コンソールに特権管理者としてログインして [セキュリティ] > [アクセスとデータ管理] > [API の制御] > [ドメイン全体の委任を管理] に移動します
  2. [新しく追加] をクリックします
  3. サービス アカウントの OAuth2 クライアント ID を入力します
  4. [OAuth のスコープ] で、アプリケーションがアクセスできるスコープを追加します。今回は Google Drive API を利用するので、https://www.googleapis.com/auth/drive とします。スコープは運用に合わせて細かく制限してください。

プログラム解説と実行方法

サンプル プログラム

ここまでサービス アカウントは作成していません。ここから Python プログラムを解説します。

import os
import google.auth
from google.auth import impersonated_credentials
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
from googleapiclient.errors import HttpError


# ドメイン全体の委任を管理に設定したサービス アカウントのメールアドレス
# 実行ユーザーによってなりすまされる側
IMPERSONATED_SA = "<サービス アカウント>@<プロジェクトID>.iam.gserviceaccount.com"

# GWS上でサービス アカウントが委任されるユーザーのメールアドレス
DELEGATED_USER_EMAIL = "delegeted_user@exapmle.com"

# Google Drive API にアクセスするためのスコープ(固定)
SCOPES = ["https://www.googleapis.com/auth/drive"]

# GWS上のフォルダID(URLの folders/ より後ろの文字)
FOLDER_ID = "1Ue2Vxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# 実行しているユーザー(または実行中サービス アカウント)の認証情報を取得する
creds, _ = google.auth.default()

# 実行ユーザーとして、サービス アカウントになりすました認証情報を取得する
# 認証情報には、サービス アカウントがGWS上のユーザーに委任されている情報も付与する
delegated_creds = impersonated_credentials.Credentials(
    source_credentials=creds,
    target_principal=IMPERSONATED_SA,
    subject=DELEGATED_USER_EMAIL,
    target_scopes=SCOPES,
)

# Google Drive API サービスを生成する
service = build("drive", "v3", credentials=delegated_creds)


# ファイルアップロード関数
def upload_file(service, file_path, file_name, mime_type, parent_folder_id=None):
    """
    ローカルファイルからGWSにファイルをアップロードする

    Args:
        service (Any): GWSサービス
        file_path (string): ローカルファイルのパス
        file_name (string): GWS上でのファイル名
        mime_type (string): Mimeタイプ
        parent_folder_id (string): GWS上のアップロード先のフォルダID

    Returns:
        string: 作成したファイルのID

    """
    file_metadata = {'name': file_name}
    if parent_folder_id:
        file_metadata['parents'] = [parent_folder_id]

    media = MediaFileUpload(file_path, mimetype=mime_type, resumable=True)
    try:
        file = service.files().create(
            body=file_metadata, media_body=media, fields='id').execute()
        print(f"File ID: {file.get('id')}")
        return file.get('id')
    except HttpError as error:
        print(f"An error occurred: {error}")
        return None


# ローカルにファイルを作成して、アップロード関数を呼び出す
with open("sample.txt", "w") as f:
    f.write("This is a sample text file.")
upload_file(service, 'sample.txt', 'Sample Document.txt', 'text/plain', FOLDER_ID)
os.remove("sample.txt")

登場人物が複雑になっているので、図で説明します。

  1. プログラムの23行目で下図の実行ユーザーにあたる USER A の認証情報を取得します。
  2. 既に IAM ロールでサービス アカウントのトークンを取得することは許可されているので、図の中心のサービスアカウントとして振る舞うことができます
  3. 27行目がこのプログラムの肝となる部分です。USER A はサービスアカウントとしての認証を取得しているのですが、その際サービス アカウントには GWS のユーザーである USER B の権限をつかってよいということを示しています
  4. その後、取得した認証で Google ドライブ上にファイルを作成する処理をします(60行目)

繰り返しになりますが、27行目で使用している google.auth.impersonated_credentials.Credentials クラスを利用するときに、subject 引数を指定すると OAuth 2.0 認証時の JWT ペイロードの sub フィールドになりすまし先のユーザーを設定することができるというのが重要なポイントです。

なお、Web検索でさまざまな情報を探したのですが、これを実現しているサンプルソースを見つけることができませんでした。Gemini にも質問して、あるタイミングで Gemini が誤ったコードを出力したときに、偶然 subject 引数に出会うことができました!

※権限借用もなりすましも英語で impersonate (なりすまし)なのですが、なりすますタイミングを区別するために言葉をかえて使っています。

実行してみる

上記のプログラムが main.py に保存されている想定で、ローカルまたは、Cloud Shell で実行する場合は次のように行ってください。

# プログラム実行時にユーザー認証を与える設定(ブラウザでのユーザー認証を行います)
# これを実施しないと、サンプル プログラムの23行目で認証情報が取得できません
gcloud auth application-default login

# 仮に権限借用とは別の実行用のサービス アカウントで実行したい場合は次のようにコマンドを実行します
#gcloud auth application-default login --impersonate-service-account=<サービス アカウント>

# 実行するときのプロジェクトを指定しておきます(特にローカル実行の場合)
gcloud auth application-default set-quota-project <プロジェクトID>

# プログラムを実行します
python main.py

まとめ

上記のソースや図で示したとおり、GWS のドメイン全体の委任は、ユーザーの同意を回避してしまう強力な権限を設定次第で与えてしまうので、設定する場合は慎重に検討してください。

その上で、ドメイン全体の委任を利用する場合は、公式ドキュメントの「サービス アカウント キーを管理するためのベスト プラクティス」にもあるとおり、サービス アカウント キーを作成せず、今回紹介した処理で回避しましょう。

Google Cloud,Tips,実装例,機能紹介Google Cloud Platform(GCP),Google Drive,Google Workspace,IAM,Security,Service Account

Posted by 関口 貴生


ロゴ

システム構築のことならエヌデーデーにご相談ください

株式会社エヌデーデーは独立系の SI ベンダーとして柔軟な対応でお客様に最適なシステム構築のご提案をいたします。
ご興味がございましたらお気軽にお問い合わせください。お問い合わせはこちら

よろしければシェアお願いします

  • Twitter
  • Facebook
  • B!Hatena
  • Pocket
  • LINE
  • LINE
BigQuery DTS のイベント ドリブン取込をコンソールから設定する(きれいな削除の方法も)
Next
AWS CDK Conference Japan 2025 に登壇しました『CDKで挑むIdentity Centerの運用改善』
Prev

関連記事

Thumbnail of related posts 137

GKE(Google Kubernetes Engine) Autopilotの限定公開クラスタにIAPを利用してアクセスする

エヌデーデーの関口です。このTech-Techが始まった初期の頃に、限定公開クラ ...

Thumbnail of related posts 024

Cloud Workflows から Cloud Run jobs を実行している時にタイムアウトになる

エヌデーデー関口です。 Cloud Run jobs を使った自動化を行う際、C ...

Thumbnail of related posts 097

話題のサービスGoogle Cloudの「A.I.」を使ってみた!

こんにちはエヌデーデーの関口です。 最近ちまたではGoogle Cloudの新し ...

Thumbnail of related posts 096

【ゼロトラストなRDPクライアント】GCP IAP Desktop とは

こんにちは。エヌデーデーの田中です。 クラウド上の仮想マシンへのアクセス、セキュ ...

技術情報発信ブログTech-Tech

GKEで限定公開クラスタを作成する

はじめに  Google Cloud Platform(GCP)においてGoog ...

人気記事

  • imageVisual Studio Code で Gemini Code Assist エージェントモードを使う
  • imagexこれからのAWS運用に必須?DevOps Agentを使ってみよう!
  • errorCloud Functions(python)でたまにSSLEOFErrorが出てしまって悩んだ話
  • Tech-Techサムネイル【Salesforce】一部の特定ユーザだけに入力規則を適用させてみた
  • TechTech_EC_Haga【Salesforce】入力規則付きの画面フローの作成

新着記事

Thumbnail of new posts 173

2026-01-07 : Google Cloud

構想から実装まで4日!GeminiとThree.jsで社員の「1年の思い出」を銀河にしてみた

2026年を迎え、寒さが厳しい毎日ですが、新しい年が始まると気持ちも新たになりま ...
Thumbnail of new posts 122

2026-01-06 : AWS

AWS re:Invent 2025 参加レポート

エヌデーデーの池ノ上です。 昨年2025/12/1~12/5にラスベガスで開催さ ...
Thumbnail of new posts 019

2025-12-18 : AWS

AWS re:Invent 2025 re:cap LT大会に登壇しました「Route53 高速復旧オプションとは?」

エヌデーデーの池ノ上です。 12/16に開催されたAWS Ambassador ...
Thumbnail of new posts 048

2025-12-16 : AWS

これからのAWS運用に必須?DevOps Agentを使ってみよう!

エヌデーデーの池ノ上です。 re:Invent 2025のMatt Garman ...
Thumbnail of new posts 146

2025-11-13 : AWS

[IAMスペシャル!]Security-JAWS 第39回に登壇しました『CDKにおけるPermissions Boundaryの適用と運用時の課題』

こんにちは、エヌデーデーの池ノ上です。 11/8(土)に開催された Securi ...

カテゴリー

  • AWS
  • Google Cloud
  • Salesforce
  • Tips
  • WebPerformer
  • コラム
  • その他
  • 事例
  • 実装例
  • 技術者向け
  • 機能紹介
  • 経営・管理者向け
  • 製品・サービス・ソリューション

タグ

AIApexApex一括処理AWSBigQueryBlenderCloud FunctionsCloud NextCloud RunCloud SQLCloud StorageCloud VPNCommerce CloudData Transfer ServiceDevOpsDockerDreamforceGeminiGemini APIGoogle Cloud Platform(GCP)Google Compute Engine(GCE)Google Kubernetes Engine(GKE)Identity-Aware Proxy(IAP)JavaJavaScriptJAWSOpenCVPLATEAUPythonSalesforceSPAUI/UXVertex AIVirtual Private Cloud(VPC)Virtual Private Network(VPN)Visual Studio Code(VSCode)WebPerformerやってみたコンテナドローン共創開発生成AI画像処理自動制御超高速開発
Tech-Tech
  • トップ
  • このサイトについて
  • プライバシーポリシー
  • お問い合わせ
  • 社員募集
  • 株式会社エヌデーデー

Copyright © 2026 NDD Corporation All Rights Reserved.

WordPress Luxeritas Theme is provided by "Thought is free".

  • 
    ホーム
  • 
    メニュー
  • 
    上へ
 PAGE TOP