GAMでGoogleAppsのユーザー・グループ管理を楽にする

# はじめに

はじめまして、W_Yoshidaです。
~~株式会社リブセンスで、いわゆる情シス的なお仕事をしています。~~
→2017年12月をもって退職致しました。

Qiitaは初投稿でWebの知識もあまりないのでビクビクしてますが、情シスの仕事が少しでも楽になるようなTipsを共有できればと思い、投稿してみました。

#GoogleApps
Google Apps、便利ですよね。
最近「G Suite」という~~ダサい~~名前に変わりましたが、まだまだ一般的ではないので、今回は「GoogleApps」という馴染みのある名称のまま使わせて頂きます。

弊社もGmail、Googleドライブ等を活用していて、Googleさんにおんぶにだっこな状態です。
Googleアカウントひとつで色々なサービスを利用できる反面、アカウント管理はきっちりと行う必要があります。
従業員数が少ないうちは管理画面からポチポチメンテしていても何とかなりますが、従業員が何百人ともなってくると大規模組織変更の度に死にそうな思いをすることになります。

幸いにもGoogleAppsにはGAM（GoogleApps Manager）というコマンドラインベースの管理ツールが用意されていますので、今回はGAMを利用したユーザーやグループの管理について紹介します。

#GAMのインストール
GAMはgithubでリポジトリが公開されています。
https://github.com/jay0lee/GAM
※ちなみにGAMはPythonで書かれています

インストール方法やドキュメント、リファレンスもgithub wikiで公開されていますので、今回の記事での説明は割愛させて頂きます。
https://github.com/jay0lee/GAM/wiki

GAMはAPI経由でGoogle管理コンソールの各種操作を行うので、GoogleAppsの管理対象ドメインに対して管理者権限を持つユーザーで認証を通さなければ、許可される操作がかなり限られてしまいます。
また、認証情報を「client_secrets.json」ファイルに格納する必要がありますが、こちらのファイルがあればGoogleAppsの管理者権限で何でもできてしまいますので、作成後の取り扱いには注意しましょう。

#GAMを使ってみよう
無事にGAMのインストールが完了したら、実際にコマンドを打ってみましょう。

```
>gam info domain

Google Apps Domain: livesense.co.jp
Customer ID: XXXXXXXX
Default Language: ja
Organization Name: 株式会社リブセンス
…
```

正しくインストールが完了していれば、上記のようにGoogleAppsの管理ドメインの情報が取得できるはずです。
他にも、ユーザーの情報を取得したい場合はこんな感じで。

```
>gam info user hoge@livesense.co.jp

User: hoge@livesense.co.jp
First Name: 太郎
Last Name: 山田
…
Creation Time: 2014-03-20T06:35:20.000Z
Last login time: 2016-12-16T07:25:05.000Z
…
Groups: (2)
   ml-developers@livesense.co.jp <ml-developers@livesense.co.jp>
   ml-designers@livesense.co.jp <ml-designers@livesense.co.jp>
```

ユーザーの基本情報や所属するグループなどがずらずらーっと表示されます。
こんな感じで、GAMを使えばコマンドラインからGoogleAppsの情報を取得したり、更新することが可能です。


#GAMでGoogleグループの管理を楽にする
GoogleAppsでは「Googleグループ」というサービスがメーリングリスト（以下ML）として機能しています。
組織変更の度にGoogleグループを作ったりメンバーを変更したりと、かなりメンテナンス負荷が大きいGoogleグループですが、
GAMを利用してメンテナンスを効率化してみたいと思います。
今回は3つのサンプルスクリプトを紹介します。

##1.Googleグループを一括作成する
新しい部署ができる度にその部署のMLを作成する必要があるのですが、GoogleグループをGUIでひとつひとつ作っていくのは大変です。
また、Googleグループは作成後のデフォルト設定だと好ましくない箇所もあるので、それをポチポチ変更していくのも大変ですし、設定漏れの危険もあります。
そこで、あらかじめ作成するMLをCSVに列挙しておいてインポートし、一括でGoogleグループを作成するスクリプトを作ってみます。

Windowsユーザーなので、今回はPowerShellで作成してみました。
※GAMのエラー制御は少し癖がありますので今回は無視しています。ごめんなさい。

まず、作成したいGoogleグループのメールアドレスを列挙したCSVを用意しておきます。

```CreateGoogleAppsGroup.csv
Email
ml-a@livesense.co.jp
ml-b@livesense.co.jp
ml-c@livesense.co.jp
…
```

