Closed7

Google Drive・Gmail → GCS連携をCloud runでい

noznoz
  • まずはGithubのリポジトリを作成する。
  • 下記を参考にしてGithub Actionsを設定する

https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision

  • 定期実行のためCloud Run のjobとしてデプロイする場合は上記にあるyamlにあるservice:job:に、環境変数のSERVICEJOBに置き換える。
  • serviceの場合と違い--concurrencyなど使えない引数がある。

https://github.com/google-github-actions/deploy-cloudrun?tab=readme-ov-file#inputs

noznoz

サービスアカウントとドメイン全体の委任 (Google Workspace環境向け)

Google Workspace(旧 G Suite)をご利用の場合、サービスアカウントとドメイン全体の委任を利用することで、ユーザーの介入なしにGoogle Drive API、Gmail APIを操作できます。

仕組み

  • サービスアカウントの作成: Google Cloud Platform (GCP) プロジェクトで、特別なGoogleアカウントであるサービスアカウントを作成します。

https://support.google.com/a/answer/7378726?hl=ja


  • ドメイン全体の委任の有効化: 作成したサービスアカウントに対して、Google Workspaceドメイン全体の委任を有効にします。これにより、サービスアカウントがドメイン内の任意のユーザーとしてGmail APIにアクセスできるようになります。

  • APIスコープの承認: Google Workspaceの管理者アカウントで、サービスアカウントに必要なGmail APIのスコープ(権限)を承認します。

https://support.google.com/a/answer/162106?hl=ja#zippy=%2Cクライアントに対してドメイン全体の委任を設定する


  • サービスアカウントによるAPI呼び出し: 作成したサービスアカウントの認証情報(秘密鍵など)を使用して、プログラムからAPIを呼び出します。この際、特定ユーザーになりすまして操作を行うことができます。

メリット

  • 完全に自動化された定期実行が可能です。
  • ユーザー個別の認証操作は不要です。
  • 複数のユーザーのメールボックスにアクセスする必要がある場合に有効です。

デメリット

  • Google Workspace環境である必要があります。
  • Google Workspaceの管理者権限が必要です。
  • セキュリティ上の考慮事項が増えるため、適切な権限管理が重要です。

設定手順の概要

  1. Google Cloud Platform (GCP) プロジェクトを作成または選択します。
  2. APIとサービスでAPIを有効にします。
    • drive
    • gmail
  3. サービスアカウントを作成します。
  4. サービスアカウントの認証情報(JSON形式の秘密鍵)をダウンロードします。
  5. Google Workspaceの管理者アカウントで、サービスアカウントに対してドメイン全体の委任を有効にします。
    • https://www.googleapis.com/auth/drive.readonly
    • https://www.googleapis.com/auth/gmail.readonly
  6. 必要なAPIのスコープを承認します。
  7. プログラム内でサービスアカウントの認証情報を使用してAPIを呼び出します。
noznoz

cloud runへのサービスアカウント割り当て

Cloud Run 前提なら認証情報のファイルを含めなくていい?
https://zenn.dev/google_cloud_jp/articles/cloudrun-serviceaccount

デプロイコマンドでCloud Secretsに入れておいたファイルをマウントすることができる

https://cloud.google.com/sdk/gcloud/reference/run/deploy#--clear-secrets

cloud runの定期実行

https://zenn.dev/satohjohn/articles/20ebf8d1bed1d1

デプロイ・実行ごとのサービスアカウント

必要なサービスアカウント

  • GitHub Repository → (GitHub Actions) → Cloud Run Jobのデプロイをサービスアカウント
    • GitHub Actionsを実行するGitHubの実行環境から認証してつかう
  • Cloud Run Jobの実行を行うGCP上の操作をするサービスアカウント
    • Cloud Runの実行環境に割り当てられるサービスアカウント
  • APIの認証情報となる共有ドライブの操作を行うサービスアカウント
    • Goolge Workspace側に登録しておいたサービスアカウント

補足

  • 最初の二つは同じサービスアカウントでよさそう。二つ目にもストレージ管理者などをつけないとCloud Runでインスタンス起動時にバケットへのマウントができずエラーが出る。
  • サービスアカウントは同じだけど、一つ目はWorkload identity、二つ目はdeployコマンドのパラメーターで指定して認証・割当てを実施する。
  • 三つ目はサービスアカウント側に何の権限もいらない。ただ、委任の場合は認証情報のjson形式のファイルを配置する方法以外見つからなかった。SDKパッケージの関数にjson形式のファイル読み込みで認証する関数に委任を宣言する機能がある。jsonはGCPのSecret Managerに保存しておき、GitHub Actionsでデプロイ時に保存しておいたSecretをdeployコマンドの引数で指定することで、コードにcredentialなjsonを含めなくて良くなる
  • 委任のいいところは、処理の実行でいちいちユーザーに認証を依頼する必要がない点。定期実行ができるようになる。
  • ほんとならGoolge Workspaceのユーザーのjsonファイルがあれば、委任もいらないがそんな仕様・機能はなさそう?
  • 委任がないとサービスアカウントは単なるGoogle アカウントで、個人ドライブしか使えない。共有ドライブに登録しておくと使えた。共有ドライブはGoolge workspaceでしか作成できない
  • Google Chat APIはGoogle Workspaceのアカウントじゃないと利用できないらしい。そうなると、操作するGoogle Workspace組織下アカウントでサービスアカウントを揃えておくと管理しやすい気がする。
noznoz

Google Drive API : Google Workspace独自のファイル形式

ダウンロード時の関数はfiles.export_media。10MBまで。

https://developers.google.com/workspace/drive/api/guides/manage-downloads?hl=ja#export-content

出力したい形式をmineTypeで指定。拡張子までつけてくれない><。
Goolge WorkspaceのmineTypeごとに、出力できるmineTypeは下記で確認できる

https://developers.google.com/workspace/drive/api/guides/ref-export-formats?hl=ja

このスクラップは4ヶ月前にクローズされました