概要
ビジネスアカウント(じゃないとダメっぽい)のGoogle Workspaceのグループ(Google Groups)をメーリングリストとして使用する際のメンバー操作をするためにCloud Identity APIをPythonで使ったのでまとめます。サーバー側操作なのでサービスアカウントを使いました。
よく使われる手段はAdmin Directory APIだと思いますが、使用するサービスアカウントに対してドメイン全体の委任が必要になるため、それを避けるためにいろいろと調べた結果Cloud Identity APIで行うことができました。普段GCPを使わないので、用語などがおかしい部分があるかもしれませんが、ご容赦下さい。
準備
それほど複雑な手順はないと思います。サービスアカウントの作成まではできているものとします。使用するサービスアカウントはディフォルトの設定で作成したものです。
- サービスアカウントのプロジェクトに対して
Cloud Identity API
を有効にする - 対象となるグループをGoogle WorkspaceのWebコンソールで作成する
- 対象となるグループに使用するサービスアカウントを追加する
- API操作可能
アカウントおよびグループの準備
サービスアカウントをディフォルト設定で作成します。また、プロジェクトが使用するAPIとしてCloud Identity APIを有効にしておきます。また、サービスアカウントのJSONファイルをダウンロードしておきます。APIでのグループの操作ドキュメントにはグループ管理特権を追加する(roleAssignments)などが書かれていますが、このやり方だと不要でした。
対象となるGoogle GroupsをGoogle WorkspaceのWebコンソールで作成します。必要な状況に応じて権限の設定などを行って下さい。続いて、用意しておいたサービスアカウントのメールアドレスを「マネージャー」として追加します(メンバーの表示や管理ができるロールを付与しておきます)。
実装
環境
- Rocky Linux 9.3 + Python 3.11
- google-api-python-client 2.125.0
- oauth2client 4.1.3
コード
- サービスアカウントのJSONを
service-account.json
とします
メンバーのリストを得る
#!/usr/bin/env python3
import json
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient.discovery import build
SCOPES = ["https://www.googleapis.com/auth/cloud-identity.groups"]
CUSTOMER_ID = "C01xxxxxx"
GROUP_ID = "mygroup@example.com"
# 認証情報の読み込みとサービス構成
keyobj = json.load(open("service-account.json"))
creds = ServiceAccountCredentials.from_json_keyfile_dict(keyobj, SCOPES)
service = build("cloudidentity", "v1", credentials=creds)
groups = service.groups()
# グループ名(groups/01xxxxxxxxxxxxx)をグループアドレスから得る
group_name = None
res = groups.list(parent=f"customers/{CUSTOMER_ID}").execute()
for grp in res["groups"]:
if grp["groupKey"]["id"] == GROUP_ID:
group_name = grp["name"]
break
assert group_name
# メンバーのリストを得る
res = groups.memberships().list(parent=group_name).execute()
for user in res["memberships"]:
print(user)
メンバーをグループに追加する
上のコード中のgroup_nameを使ってます。
NEW_MEMBER_EMAIL = "foo@example.com"
membership = {
"preferredMemberKey": {"id": NEW_MEMBER_EMAIL},
"roles": {"name": "MEMBER"},
}
res = groups.memberships().create(parent=group_name, body=membership).execute()
print(res)
メンバーをグループから削除する
# メンバーのIDが必要となるので検索
res = groups.memberships().list(parent=group_name).execute()
for user in res["memberships"]:
if user["preferredMemberKey"]["id"] == NEW_MEMBER_EMAIL:
# メンバーのIDが得られた
res = groups.memberships().delete(name=user["name"]).execute()
print(res)
break
まとめ
Google WorkspaceのAPIはクセが強いので私はあまり使わないのですが、今回は動的にメーリングリストを操作したかったのでGoogle Groupsを使うことにしてみました。
どなたかのお役に立てば幸いです。
参考
- Groups APIの設定 -- https://cloud.google.com/identity/docs/how-to/setup?hl=ja
- Googleグループのメンバーシップの管理 -- https://cloud.google.com/identity/docs/how-to/memberships-google-groups?hl=ja