次に、このCSVをインポートしてGoogleグループを一括作成し、一部プロパティを変更するPowerShellを作ってみます。
※各プロパティの説明はGAMのリファレンスに記載されているので割愛します

```CreateGoogleAppsGroup.ps1
$BasePath = "C:\gam-64\"
cd $BasePath

$CSVFile = "C:\gam-64\CreateGoogleAppsGroup.csv"
$InputCSV = ipcsv $CSVFile -Encoding default

ForEach($r in $InputCSV)
{
    ./gam.exe create group $($r.Email) name $($r.Email)

    #Create直後にUpdateを実行するとコケる場合があるのでインターバルを置く
    Start-Sleep -s 1

    ./gam.exe update group $($r.Email) primary_language ja
    ./gam.exe update group $($r.Email) who_can_join all_in_domain_can_join
    ./gam.exe update group $($r.Email) who_can_view_membership all_members_can_view
    ./gam.exe update group $($r.Email) is_archived false
    ./gam.exe update group $($r.Email) spam_moderation_level allow
    ./gam.exe update group $($r.Email) max_message_bytes 25M
}
```

CSVを用意して上記のシェルを実行するだけで、自動的にGoogleグループが作成されていきます。
らくちん！

##2.Googleグループのメンバーを一括変更する
続いて、Googleグループのメンバーを一括で変更するスクリプトを作成してみます。
インポートするCSVのフォーマットはこんな感じで。

``` ModifyMemberGoogleGroup.csv
|Group|arg1|arg2|Member|
|ml-a@livesense.co.jp|remove|user|hoge1@livesense.co.jp|
|ml-b@livesense.co.jp|add|member|hoge2@livesense.co.jp|
|ml-c@livesense.co.jp|add|member|hoge1@livesense.co.jp|
…
```

MLから除外する場合はarg1～arg2に「remove user」を、
MLに追加する場合はarg1～arg2に「add member」をセットしておきます。
CSVが用意できたら、以下のスクリプトを実行してみましょう。

```ModifyMemberGoogleGroup.ps1
$BasePath = "C:\gam-64\"
cd $BasePath

$CSVFile = "C:\gam-64\ModifyMemberGoogleGroup.csv"
$InputCSV = ipcsv $CSVFile -Encoding default

ForEach($r in $InputCSV)
{
    $param = ("update group " + $($r.Group) + " " + $r.arg1 + " "+ $r.arg1 + " " + $($r.Member))
    ./gam.exe update group $($r.Group) $r.arg1 $r.arg2 $($r.Member)
}
```

PowerShellがNativeCommandErrorを返してくるかもしれませんが、Googleグループのメンバーはきちんと変更されているはずです。
このスクリプトを活用すれば、組織変更や異動の際のMLメンバーメンテが格段に楽になります。

##3.Googleグループのメンバーをcsv出力する
最後に、全Googleグループのメンバーをcsv出力するスクリプトを作成します。

```ExportGoogleGroupMembers.ps1
$BasePath = "C:\gam-64\"
cd $BasePath

#CSVの出力先パス
$CSVFile = "C:\gam-64\ExportGoogleGroupMembers\GoogleGroupMembers_" + (Get-Date).ToString("yyyyMMdd") + ".csv"

#出力したCSVのコピー先（共有フォルダなど）
$PublicCSVFile = "D:\Data\Share\GoogleGroupMembers.csv"

if ((Test-Path $CSVFile) -eq $True) {Remove-Item $CSVFile}
$GroupList = Invoke-Expression "./gam print groups members" | Out-File $CSVFile -Append -Encoding Default

Copy-Item -Path $CSVFile -Destination $PublicCSVFile -Force
```

「MLの転送先に設定されているメンバーが知りたい」という問合せも多いかと思いますので、上記のスクリプトを毎日自動実行するようにジョブスケジューラに仕込んでおけば、自動的に最新のML設定が共有フォルダに公開されるようになります。

#おわりに
今回紹介したGAMやスクリプトを利用すれば、GoogleAppsのメンテナンスが格段に楽になります。
GoogleAppsの管理コンソールで行える操作は基本的にGAMで可能だと思いますが、更新系は思わぬ影響を出してしまう危険性もあるので慎重に試してみてください。
社内にGoogleAppsを導入していて、運用管理負荷が高くて困っている管理者の方の助けになれば幸いです。