まったりするmatayu

ツイートにゴミがついた感じのブログ

Google Cloud PlatformのService account

google adminで新規のgoogle accountを作成するAPIを叩くには,いくつか方法があるのですが,今回はservice accountを利用した方法をやってみました. 実際に叩いたAPIはこれです.

developers.google.com

Guidesの

Prerequisites -> Authorize Requests -> Perform Google Workspace Domain-Wide Delegation of Authority

の順にひとつずつやっていけば,google developer consoleでアプリケーションを作成したり,service accountを作成したり,google adminの方でservice accountを登録したりできます. (変に手順飛ばすと詰まるよ)

コードをみる

今回は具体的なコードをみて使い方を確かめたいと思います.if err != nil {}的なのとコメントは省略してます.

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"

    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"

    admin "google.golang.org/api/admin/directory/v1"
    "google.golang.org/api/option"
)


var ServiceAccountFilePath = "private_key_file.json"

var UsersJson = "./users.json"

var AdminUser = "example@aaa.com"

func CreateDirectoryService() (*admin.Service, error) {
    ctx := context.Background()

    jsonCredentials, _ := ioutil.ReadFile(ServiceAccountFilePath)

    config, _ := google.JWTConfigFromJSON(jsonCredentials, admin.AdminDirectoryUserScope)
    
    config.Subject = AdminUser

    ts := config.TokenSource(ctx)

    srv, _ := admin.NewService(ctx, option.WithTokenSource(ts))
    
    return srv, nil
}

func main() {
    service, _ := CreateDirectoryService()

    file, _ := ioutil.ReadFile("./users.json")
    var users []admin.User
    json.Unmarshal(file, &users)

    for _, user := range users {
        service.Users.Insert(&user).Do()
    }
}

importするやつと,CreateDirectoryService()はここから丸コピです.

developers.google.com

ServiceAccountFilePath

サービスアカウントを作成後,それに割り当てる鍵を作成する手順があると思います. そのときに生成された秘密鍵ファイルをここで指定しています. 秘密鍵ファイルには鍵以外にも認証に必要な情報がまとめて入っています. このファイルが流出するとサービスアカウントがほぼ自由に使えてしまうので取り扱いには注意する必要があります. (具体的にはこのファイルとadminのアカウント名がセットになると使えてしまいます.そのはずです.)

UsersJson

下記のような,作成したいgoogleアカウントの情報が入ったJsonを指定します.

[
    {
        "name": {
            "familyName": "test",
            "givenName": "matac"
        },
        "password": "hogehoge",
        "primaryEmail": "matactest@example.com"
    },
    {
        "name": {
            "familyName": "test2",
            "givenName": "matac"
        },
        "password": "hogehoge",
        "primaryEmail": "matactest2@example.com"
    }
]

APIリファレンスを参照して生成するなり手書きするなり?します.

developers.google.com

AdminUser

developer consoleで指定したユーザーをここで指定してあげます.(基本的には自分のアカウント) consoleで何も指定していなくても,google adminのsuper admin accountは使えるみたいです. (それ以下の権限の場合は未検証)

CreateDirectoryService()

鍵ファイルを利用して,APIのメソッドをたくさん抱えた*admin.Service型を返します. APIを叩くにはこいつを使います. 関数の処理としては,鍵ファイルのJsonからJWTという証明書付きの改竄不可能なJsonを生成し,設定を入力してServiceを生成している感じです. JWTを生成するときに,admin.AdminDirectoryUserScopeスコープを指定していますが, サービスアカウントを使用する時は,ここでの指定とgoogle admin consoleでのスコープの追加が必要になります.(Guidesの手順にあります.)

main()

admin.Serviceインスタンスを生成し,作成したいaccountの情報が記述されたJsonを開いて[]admin.Userのusersを作成しています. 実際にAPIを叩いている部分はservice.Users.Insert(&user).Do()で,Insertメソッドを使用して新規アカウントを作成しています. リファレンスを見れば他にどんなメソッドがあるかわかります.

developers.google.com

利点

GuidesのQuickstartsをやるとわかりますが,途中で認証windowが出てくると思います. それが出てくると自動化する場合などに困ります. そこで鍵ファイルを使用して認証するservice accountを使うことで,認証windowを出さずに処理を完了することができるようになります. また,引き継ぎの際にもservice accountに処理を任せていれば属人化が軽減されるとかなんとか.

あとがき

なんか間違ってたら,遠慮なくコメントに書いてもらえると喜びます. Golangはこんな書き方しない!とかでも.

最近macbookの調子が悪い

