Edited at

Directory APIでAppsグループの移行に挑戦する

More than 3 years have passed since last update.


概要

今回、AドメインからBドメインへの完璧なグループの移行を目指す。

Admin SDKに付随するDirectory APIを使用する。

言語はJavaで記述し、Google APIs Client Librariesを用いる。


目標


  • グループの外枠の移行

  • グループのエイリアスの移行

  • グループのメンバーの移行

  • グループのアクセス権限の移行


Appsの設定

まずはじめに、Appsの管理者権限アカウントで管理コンソールにアクセスする。

今回はDomain-Wide Delegationでアクセスするため、[セキュリティ]-[もっと見る]-[詳細設定]より[APIクライアントアクセスを管理する]を選択し、スコープ範囲に次の値を設定する。

https://www.googleapis.com/auth/admin.directory.group

https://www.googleapis.com/auth/admin.directory.group.readonly

以上をAとB両方のドメインで設定しておく。


グループの外枠の移行

まず、Aドメインのグループ一覧を取得する。


Group.java

Groups result = this.directory.groups().list().setMaxResults(50).setDomain(domain).setPageToken(token).execute();


グループ数が多いと1回のリクエストで全て取ってこれないので、発行されたnextPageTokenを次のリクエストに設定し、ループしてグループを取得する必要がある。

グループ名、グループアドレス、グループの説明が取得できるので、グループアドレスのドメインをAからBに置換して、グループを作成してあげれば良い。


Group.java

this.directory.groups().insert(group);


まとめて作成できないので、1つずつ作成していく必要がある。

これでBドメインの外枠の作成ができる。ここで注意しておきたいのが、管理コンソール上から確認できる[タイプ]の存在である。通常、管理コンソールからグループを作成するとき[アクセスレベル]を指定して作成するが、API経由ではそれができない。[公開][チーム][通知のみ][制限付き]から選べるのだが、API経由で作成してしまうとアクセス権限が自動的に設定されてしまい、タイプは[カスタム]でしか作成できない。つまり、Aドメインのグループ権限が初期値のままで、詳細にアクセス設定を行っていない場合は、グループの外枠は手動で作成しなければ完全な移行とは言えない。(アクセス権限を同じように設定してもタイプは[カスタム]のままである。)


グループのエイリアスの移行

グループ一覧の取得とは別に、グループエイリアス一覧を取得するためのAPIが別で用意されているので、グループの取得と同じように使う。


GroupAlias.java

List<Alias> aliases = this.directory.groups().aliases().list(email).execute().getAliases();


グループIDまたはグループアドレスを指定して、そのグループのエイリアス一覧を取得することができる。今回はグループアドレスを指定している。エイリアスが設定されていないグループもあると思うので、nullチェックだけ気をつけてあげれば良い。

あとは、エイリアスのドメインもAからBに置換して、置換後のグループアドレス(移行先であるBドメインのアドレス)を指定して、エイリアスを作成してあげれば良い。


GroupAlias.java

this.directory.groups().aliases().insert(email, alias);


エイリアスもまとめて作成できないので、1つずつ作成していく必要がある。


グループのメンバーの移行

グループ一覧の取得とは別に、グループメンバー一覧を取得するためのAPIが別で用意されているので、グループの取得と同じように使う。


GroupMember.java

Members result = this.directory.members().list(email).setMaxResults(50).setPageToken(token).execute();


メンバーもグループと同じように1回のリクエストで全てのメンバーを取ってこれない場合があるので、nextPageTokenを設定してループして取得する必要がある。メンバーが存在しないグループもあるため、nullチェックに気をつける。

メンバーの場合もう一つ注意が必要で、「このドメインの全てのユーザー」という設定がある。

「このドメイン全てのユーザー」はメンバーの1人として扱われ、あたかも「このドメイン全てのユーザー」というメンバーが所属するかのような扱いになっている。見分け方は単純で、タイプが[CUSTOMER]に設定されているメンバーは「このドメイン全てのユーザー」である。通常のメンバーであれば[User]、グループアドレスであれば[Group]といったタイプが設定されている。

役割も[OWNER][MANAGER][MEMBER]が取得できるので、あとはBドメインのグループアドレスを指定して、メンバーを作成してあげれば良い。


GroupMember.java

this.directory.members().insert(email, member).execute();


「このドメイン全てのユーザー」の場合だけ、アドレスは取得できないので、予めBドメインで「このドメイン全てのユーザー」が所属するグループを作成しておき、idを取得しておく必要がある。そのidを元にmemberオブジェクトを作成し、メンバーの作成を行う必要がある。


グループのアクセス権限の移行

ここまでで、グループの外枠、エイリアス、メンバーと順調に移行してきたが、アクセス権限の移行で躓くことになる。アクセス設定はDirectory APIに属していなく、別枠でGroupssettings APIなるものが用意されている。中身を見てみると、管理コンソールから設定できる項目の半分もなく、全く使い物にならないことがわかる。一部だけAPIで設定し、あとは手動で移行になる。


まとめ

グループの移行は、外枠、エイリアス、メンバーはちゃんとしたAPIが用意されているので、コードで移行することができる。ただし、グループの[タイプ]も移行したい場合は外枠は手動で作成することになる。アクセス設定は、APIこそ用意されているものの、設定できる項目が少ないのでほとんどを手動で移行することになる。


参考

https://support.google.com/a/answer/6261922?hl=ja&ref_topic=1685690

https://support.google.com/a/answer/6261704?hl=ja&ref_topic=1685690