大学入学時に購入したMacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)の調子が最近悪くなってきました. バッテリーの持ちが悪くなってきて,Service Recommendedの表示が出てきたのと,restartが絶対に失敗するようになった感じです. まあ,それだけといえばそれだけなんですが, 以前windows pcのSSDが故障した時も「ちょっと挙動がおかしいかな?」くらいだったところからいきなり故障して0GB表示になってしまったことがあったので,早めに修理に出したいですね. 大学の生協で買ったmacbookなのでそこで修理できるかな. 修理はするとしてもやはり寿命は近いと思うし,必要なものなので,新しいmacbookを買うために今お金を貯めています. 2台体制にしておくといろいろ安心になると思います.SSDの容量不足からも開放されます.

初TOEIC

今日は人生で初めてTOEICを受験しました.L&Rの方です.手応えはまあよくわからなかったです. 1ヶ月ちょい前から勉強をはじめたのですが(遅い),少しの単語力の増強とTOEICがどんなテストなのかくらいの知識しかつけられずに今日に至ってしまいました. わからない問題はしっかり飛ばして,時間内に一応全部解けたので時間配分だけはうまくいったってかんじです... あんまり良い結果は期待できないですね. これからについてですが,英語の勉強は単語力は力技であげられると思うのでそこは続けていきたいと思います.文法は気が向いたらやります. またTOEIC受けようかな.

余談

TOEICは沖縄産業支援センターが会場で,母に送り迎えをお願いしました(弟もついてきた). まえから欲しいなぁみたいなことを言っていたのですが,私がTOEICを受けている間になんと七輪を購入していました(¥1,900). 寒い日が続いているのでここで暖かい七輪の画像をお送りします.

f:id:mattari_matayu:20210110232412p:plain
あったか七輪
f:id:mattari_matayu:20210110232458j:plain
ローアン七輪
f:id:mattari_matayu:20210110232545j:plain
手ブレ七輪
f:id:mattari_matayu:20210110232641j:plain
熱燗七輪

さむ

木曜と金曜はブログのテーマ失いがち...

今日は1日中家にいてオンラインで講義を受けていた感じですね.1~5限が埋まっているので動くタイミングがなかなかないです. 講義中はずっと椅子に座ってて,血流が悪くなるのかめちゃくちゃ手足が冷えます. 沖縄の今の気温は10℃くらいで今日は特に寒さが辛かったです.

足についてはあまりにも冷えるのでユニクロヒートテック靴下を買って履いているのですが,なかなか良い感じにあったまります.

f:id:mattari_matayu:20210107231746j:plain
ヒートテック靴下
手はMacBook Pro君が生成する熱である程度は温めることができるので作業中であればいい感じに手足が暖まります.

夕方以降はtoeicの対策とかご飯とかsyskanやって,あとhololiveのライブのアーカイブの最後の方がまだ見れてなかったのでそれをみました.良かった... 何回か見返したいところです.

しっかり体を温めて,体調を崩さないように気をつけていきたいですね. 明日はバイトなので23:30からabemaで放送のゆるキャン△2をみたらすぐ寝て,備えたいと思います.

おやすみなさい.

tmuxどんな時に使うの

研究室のgrowiで入れておくと良いソフトウェアがいくつか紹介されていて,tmuxがぱっと見どういったものなのか分からなかったのでとりあえず使ってみようという感じで使ってみました.

growi.cr.ie.u-ryukyu.ac.jp

tmuxは1つのterminal windowで複数のterminalを立ち上げることができるソフトウェアです.それだけだとなんか複数のwindowを1つのwindowにまとめて管理できるというだけで自分的にはあまり魅力は感じないのですが,tmuxの強いところは「セッションを維持できる」というところにありました.

導入方法

自分はmacbookなので,brewで入れました.簡単!

brew install tmux

後の細かいconfigの設定とかはこの記事とかを参考にしました.

qiita.com

強みの実演

tmuxはtmuxと打つことで起動します.起動するとこんな感じで,terminal windowの中でterminal windowが開きます.ぱっと見,そのようには見えないですが開いています.

f:id:mattari_matayu:20210106104800p:plain
tmux
prefix + cで新しくwindowを作成することができるのでやってみます.(prefixはconfigで設定することができます.デフォルトはctrl+b. 打ち方はprefixを打った後にcを打つ感じです.)
f:id:mattari_matayu:20210106105000p:plain
new
画像上部を見ると2:zshとwindowが増えていることがわかります.この1:zsh2:zshprefix + 1とかprefix + 2とかで切り替えることができます. こんな感じで複数のwindowを1つのterminal window内で管理することができます.

大事なのはここからです.まず適当にtmux上のwindowで作業をしてみます.今回はrustcのbuildをしてみます.

f:id:mattari_matayu:20210106110609p:plain
build
ここで一度terminalを左上のxボタンで終了してみます.そうするとtmuxを使わない場合であればこの作業は中断してしまうことになりますが,もう一度terminalを開いて確かめてみます. tmuxと打って,prefix + sでセッションの一覧を表示します.
f:id:mattari_matayu:20210106111041p:plain
一覧
ここで前回閉じたwindowで使っていた0番のセッションを選択すると,このようにbuildが継続されていることがわかります(十字キー押しちゃったのでちょっと乱れていますが).
f:id:mattari_matayu:20210106111126p:plain
continue
これはwindowを閉じてもセッションが維持されていて,裏で作業が続けられていることを意味します.

自分は作業ログを取りながら作業することがよくありますが,後から見返すと足りない部分があって作業していたterminalを見返したい時があります. tmuxを使えば維持されるセッションに作業内容を丸ごと残すことができるので,間違えてterminal windowを閉じてしまった場合でも見返すことができます.

さらなる強み

これだけでも自分的には嬉しいですが,growiにも書いてある通りtmuxはssh先で使うとさらに強いです. ssh先のサーバーで何かbuildなどの時間のかかる処理をしたい時,通常はその間sshコネクションを維持しなければなりません.万が一build中などにネットワーク障害などでsshが切断された時,buildは失敗してしまいます. しかしtmuxを使うと,維持されるセッションに作業を任せることができるので,途中でsshコネクションを切っても,作業は続行されます.またsshしてtmuxコマンドを打ってセッションを選択してあげればbuild中のwindowに戻ることができます. とても便利です.

あとがき

tmuxはとても便利だと思うので使っていきたいと思います. しかしながら,セッションを維持させるソフトウェアとしてscreenというのもあって(こっちの方がメジャー?),そっちをあんまり使ったことがないのでどちらの方が使いやすいか見極めたいですね. 多分自分の環境ではtmux, そのほかではscreenを使う形になるのかな.自分の環境でどちらを使うかの選択があるかも.どちらにせよ端末多重化の技を覚えることができました.やった.

追記

記事を公開した後に先輩に以下の設定や機能の存在を教えてもらいました.

ステータスバーをカスタム

先ほどまでも,ステータスバーの日付の表示をいじったり,バーの位置を下から上に持ってきたりと少しカスタムされていました. f:id:mattari_matayu:20210106104800p:plain ここからさらに,tmuxのプラグインを利用することでバッテリー残量を表示したり,CPU稼働率を表示したりできるようになります. プラグインTPM(Tmux Plugin Manager)を使用して管理することができます.使用方法は下記リンクを参考にしてください.

github.com

こんな感じになる.シェルスクリプトを自作するか変更すればもっと思い通りのものにできるはず.

f:id:mattari_matayu:20210106144433p:plain
custom

ちなみに設定はこんな感じです.

set-option -g status-right '#{battery_status_bg}Batt: #{battery_icon} #{battery_percentage}#{battery_remain} | Online: #{online_status} | #{cpu_bg_color}CPU:#{cpu_icon}#{cpu_percentage}'

コピーモード

prefix + [でコピーモードに入ることができます.configでsetw -g mode-keys viを設定していれば,コピーモードがviのようになります. 例えばhjklキーでカーソル移動できたり,vでビジュアルモードに入って範囲を選択して,yでヤンクできたりします.

あとがき(再)

ここまでカスタムできると,ただの端末多重化ソフトウェアではなくなってきます. 他のマシンにtmuxをダウンロードして,configを持ってくれば自分の使い慣れた見た目のterminal環境を簡単に持ってくることができるのでiterm2側でステータスバーを作成するよりtmuxで作成した方が良いかも?

エンジンあったまった

冬休み終わった

今日友達を空港に送って,そこで自分の中で冬休みがひと段落しました.例年通りであればここから1週間くらい生活習慣を戻せずに冬休みの余波に乗り続けるのですが, 友達の乗る飛行機が朝の便で,無理やり早起きをしたおかげで明日からは通常の平日を送ることができそうです.感謝. そういえば冬休みに入るまえにやりたいことをいくつか挙げていましたが,予想通り半分できたかなくらいでした. mattari-matayu.hatenablog.com いつもよりたくさんお酒を飲んでみたり,アヒージョ作ってみたり,デイキャン行ってみたり,まあ楽しかったです.

ここからは

  • toeic(10日まで)
  • syskan, compiler

に絞ってやって行こうと思います.相変わらずスローペースが目につきますが,そろそろゼミでも何かできるようにしたいなぁ.

生活習慣

2400までには寝たい!

睡眠不足だとoutputが億劫になって,ブログどころかtweetもしなくなります.それはやばい.

初夢

今年の初夢は昨日の昼寝の時に見ました。

アイデンティティを削除する」みたいな列に並んでいて、列の前の方ではアイデンティティを削除されて顔が真っ暗になって何も見えなくなってる人達が量産されていました。

自分の番が来て、自分も削除されて目の前が何も見えなくなって、次の行程で「何と一緒に生きるか」みたいな選択があって、水とか砂とかなんかよくわからない選択肢の中にあったmicrosoftの選択肢を選んで、なんか緑のボタンを押したらなんか夢から目覚めて、普通に日常生活を始める。

という夢を見ました。夢の中で夢見てました。 最高によくわからない。